Передать целочисленный массив в хранимую процедуру SQL Server - PullRequest
0 голосов
/ 08 июня 2019

Ну, это хорошо ответили на вопрос, но я не могу понять это правильно для меня. То, что я пытаюсь сделать, это вызвать хранимую процедуру из проекта .NET Core, используя Entity Framework с некоторыми параметрами. Одним из таких параметров должен быть массив (тип таблицы, который я рассматриваю в SQL Server при создании пользовательского типа данных таблицы). Я следовал по этой ссылке Stackoverflow . Но я получил ошибку при попытке выполнить команду SQL.

Вот мой код:

DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));

foreach (var section in model.VMSectionIds) //model.VMSectionIds contains set of integers
{
    dt.Rows.Add(section);
}

и, наконец, я вызываю хранимую процедуру следующим образом:

var sectiolist = new SqlParameter("@Sections", SqlDbType.Structured)
            {
                TypeName = "[dbo].[SectionList]",
                Value = dt
            };
_db.ExecuteSqlCommand("EXEC [SP_GenerateRegularEmployeeSalary] "+mastermodel.ID+","+ fromdate + "," + todate + ",1," + sectiolist + ""); //don't worry I took care of SQL injection for others parameter

Но это выполнение выдает исключение

SqlException: необходимо объявить скалярную переменную "@Sections"

Я не могу понять, где именно проблема. Вот вызов хранимой процедуры (с некоторым статическим параметром теста) из SQL для ясного понимания моего механизма вызова хранимой процедуры:

DECLARE @data [SectionList]
INSERT @data (Id) VALUES (2, 3)

EXEC [SP_GenerateRegularEmployeeSalary] 2,'20190401','20190430','1',@data

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Выглядит, что вы используете ExecuteSqlCommand неправильно.Попробуйте так и не используйте конкатенацию строк в своем коде, чтобы избежать атак SQL-инъекций в вашем приложении.Подробнее об этом здесь .

Также укажите правильные ожидаемые имена параметров из хранимой процедуры: SP_GenerateRegularEmployeeSalary.

Опция 1

_db.ExecuteSqlCommand("EXEC [SP_GenerateRegularEmployeeSalary] @ID, @FromDate, @ToDate, @Flag, @Sections", 
   new SqlParameter("@ID", mastermodel.ID),
   new SqlParameter("@FromDate", fromdate),
   new SqlParameter("@ToDate", todate),
   new SqlParameter("@Flag", 1),
   new SqlParameter("@Sections", sectiolist));

Вариант 2

_db.ExecuteSqlCommand("EXEC [SP_GenerateRegularEmployeeSalary] @ID = {0}, @FromDate = {1}, @ToDate = {2}, @Flag = 1, @Sections = {4}", mastermodel.ID, fromdate, todate, sectiolist);

Пожалуйста, прочитайте эту документацию по этому методу.

1 голос
/ 08 июня 2019

он использовал ExecuteSqlCommand неправильно. он не должен использовать конкатенацию строк, чтобы избежать атак SQL-инъекций в приложении

_db.ExecuteSqlCommand ("EXEC SP_GenerateRegularEmployeeSalary @YOUR_PARAM_ON_STOREPROCEDURE", sectiolist);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...