2013-02-01 80 views
11

我試圖將數據插入到一個SQL Server數據庫的參數,但我得到的錯誤存儲過程或函數希望這是無法通過調用存儲過程提供

*過程或函數「插入」需要參數'@Emp_no',未提供*

我的存儲過程被稱爲Insertion。我已經徹底檢查過了,沒有任何參數丟失,我也通過使用標籤進行了檢查。標籤顯示的價值,但我不知道爲什麼我得到錯誤。

我的代碼是

try 
    { 
     SqlCommand cmd = new SqlCommand(); 
     cmd.Parameters.Clear(); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandText = "Insertion"; 
     cmd.Connection = con; 

     if (rdb_Male.Checked) 
     { 
      int @Emp_no = Convert.ToInt32(txtbx_Empno.Text); 
      string @Emp_name = txtbx_Emp_Name.Text; 
      double @phone = Convert.ToDouble(txtbx_Phone.Text); 
      string @Email = txtbx_Email.Text; 
      string @Password = txtbx_Pwd.Text; 
      string @Gender = rdb_Male.Text; 
      DateTime @Dob = Convert.ToDateTime(dob); 
      string @Address = txtbx_Address.Text; 
      string @Designation = txtbx_Designation.Text; 
      string @Qualification = txtbx_Qual.Text; 
      double @Experience = Convert.ToDouble(txtbx_Exp.Text); 
      double @Salary = Convert.ToDouble(txtbx_Sal.Text); 
      DateTime @Doj = Convert.ToDateTime(doj); 
     } 
     else if (rdb_Female.Checked) 
     { 
      int @Emp_no = Convert.ToInt32(txtbx_Empno.Text); 
      string @Emp_name = txtbx_Emp_Name.Text; 
      double @phone = Convert.ToDouble(txtbx_Phone.Text); 
      string @Email = txtbx_Email.Text; 
      string @Password = txtbx_Pwd.Text; 
      string @Gender = rdb_Female.Text; 
      DateTime @Dob = Convert.ToDateTime(dob); 
      string @Address = txtbx_Address.Text; 
      string @Designation = txtbx_Designation.Text; 
      string @Qualification = txtbx_Qual.Text; 
      double @Experience = Convert.ToDouble(txtbx_Exp.Text); 
      double @Salary = Convert.ToDouble(txtbx_Sal.Text); 
      DateTime @Doj = Convert.ToDateTime(doj); 
     } 

     if (con.State==ConnectionState.Closed) 
      con.Open(); 

     LABEL.Text = txtbx_Empno.Text; 

     cmd.ExecuteNonQuery(); 

     lbl_Errormsg.Visible = true; 
     lbl_Errormsg.Text = "Record Inserted Successfully"; 

     con.Close(); 
    } 

和存儲過程是

ALTER PROCEDURE dbo.Insertion 
(
@Emp_no int, 
@Emp_name varchar(30), 
@phone numeric(10,0), 
@Email varchar(30), 
@Password varchar(10), 
@Gender varchar(6), 
@Dob date, 
@Address varchar(100), 
@Designation varchar(20), 
@Qualification varchar(20), 
@Experience numeric(4,2), 
@Salary numeric(10,2), 
@Doj date 
) 
AS 
Begin 
    Insert into Register (Emp_no, Emp_name, phone, Email, Password, Gender, Dob, Address, Designation, Qualification, Experience, Salary, Doj) 
    Values(@Emp_no, @Emp_name, @phone, @Email, @Password, @Gender, @Dob, @Address, @Designation, @Qualification, @Experience, @Salary, @Doj) 
End 

請幫助我。提前致謝。

+2

您需要添加參數... – sgeddes

+5

當您不指定命令類型時也會發生此異常。不適用於你的情況。 – black

+0

它適用於我的情況,所以很大謝謝你! :) –

回答

11

您需要使用SqlCommand.Parameters.AddWithValue

cmd.Parameters.AddWithValue("@ParameterName", value); 

SqlCommand.Parameters.Add用於其他的數據類型:

cmd.Parameters.Add("@ParameterName", SqlDbType.Int, 5); 
cmd.Parameters["@ParameterName"].Value = value; 

SqlCommand.Parameters.AddWithValue取代的Add曖昧重載使用一個字符串和對象參數。有關更多信息,請參閱MSDN

+0

不要使用SQLCommand.Parameters.Add()它的棄用 –

+0

不,AddWithValue取代由於含糊不清而帶有字符串和對象參數的Add重載。您仍然可以將Add用於其他目的。 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx – Sumo

+0

http://stackoverflow.com/questions/9999751/difference-between-parameters-add-and-參數addwithvalue看到這也 –

1

您需要使用這樣的:

cmd.Parameters.AddWithValue("@Emp_no", @Emp_no); 
cmd.Parameters.AddWithValue("@Emp_name", @Emp_name); 
cmd.Parameters.AddWithValue("@phone", @phone); 
cmd.Parameters.AddWithValue("@Email", @Email); 
cmd.Parameters.AddWithValue("@Password", @Password); 
cmd.Parameters.AddWithValue("@Gender", @Gender); 
cmd.Parameters.AddWithValue("@Dob", @Dob); 
cmd.Parameters.AddWithValue("@Address", @Address); 
cmd.Parameters.AddWithValue("@Designation", @Designation); 
cmd.Parameters.AddWithValue("@Experience", @Experience); 
cmd.Parameters.AddWithValue("@Salary", @Salary); 
cmd.Parameters.AddWithValue("@Doj", @Doj); 

否則,它會拋出異常的每個參數。

+0

哦!我忘了寫這個。謝謝。這已經解決了我的問題。 – Pritam

+0

@Pritam,好酷。 –

+0

是的,我看到這個例外。現在它工作正常。 – Pritam

3

您的插入存儲過程期待@Emp_no(以及約15個其他參數)。如果不傳遞參數,則無法調用存儲過程。

看看這個網站以供參考:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

無處不在,你要定義變量,使用Parameters.AddWithValue代替:

cmd.Parameters.AddWithValue("@Emp_no ", Convert.ToInt32(txtbx_Empno.Text)); 
+0

謝謝。我忘記添加'cmd.Parameters.AddWithValue(「@ Emp_no」,Convert.ToInt32(txtbx_Empno.Text));'。現在它工作正常。 – Pritam

14

只是一個單純的頭腦,它可能會爲別人節省很多時間尋找靈魂。如果您在此處遵循了建議(如使用AddWithValue爲了傳遞參數),並且您已驗證所有內容,但仍收到「未提供」錯誤消息,請檢查是否已設置命令對象的CommandType屬性到CommandType.StoredProcedure。

不設置此屬性招致相同的消息,相信我!希望它能幫助別人。

+2

希望我能給這個+10。看不出代碼有什麼問題,並且稍後頭部劃傷,這就是原因。我確實知道這一點,但忘記了這個提醒是一個巨大的時間節省 –

0

對於其他人:我剛剛面臨同樣的錯誤,因爲我的一個參數爲空。我們需要檢查它是否如下:

command.Parameters.AddWithValue("Features", (object)productDb.Features ?? DBNull.Value); 
相關問題