2013-09-26 28 views
0

我遇到了一個錯誤沒有意義的問題。立即窗口說該參數不會丟失,但調試器說它缺失。 CP沒有人爲此答覆。SqlDataReader需要一個不會丟失的參數

Error: Procedure or function 'cpWeeklyPharmDataintDrvr' expects parameter '@companyID', which was not supplied.

即時窗口:

cmd.Parameters["@companyID"].Value 1356 

SqlCommand cmd = new SqlCommand("cpWeeklyPharmDataintDrvr", sqlC); 

sqlC.Open(); 

cmd.Parameters.Add(new SqlParameter("@companyID", SqlDbType.Int)).Value = Master.CompanyId; 
cmd.Parameters.Add(new SqlParameter("@sStartDate", SqlDbType.NVarChar, 30)).Value = Master.StartDate; 
cmd.Parameters.Add(new SqlParameter("@sEndDate", SqlDbType.NVarChar, 30)).Value = Master.EndDate; 

if (Master.RegionId > 0) 
    cmd.Parameters.Add(new SqlParameter("@region", SqlDbType.Int)).Value = Master.RegionId; 

if (Master.DistrictId > 0) 
    cmd.Parameters.Add(new SqlParameter("@district", SqlDbType.Int)).Value = Master.DistrictId; 

if (Master.StoreId . 0) 
    cmd.Parameters.Add(new SqlParameter("@store", SqlDbType.NVarChar)).Value = Master.StoreId.ToString(); 

SqlDataReader dR = cmd.ExecuteReader(); // This is where error occurs. 
+3

只有當Master.CompanyID大於零時,纔會將參數添加到集合中。但是SP不喜歡這種選擇性。應始終指定此參數。 – Steve

+0

修改了代碼,但仍然收到相同的錯誤。即時窗口報告該值確實沒有丟失。 – Spitfire19

+2

是否有任何先前的參數被跳過?你也指定你的命令是一個存儲過程? – lincolnk

回答

1

你的if語句內添加參數報表。如果如果失敗,則不做任何事情,但程序將失敗。添加一個引發錯誤的else語句,或者將參數設置爲默認值(如果不存在)。

同時檢查Master.CompanyId是否爲空。這可能會導致錯誤。最後,Add方法可能無法正常工作。

試試AddWithValue。

0

您是否嘗試運行SQL分析器來查看傳遞給存儲過程的參數是什麼?你可以看到這些參數是否與你在數據庫中的邏輯一致。 (您沒有在問題中發帖)

此外,您還需要將commandtype指定爲StoredProcedure。

+0

我現在有一個臨時的解決方案,我正在使用一個stringbuilder來構建我的SQL命令,它現在正在工作,但我寧願使用這種樣式。我一定會使用史蒂夫的建議。 我使用Visual Studio,Intellitrace會告訴我什麼存儲過程運行,但沒有說什麼參數正在傳遞。 我不認爲我有任何實際使用SQL分析器的經驗。 – Spitfire19

+0

謝謝,將cmd設置爲Stored Procedure修復它。 – Spitfire19

0

我可以觀察到兩個東西

的CommandType的
  1. 類型,將其設置爲StoredProcedures在公司ID

  2. Null值。

嘗試傳遞一些硬編碼的值,看看是否有用。在有些時候它表示相同。並且在你的sp中聲明你的參數爲@companyId int =null,這樣它也可以接受空值。

相關問題