2014-11-20 41 views
-2
ALTER PROCEDURE [dbo].[AddDepartment] 
    (
    @D_id int, 
    @Catogery nvarchar(50), 
    @viewcat int 
    ) 

    AS 
if(@D_id =-1) 
    insert into Departments(Catogery, viewcat) values(@Catogery,@viewcat) 
    else 
    Update 
    Departments set 
    [email protected], viewcat= @viewcat where [email protected]_id 

數據訪問代碼:我得到這個錯誤過程或函數「AddDepartment」需要參數「@D_id」,但未提供

public int AddDepartment(string D_id, string Catogery, string viewcat) 
{ 
    SqlCommand cmd = new SqlCommand("AddDepartment", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.AddWithValue("@Catogery", Catogery); 
    cmd.Parameters.AddWithValue("@viewcat", viewcat); 
    cmd.Parameters.AddWithValue("@D_id", D_id); 

    return cmd.ExecuteNonQuery(); 
} 
+0

如果輸入值爲空,則會發生該錯誤。我會檢查每個參數值爲null,如果是則使用'DBNull.Value'。 – 2014-11-20 19:33:45

+0

在你的cmd.Parameters.AddWithValue()我會用一些空的coalese類型檢查/賦值你熟悉如何做到這一點..?例如'cmd.Parameters.AddWithValue(「@ Catogery」,Catogery ?? DBNull.Value);' – MethodMan 2014-11-20 19:34:35

+1

你應該看看[我們可以停止使用AddWithValue()了嗎?](http://blogs.msmvps.com/ jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already /)並停止使用'.AddWithValue()' - 它會導致意想不到的結果和令人驚訝的結果... – 2014-11-20 19:55:44

回答

0

存儲過程的參數是int型的,而您所定義你的D_id作爲你的方法中的字符串。 AddiWithValue使用類型推斷,這就是爲什麼你會得到錯誤。你應該在你的方法使用和int類型參數或做:

cmd.Parameters.AddWithValue("@D_id", int.Parse(D_id)); 

參見:AddWithValue is Evil

其他選項是顯式定義類型,如:

cmd.Parameters.Add("@D_id", SqlDbType.Int, 4).Value = D_id; 

cmd.Parameters.Add("@D_id", SqlDbType.Int, 4).Value = int.Parse(D_id); 
+0

我不會考慮它「邪惡'每說'然而,我肯定會驢一些合併任務/檢查其他六個半打其他.. – MethodMan 2014-11-20 19:37:42

+0

值不能爲空。參數名稱:字符串我得到這個錯誤 – 2014-11-20 20:13:32

+0

@boraaihashim,你確定你在你的字符串'D_id'中有一些值,把一個斷點,並在調試器中看到。 – Habib 2014-11-20 20:17:23

相關問題