C# DbContext ExecuteSqlCommand-表值存储过程

C# DbContext ExecuteSqlCommand-表值存储过程,c#,sql-server,entity-framework,dbcontext,table-valued-parameters,C#,Sql Server,Entity Framework,Dbcontext,Table Valued Parameters,在DbContext之外调用存储过程时遇到问题。存储过程接受一个表值参数 该过程的语法为: ALTER PROCEDURE dbo.SaveResults @resultID int, @positiveResults AS dbo.PositiveResultTypes READONLY AS 我有一个数据表(dtResults),其中填充了表类型的有效值 我的电话号码是: var resultsParam = new SqlParameter("@positiveResults",

在DbContext之外调用存储过程时遇到问题。存储过程接受一个表值参数

该过程的语法为:

ALTER PROCEDURE dbo.SaveResults
  @resultID int,
  @positiveResults AS dbo.PositiveResultTypes READONLY
AS
我有一个数据表(
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.

将resultsparameter设置为参数数组,将两个参数都添加到其中。然后在ExecuteSqlCommand方法中传递参数


显示上述错误是因为向其传递了两个sql参数,而只能向其传递一个sql参数。

我正试图使用所示的db.Database.ExecuteSqlCommand()(EF DbContext)而不是原始的ADO.Net来执行此操作,尽管如果必须这样做,我会这样做。@Patrick我认为您可能需要降到较低的级别,但是,您可以做的一件事是,您可以使用
db.Database.Connection
作为SqlCommand的连接源。我尝试以这种方式传递它:new object[]{resultsParam,new SqlParameter(@resultID),id)})作为第二个参数,但得到了相同的结果。请参见编辑,SQL上的配置文件跟踪是否正确?
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();
}