2009-08-31 30 views
1

這裏是我的方法:如何將一個數字添加到Sqlcommand.Parameters?

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(); 
     } 

說我增加了一個int到我的對象數組PARAMETROS,當它到達foreach語句我得到一個錯誤:

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

所以,我怎麼能加載所有的我的參數在這個類之外,然後將它們全部放入一個通用數組中,並將它傳遞給這個方法來做它的魔力。任何幫助?

編輯:朋友發給我這個代碼,它會工作嗎?我不明白它在做什麼。 :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

見我的其他問題http://stackoverflow.com/questions/1355643/trouble-using-my-stored-procedure – 2009-08-31 03:43:10

回答

0

你需要這樣做:

SQL命令例如:

要添加參數此命令:

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

爲什麼不直接使用'Parameters.AddWithValue'響應?似乎更容易.... – 2009-08-31 05:26:00

0

您還可以使用縮寫形式。 ADO.NET會知道這是一個數字,如果你這樣做會插入適當的數據類型:

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

此外,還要確保你沒有插入NULL到NOT NULL數據域,並且可以隱式轉換爲鍵入SqlParameter。

+1

爲什麼不只是使用'Parameters.AddWithValue' ??似乎很容易.... – 2009-08-31 05:26:39

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包含喜歡的東西:

  • 一個名稱
  • 其數據類型
  • 可能限制(大小,長度)
  • 和可能的

所以在你R情形,你的說法應該是這個樣子:

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); 
}   

所以,只是增加值是行不通的 - 你需要捕捉那些參數,包括其名稱,數據類型,長度等,以及它們的值。

馬克

相關問題