2014-05-13 23 views
2

錯誤:奇SQL錯誤的int參數轉換爲nvarchar

The parameterized query '(@TeacherID nvarchar(9),@LeaderID nvarchar(9),@Status int,' expects the parameter '@ORatingID', which was not supplied.

存儲過程的參數:

@TeacherID varchar(9), 
@LeaderID varchar(9), 
@Status int, 
@SharedDraft bit, 
@SGrowthRatingID int, 
@ORatingID int, 
@Q1Text varchar(max), 
@Q2Text varchar(max), 
@Q3Text varchar(max), 
@Q4Text varchar(max) 

SQL Server Profiler中顯示:

exec sp_executesql N'usp_EOYASave @TeacherID, @LeaderID, @Status, 
@SharedDraft, @SGrowthRatingID, @ORatingID, @Q1Text, @Q2Text, @Q3Text, 
@Q4Text',N'@TeacherID nvarchar(9),@LeaderID nvarchar(9),@Status int, 
@SharedDraft bit,@SGrowthRatingID int,@ORatingID nvarchar(4000), 
@Q1Text nvarchar(11),@Q2Text nvarchar(4),@Q3Text nvarchar(4000), 
@Q4Textnvarchar(4)',@TeacherID=N'100',@LeaderID=N'1002',@Status=7, 
@SharedDraft=0,@SGrowthRatingID=1,@ORatingID=default, 
@Q1Text=N'test 123 bc',@Q2Text=N'test',@Q3Text=N'',@Q4Text=N'test' 

注意:

在C#10
@ORatingID nvarchar(4000) 
@ORatingID=default 

調用代碼:

db.Database.ExecuteSqlCommand("usp_EOYASave @TeacherID, @LeaderID, @Status, 
     @SharedDraft, @SGrowthRatingID, @ORatingID, 
     @Q1Text, @Q2Text, @Q3Text, @Q4Text", 
    new SqlParameter("TeacherID", EOYRating.CurrentTeacher.ID), 
    new SqlParameter("LeaderID", EOYRating.IsLeader == true ? 
       EOYRating.CurrentLeader.LeaderID : null), 
    new SqlParameter("Status", EOYRating.IsLeader == false ? 
       EOYRating.TeacherStatus : EOYRating.LeaderStatus), 
    new SqlParameter("SharedDraft", sharedDraft), 
    new SqlParameter("ORatingID", EOYRating.IsLeader == true ? 
       (Int32?)EOYRating.OverallRatingValue : null), 
    new SqlParameter("SGrowthRatingID", EOYRating.IsLeader == true ? 
       (Int32?)EOYRating.StudentGrowthRatingValue : null), 
    new SqlParameter("Q1Text", q1Text != null ? q1Text : ""), 
    new SqlParameter("Q2Text", q2Text != null ? q2Text : ""), 
    new SqlParameter("Q3Text", q3Text != null ? q3Text : ""), 
    new SqlParameter("Q4Text", q4Text != null ? q4Text : "")); 

問題

當我運行這段代碼(在SQL Server),並更改 「默認」 爲0或空它的工作原理。

爲什麼它將它轉換(或識別它)爲nvarchar(4000)

更新:

我想這個建議後提出:

new SqlParameter("ORatingID", SqlDbType.Int, 4, ParameterDirection.Input, true, 0, 0, "", DataRowVersion.Current , EOYRating.IsLeader == true ? (Int32?)EOYRating.OverallRatingValue : null), 

我收到了同樣的錯誤消息。

+0

有時不指定參數,使其NULL,而不是將它添加,並試圖將其從DB側設置爲null的數據庫調用,正確的做法,因爲DBNull的是不一樣的東西代碼 - 邊空。但我不是100%確定這件事。 – ErikE

回答

3

也許這個構造函數使用反射來檢查參數的dataype,並且由於該值爲null,它假定它是一個字符串。您可以使用其他構造函數指定sql數據類型。

var param = new SqlParameter("ORatingID", 
    SqlDbType.Int) 

param.Value = EOYRating.IsLeader == true ? (Int32?)EOYRating.OverallRatingValue : (Int32?)null; 
+0

我試過這樣做? <查看我更新的問題> 我收到了同樣的錯誤。 – webdad3

+0

如果您還輸入null,該怎麼辦? –

+0

@ LasseV.Karlsen - 好的建議,補充說。 – EkoostikMartin