1

我有一個調用存儲過程關閉我的DbContext的問題。存儲過程需要一個表值參數。DbContext ExecuteSqlCommand - 表值存儲過程

該程序的語法是:

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是有效的,而不是在這裏nullint,值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',@[email protected],@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. 

回答

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(); 
} 
+0

我想這樣做與db.Database.ExecuteSqlCommand()(EF DbContext)如圖所示,而不是原始的ADO.Net,但如果我必須去那樣我會。 – Patrick 2014-09-23 18:06:26

+0

@Patrick我認爲你可能需要下降到較低的水平,但你可以做的一件事是你可以使用'db.Database.Connection'作爲SqlCommand的連接源。 – 2014-09-23 19:01:16

0

製作resultsparameter作爲參數數組,無論你的參數添加到它。然後在ExecuteSqlCommand方法中傳遞參數。

提到的錯誤顯示,因爲兩個sql參數傳遞給它,而只有一個sql參數可以傳遞給它。

+0

我試圖以這種方式傳遞它:new object [] {resultsParam,new SqlParameter(「@ resultID」,id)})作爲第二個參數,但得到了相同的結果。請參閱編輯,SQL上的配置文件跟蹤看起來正確 – Patrick 2014-09-23 18:23:47