Недопустимая ошибка: количество параметров не соответствует количеству значений для хранимой процедуры

#c# #.net #sql-server #server

#c# #.net #sql-сервер #сервер

Вопрос:

База данных.LoadDataSet некорректно работает с базой данных SQL Server 2017.

Мы переносим нашу базу данных с SQL Server 2008 R2 на SQL Server 2017. База данных создана в режиме совместимости 100 — для совместимости с SQL Server 2008 R2. Я застрял с некоторым старым кодом, который выдает неинформативное исключение.

Проблема с базой данных команд.LoadDataSet, который вызывает хранимую процедуру, которая принимает 2 параметра. С SQL Server 2008 R2 это работает просто отлично, но с SQL Server 2017 это не удается.Ошибка заключается в том, что недостаточно параметров SQL. Но самое смешное, что передано достаточно параметров. Я пытаюсь найти решение, сравнил старую базу данных с новой, и свойства, похоже, одинаковы для базы данных и хранимой процедуры.

Версия .NET CLR в пуле приложений IIS: 2.0

Версия целевой платформы .NET Framework: 3.5

 //.NET C# code:
DataSet dataset;
Database db = DatabaseFactory.CreateDatabase();
db.LoadDataSet(
"USP_Proc", 
dataset, 
new string[] {"Titles", "Config", "Teams"}, 
Request.QueryString["Type"], 
int.Parse(Request.QueryString["BranchID"]));


//SQL Procedure:

SET ANSI_NULLS OFF
SET QUOTED_IDENTIFIER ON

ALTER PROCEDURE [dbo].[USP_Proc]
@BranchType VARCHAR (15), @BranchId [dbo].[ID]
AS
SELECT 
  TitleId, Title 
FROM vOperatorTitles
ORDER BY Title

IF @BranchType = 'L'
BEGIN
  SELECT OperatorTeams 
  FROM tCustomerConfig 
  WHERE CustomerId = @BranchId

  SELECT TeamId, TeamName 
  FROM tTeams
  WHERE CustomerId = @BranchId
END

SELECT count(*) as ISSTAGEMANAGEMENT   
FROM tfeature_branch 
WHERE
   branchid=@BranchId and 
   systemside=@BranchType and 
   featureid = (select featureid from tfeature where featurecode= 'somecode')









Expected: there is no errors (as on environments which use old SQL Server)

Actual: 
When calling db.LoadDataSet, there is an error:

[InvalidOperationException: The number of parameters does not match number of values for stored procedure.]
   Microsoft.Practices.EnterpriseLibrary.Data.Database.GetStoredProcCommand(String storedProcedureName, Object[] parameterValues)  384
   Microsoft.Practices.EnterpriseLibrary.Data.Database.LoadDataSet(String storedProcedureName, DataSet dataSet, String[] tableNames, Object[] parameterValues)  42
   SupportConsole.Pagelets.OperatorAdd.Page_Load(Object sender, EventArgs e) in E:SourcePageletsOperatorAdd.ascx.cs:88
   System.Web.UI.Control.OnLoad(EventArgs e)  132
   System.Web.UI.Control.LoadRecursive()  66
   System.Web.UI.Control.LoadRecursive()  191
   System.Web.UI.Control.LoadRecursive()  191
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)  2428
  

Комментарии:

1. Я не знаком с этим .LoadDataSet методом, где это задокументировано?

2. Чему равно значение Request.QueryString["Type"] ? Пожалуйста, проверьте Immediate Window ?

3. Это задокументировано здесь: learn.microsoft.com/en-us/previous-versions/msp-n-p /…

4. Значения: Тип: ‘L’, идентификатор ветви: 3

5. можете ли вы запустить sp напрямую, используя exec команду: exec [dbo].[USP_Proc] BranchType = 'L', BranchId=3

Ответ №1:

Ваши параметры должны быть в массиве

 db.LoadDataSet("USP_Proc", 
    dataset, 
    new string[] {"Titles", "Config", "Teams"}, 
    new object[] { Request.QueryString["Type"], int.Parse(Request.QueryString        
                  ["BranchID"])});
  

Комментарии:

1. К сожалению, это не помогло. Все та же проблема.