我遇到了从DbContext调用存储过程的问题。存储过程接受表值参数。
该程序的语法是:
ALTER PROCEDURE dbo.SaveResults
@resultID int,
@positiveResults AS dbo.PositiveResultTypes READONLY
AS
我有一个DataTable(dtResults
)填充了表类型的有效值。
我的主叫代码是:
var resultsParam = new SqlParameter("@positiveResults", SqlDbType.Structured);
resultsParam.Value = dtResults;
resultsParam.TypeName = "PositiveResultTypes";
db.Database.ExecuteSqlCommand(
"dbo.SaveResults",
new SqlParameter("@resultID", id),
resultsParam);
这是失败的:
程序或函数'SaveResults'需要参数'@resultID', 没有提供。
变量id
有效,而不是null
此处(int
,值1
)。
我尝试在调用代码中将语法更改为“dbo.SaveResults @resultID @positiveResults
”,但结果没有变化。
为什么没有看到这个参数?
修改
SQL事件探查器显示此参数正确传递...
declare @p3 dbo.PositiveResultTypes
insert into @p3 values(N'1')
insert into @p3 values(N'4')
insert into @p3 values(N'6')
exec sp_executesql N'dbo.SaveResults',N'@positiveResults [PositiveResultTypes] READONLY,@resultID int',@positiveResults=@p3,@resultID=1
但是,EXEC的这种语法在某种程度上是不正确的。当我对数据库执行此操作时,我得到相同的结果:
(1 row(s) affected)
(1 row(s) affected)
(1 row(s) affected)
Msg 201, Level 16, State 4, Procedure SaveResults, Line 0
Procedure or function 'SaveResults' expects parameter '@resultID', which was not supplied.
答案 0 :(得分:1)
using (SqlConnection con = new SqlConnection(cs))
{
// Configure the SqlCommand and SqlParameter.
SqlCommand sqlCmd = new SqlCommand("dbo.SaveResults", con);
sqlCmd.CommandType = CommandType.StoredProcedure;
SqlParameter tvpParam = sqlCmd.Parameters.AddWithValue("@positiveResults", dtResults);
//tell compiler that we are passing TVP
tvpParam.SqlDbType = SqlDbType.Structured;
sqlCmd.Parameters.Add(new SqlParameter("@resultID", id));
sqlCmd.ExecuteNonQuery();
}
答案 1 :(得分:0)
将resultsparameter作为参数数组,将两个参数添加到其中。然后在ExecuteSqlCommand方法中传递参数。
显示上面提到的错误是因为有两个sql参数传递给它,而只能传递一个sql参数。