将整数数组传递给SQL Server存储过程

时间:2019-06-08 05:55:46

标签: c# entity-framework asp.net-core

这个很好回答的问题,但是我无法解决。我正在尝试使用带有某些参数的Entity Framework从.NET Core项目中调用存储过程。这些参数之一应该是数组(我通过创建自定义表数据类型来考虑SQL Server中的表类型)类型。我关注了this Stackoverflow link。但是当我尝试执行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 个答案:

答案 0 :(得分:1)

他不正确地使用ExecuteSqlCommand。他不应该使用字符串连接来避免在应用程序中进行SQL注入攻击

_db.ExecuteSqlCommand(“ EXEC SP_GenerateRegularEmployeeSalary @YOUR_PARAM_ON_STOREPROCEDURE”,宗派主义者);

答案 1 :(得分:1)

看上去您使用的ExecuteSqlCommand错误。尝试这种方式,不要在代码中使用字符串连接,以避免应用程序中的SQL Injection攻击。进一步了解here

还要从存储过程中输入正确的预期参数名称: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);

请阅读this文档,了解此方法。