2014-02-18 23 views
5

我正面臨着從c#中的dataTable對象動態創建SQL插入語句的一些問題。我想知道製作它的最佳實踐。以下是我的代碼片段,至今我已嘗試過。如何從c#中的Datatable動態構建插入命令

String sqlCommandInsert = "INSERT INTO dbo.RAW_DATA("; 
String sqlCommandValue = ""; 
foreach (DataColumn dataColumn in dataTable.Columns) 
{ 
    sqlCommandInsert += dataColumn + ","; 
} 
sqlCommandInsert += sqlCommandInsert.TrimEnd(','); 

sqlCommandInsert += ") VALUE("; 

for (int i = 0; i < dataTable.Rows.Count; i++) 
{ 
    sqlCommandValue += "'" + dataTable.Rows[i].ItemArray[i] + "',"; 
} 

var insertCommand = sqlCommandInsert; 
sqlCommandValue = sqlCommandValue.TrimEnd(','); 

var command = insertCommand + sqlCommandValue + ")"; 
dataContext.Database.ExecuteSqlCommand(command); 

任何建議,將不勝感激:) 關心。

+2

最好的做法是不這樣做,在所有的,而是建立與正確的參數設置正確的精確指揮。 (順便說一下,它是VALUES) – Steve

回答

8

使用VALUES而不是VALUE。除此之外,你應該總是使用SQL參數:

string columns = string.Join("," 
    , dataTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName)); 
string values = string.Join("," 
    , dataTable.Columns.Cast<DataColumn>().Select(c => string.Format("@{0}", c.ColumnName))); 
String sqlCommandInsert = string.Format("INSERT INTO dbo.RAW_DATA({0}) VALUES ({1})" , columns, values); 

using(var con = new SqlConnection("ConnectionString")) 
using (var cmd = new SqlCommand(sqlCommandInsert, con)) 
{ 
    con.Open(); 
    foreach (DataRow row in dataTable.Rows) 
    { 
     cmd.Parameters.Clear(); 
     foreach (DataColumn col in dataTable.Columns) 
      cmd.Parameters.AddWithValue("@" + col.ColumnName, row[col]); 
     int inserted = cmd.ExecuteNonQuery(); 
    } 
} 
3
## Dynamic Update Query from Datatable with Npgsql## 
    public string UpdateExecute(DataTable dataTable, string TableName) 
{ 

    NpgsqlCommand cmd = null; 
    string Result = String.Empty; 

    try 
    {    

     if (dataTable.Columns.Contains("skinData")) dataTable.Columns.Remove("skinData"); 
     string columns = string.Join(",", dataTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName)); 

     string values = string.Join(",", dataTable.Columns.Cast<DataColumn>().Select(c => string.Format("@{0}", c.ColumnName))); 

     StringBuilder sqlCommandInsert = new StringBuilder(); 
     sqlCommandInsert.Append("Update " + TableName + " Set "); 

     string[] TabCol = columns.Split(','); 
     string[] TabVal = values.Split(','); 

     for (int i = 0; i < TabCol.Length; i++) 
     { 
      for (int j = 0; j < TabVal.Length; j++) 
      { 
       sqlCommandInsert.Append(TabCol[i] +" = "+ TabVal[i] + ","); 
       break; 
      } 
     } 
     string NpgsqlCommandUpdate= sqlCommandInsert.ToString().TrimEnd(','); 
     NpgsqlCommandUpdate += (" where " + TabCol[0] + "=" + TabVal[0]); 


     using (var con = new NpgsqlConnection("Server=localhost;Port=5432;uid=uapp;pwd=Password;database=Test;")) 
     { 
      con.Open(); 
      foreach (DataRow row in dataTable.Rows) 
      { 
       cmd = new NpgsqlCommand(NpgsqlCommandUpdate.ToString(), con); 
       cmd.Parameters.Clear(); 
       foreach (DataColumn col in dataTable.Columns) 
        cmd.Parameters.AddWithValue("@" + col.ColumnName, row[col]); 

       Result = cmd.ExecuteNonQuery().ToString(); 
      } 
     } 
    } 
    catch (Exception) 
    { 
     Result = "-1"; 
    } 
    return Result; 
} 
+0

你好,歡迎來到Stack Overflow。請解釋你的答案在另一個答案中的改進如何,因爲它不是很明顯。 – bernie

+2

我的答案不是直接的,因爲它的動態更新語句,答案以前是插入語句,所以我想如果有人來這裏搜索動態插入語句,那麼他/她也可能動態地需要更新語句。 – vsharma10286