这个很好回答的问题,但是我无法解决。我正在尝试使用带有某些参数的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
答案 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文档,了解此方法。