2009-08-31 6 views
1

は私の方法だ:どのように私はすべてを読み込むことができ、Sqlcommand.Parametersに数値を追加する方法は?ここ

The SqlParameterCollection only accepts non-null SqlParameter type objects, not Int32 objects.

ので:

public void EjecutarGuardar(string ProcedimientoAlmacenado, object[] Parametros) 
     { 
      SqlConnection Connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); 

      SqlCommand Command = Connection.CreateCommand(); 
      Command.CommandText = ProcedimientoAlmacenado; 
      Command.CommandType = CommandType.StoredProcedure; 
      foreach (object X in Parametros) 
      { 
       Command.Parameters.Add(X); 
      }    

      Connection.Open(); 
      Command.ExecuteNonQuery(); 
      Connection.Close(); 

      Connection.Dispose(); 
     } 

は、foreach文に到達したとき、私はエラーを取得し、私は私のオブジェクト配列PARAMETROSにint型を追加したと言います私のパラメータはこのクラスの外にあり、それらをすべてジェネリック配列に置き、このメソッドに渡してそれを魔法にします。どんな助け?

編集:友人がこのコードを送ってくれましたか?私はそれが何をしているのか分からない。 :あなたはこれを実行する必要がS

protected void CargarParametros(SqlCommand Com, System.Object[] Args) 
     {     
      for (int i = 1; i < Com.Parameters.Count; i++) 
      { 
       SqlParameter P = (SqlParameter)Com.Parameters[i]; 
       if (i <= Args.Length) 
        P.Value = Args[i - 1]; 
       else 
        P.Value = null; 
      } 
     } 
+1

はちょうど 'Parameters.AddWithValue'を使用しない理由は他の質問http://stackoverflow.com/questions/1355643/trouble-using-my-stored-procedure –

答えて

0

のSQLコマンドの例:

は、このコマンドのパラメータを追加するには:

Command.Parameters.Add(new SqlParameter("@YourParameterID", SqlDbType.Int).Value = X); 
+0

に私の応答を参照してください?たくさんのことが簡単になりました。 –

0

また、省略バージョンを使用することができます。 ADO.NETは、それが数だと、あなたがこれを行う場合は、適切なデータ型を挿入します知っている:

Command.Parameters.Add(new SqlParameter("@YourParameterID", 4)); 

など

また、あなたはNOT NULLのデータフィールドにNULLを挿入していないことを確認し、 SqlParameter型にキャスト可能です。

+1

なぜ 'Parameters.AddWithValue'を使うのではないのですか?もっと簡単に.... –

4

使用AddWithValue方法、

string []para={"@eno","@ename","@edate"}; 
object []val={11,"A","1-1-2002"}; 

System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(@""); 
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(); 
cmd.CommandText = "proc_name"; 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Connection = cn; 
for(int i=0;i<para.Length;i++){ 
    cmd.Parameters.AddWithValue(para[i], val[i]); 
} 

cn.Open(); 
cmd.ExecuteNonQuery(); 
cn.Close(); 
1

あなたのSqlCommandオブジェクトは、ストアドプロシージャを包み込みます。これを呼び出すには、ストアドプロシージャに渡す、またはストアドプロシージャから出る各パラメータに対して、SqlParameterのインスタンスを作成する必要があります。単純に値を追加するだけでは、ADO.NETはどの値をどのパラメータに割り当てるのかを知ることはできません。

SqlParameterは次のようなものが含まれています

  • そのデータ型
  • おそらく(サイズ、長さ)の制限
  • おそらく値を

だからあなたに - あなたは自分の名前、データ型、長さなどとその値とそれらのパラメータをキャプチャする必要が

SqlCommand Command = Connection.CreateCommand(); 
Command.CommandText = ProcedimientoAlmacenado; 
Command.CommandType = CommandType.StoredProcedure; 

foreach (object X in Parametros) 
{ 
    SqlParameter param = new SqlParameter(); 
    param.ParameterName = Parametros.Name; 
    // you need to find a way to determine what DATATYPE the 
    // parameter will hold - Int, VarChar etc. 
    param.SqlDbType = SqlDbType.Int; 
    param.Value = Parametros.Value; 

    Command.Parameters.Add(param); 
}   

だから、単に値を追加すると、仕事に行くされていない:R場合は、あなたの文は次のようになります。

マルク・

関連する問題