2014-02-25 32 views
10

我打電話通過實體框架我的SP這樣的參數:實體框架調用存儲過程需要但未提供

NextSuperGroup supergroup = entities.Database.SqlQuery<NextSuperGroup>(
     "super_group @user, @orderbyUnique", 
     new SqlParameter("@user", userName), 
     new SqlParameter("@orderbyUnique", true)).First(); 

而得到錯誤

過程或函數「super_group」預計參數'@orderbyUnique',沒有提供。

正如你在上面看到的,我提供了它。

這裏的存儲過程:

ALTER PROCEDURE [dbo].[super_group] 
    @user nvarchar(30) 
    ,@stepLockDelay varchar(10) = '00:00:00' 
    ,@orderbyUnique bit 
AS 

任何想法,爲什麼我收到此錯誤?

回答

12

它可能應該抱怨的@user參數,以及如果是這種情況,但無論如何 - 嘗試沒有@前綴提供參數:

NextSuperGroup supergroup = entities.Database.SqlQuery<NextSuperGroup>(
    "super_group @user, @orderbyUnique", 
    new SqlParameter("user", userName), 
    new SqlParameter("orderbyUnique", true) 
).First(); 
12

的問題是,EF英孚教育產生SQL對於NULL值不能與我們的實際Sql Server兼容。我使用的是EntityFramework 6,但我認爲自4.3以來實現並沒有改變。

當我打開跟蹤我得到以下輸出執行類似的代碼到你上面後:

exec sp_executesql N'super_group',N'@userName nvarchar(4000)',@userName=default 

問題在於傳遞而不是「NULL」,我們看到來自錯誤的「默認」值來自SQL服務器。如果你想速戰速決,不需要命名參數你可以使用這個:

NextSuperGroup supergroup = entities.Database.SqlQuery<NextSuperGroup>(
    "super_group", 
    userName).First(); 

將會產生這樣的事情,並很好地工作:

exec sp_executesql N'super_group',N'@p0 nvarchar(4000)',@p0=NULL 

對於命名的參數,你需要使用sql參數並將值或SqlValue屬性顯式設置爲DBNull.Value(瘋狂我知道)。類似這樣的:

var parameter = new SqlParameter("userName", SqlDbType.VarChar); 
parameter.SqlValue = username.SqlNullIfEmpty(); // Implemented with an extension method 

希望有所幫助。

+1

完美答案!你用那個做了我的一天! – brothers28

+0

即使在指定SQL參數時也要這樣,但傳入參數的值之一爲null。設置默認值,並且一切都很好。 –

2

我在我的情況下,我通過顯式地將所述類型參數i被傳遞這是在存儲過程中定義爲位

 var paramExcludeExported = new SqlParameter 
     { 
      ParameterName = "ExcludeExported", 
      SqlDbType = SqlDbType.Bit, 
      Value = 0 
     }; 
0

參數沒有通過問題解決了該問題,當多個參數傳遞

我在第一個參數'COMMA'後缺少'SPACE'

var parameter = new List<object>(); 
var param = new SqlParameter("@CategoryID", CategoryID); 
parameter.Add(param); 
param = new SqlParameter("@SubCategoryID", SubCategoryID); 
parameter.Add(param); 

List<tbl_Product> QueryResult = db.Database.SqlQuery<tbl_Product>("EXEC SP_GetProducts @CategoryID, @SubCategoryID ", parameter.ToArray()).ToList();