DbContext ExecuteSqlCommand - 表值存储过程

时间:2014-09-23 17:40:27

标签: c# sql-server entity-framework dbcontext table-valued-parameters

我遇到了从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.

2 个答案:

答案 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参数。