2013-07-17 37 views
1

我有這樣的代碼下面應該從DataGridView dtg_ksluzby數據保存到SQL表KLISLUZ,但它說:SqlCommand的INSERT INTO從DataGridView到SQL數據庫表

嵌入語句不能信息聲明或標記statemnt。

for(int i=0; i< dtg_ksluzby.Rows.Count;i++) 
    SqlCommand prikaz2 = new SqlCommand("INSERT INTO klisluz'" + dtg_ksluzby.Rows[i].Cells["text"].Value +"', '" + dtg_ksluzby.Rows[i].Cells["pocet"].Value +"'",spojeni); 
    prikaz2.ExecuteNonQuery(); 
+4

你打開SQL注入。使用參數。 –

回答

4

首先,你應該總是使用parameterized queries,這類字符串連接的是開放的SQL Injection攻擊。

試試這個;

for(int i=0; i< dtg_ksluzby.Rows.Count;i++) 
{ 
    using(SqlCommand prikaz2 = new SqlCommand("INSERT INTO klisluz VALUES(@p1, @p2)",spojeni)) 
    { 
     prikaz2.Parameters.AddWithValue("@p1", dtg_ksluzby.Rows[i].Cells["text"].Value); 
     prikaz2.Parameters.AddWithValue("@p2", dtg_ksluzby.Rows[i].Cells["pocet"].Value); 
     prikaz2.ExecuteNonQuery(); 
    } 
} 

作爲添pointed,您可以重複使用,而您只需要使用SqlParameterCollection.Clear()方法你執行你的命令後你的所有值相同SqlCommand的替代品。

贊;

using(SqlCommand prikaz2 = new SqlCommand("INSERT INTO klisluz VALUES(@p1, @p2)",spojeni)) 
{ 
    for(int i=0; i< dtg_ksluzby.Rows.Count;i++) 
    { 
      prikaz2.Parameters.AddWithValue("@p1", dtg_ksluzby.Rows[i].Cells["text"].Value); 
      prikaz2.Parameters.AddWithValue("@p2", dtg_ksluzby.Rows[i].Cells["pocet"].Value); 
      prikaz2.ExecuteNonQuery(); 
      prikaz2.Parameters.Clear(); 
    } 
} 
+2

+1 ...或重複使用相同的'SqlCommand'並首先調用'prikaz2.Parameters.Clear'。 –

+0

@TimSchmelter謝謝Tim。添加到我的答案。 –

2

您所查詢的是錯誤的(也使用Parametrized Queries

固定查詢:

"INSERT INTO klisluz values('" + dtg_ksluzby.Rows[i].Cells["text"].Value +"', '" + dtg_ksluzby.Rows[i].Cells["pocet"].Value +"')" 

固定碼:

using (SqlCommand prikaz2 = new SqlCommand("INSERT INTO klisluz values('@val1', '@val2')",spojeni)) 
{ 
    for (int i = 0; i < dtg_ksluzby.Rows.Count; i++) 
    { 
    prikaz2.Parameters.Clear(); 
    prikaz2.Parameters.AddWithValue("@val1", dtg_ksluzby.Rows[i].Cells["text"].Value); 
    prikaz2.Parameters.AddWithValue("@val2", dtg_ksluzby.Rows[i].Cells["pocet"].Value); 
    prikaz2.ExecuteNonQuery(); 
    } 
} 
+0

我修正了他的查詢,並展示瞭如何正確使用參數,他的循環沒有問題,但我認爲這會更好地回答:) – gzaxx