2013-02-01 10 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); 

または他のデータ型のための:

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- parameters-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、ok cool。 –

+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

0

"廃止されたAddメソッドは1つで、パラメータ名の文字列と値のオブジェクトを受け入れるメソッドです。注意したように、このシナリオではAddWithValueを呼び出す必要があります。

http://social.msdn.microsoft.com/Forums/en-US/15bb16a4-0cf1-4289-b677-3b9d98f09298/parametersaddwithvalue-output-parameter-in-adonet-2?forum=adodotnetdataproviders

は、すべてのParameter.Add方法は減価償却されるわけではありません。 OUTPUTパラメータをどうやって作るのですか?これにはParameter.Addを使用する必要があります。

14

ちょうどヘッドアップ、それは誰かが魂の検索に多くの時間を節約するかもしれません。パラメータを渡すためにAddWithValueを使用するのと同じように、推奨事項に従っていて、すべてが確認されていて、まだエラーメッセージ "未指定"が表示されている場合は、コマンドオブジェクトのCommandTypeプロパティが設定されているかどうかを確認してくださいCommandType.StoredProcedureに移動します。

このプロパティを設定しないと、同じメッセージが表示されます。誰かを助けることを願っています。

+2

願い私はこの+10を与えることができます。コードに何か間違って見えることはありませんでした。私はこれを知っていたが、ちょうど忘れてしまったので、このリマインダは巨大な時間節約者だ –

0

その他:私のパラメータの1つがnullだったので、同じエラーに直面しました。

command.Parameters.AddWithValue("Features", (object)productDb.Features ?? DBNull.Value); 
関連する問題