2012-01-05 77 views
6

我試圖在C#中的循環內插入數據庫記錄。循環內的ExecuteNonQuery

它工作時,我很難這樣的代碼值:

string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (222,333);"; 
    SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3); 
    sqlConnection3.Open(); 

    for (int i = 0; i < arrItemsPlanner.Length; i++) 
    { 
     try 
      { 
       cmd3.ExecuteNonQuery(); 
      } 
      catch 
      { 
       return "Error: Item could not be saved"; 
      } 
      finally 
      { 
       //Fail 
      } 
     } 

但是當我使用參數化查詢,這是行不通的 - 即使我硬編碼的值到這樣的參數化查詢:

string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);"; 
    SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3); 
    sqlConnection3.Open(); 

    for (int i = 0; i < arrItemsPlanner.Length; i++) 
    { 
     try 
      { 
       cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int); 
       cmd3.Parameters["@room_id"].Value = 222; 
       cmd3.ExecuteNonQuery(); 
      } 
      catch 
      { 
       return "Error: Item could not be saved"; 
      } 
      finally 
      { 
       //Fail 
      } 
     } 

任何人都可以看到我要去哪裏錯了嗎?

非常感謝!

回答

4

它看起來像你一遍又一遍地添加到命令的參數集。每次迭代清除它。

我也建議拋出實際的異常,以便看到問題所在。

+0

謝謝 - 我一直在爲AGES撓撓我的腦袋!需要幾秒鐘才能弄清楚。非常感謝大家。 – Dan 2012-01-05 17:59:37

+0

@丹 - 沒問題!順便說一句,我會建議更新你的代碼,以使用正確的處置與「使用」聲明(如奧斯汀沙龍的帖子所建議的)。 – 2012-01-06 04:31:48

1

你在做什麼是添加一個循環迭代參數。在下面的代碼中,它添加了一次參數,並且修改了單個參數的值。試試這個:

string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);"; 
SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3); 
cmd3.Parameters.Add("@room_id", SqlDbType.Int); 

sqlConnection3.Open(); 

for (int i = 0; i < arrItemsPlanner.Length; i++) 
{ 
    try 
     { 
      cmd3.Parameters["@room_id"].Value = 222; 
      cmd3.ExecuteNonQuery(); 
     } 
     catch 
     { 
      return "Error: Item could not be saved"; 
     } 
     finally 
     { 
      //Fail 
     } 
    } 
1

是,不要在循環中添加參數,只將其值設置:

string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);"; 
SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3); 
sqlConnection3.Open(); 

cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int); 

for (int i = 0; i < arrItemsPlanner.Length; i++) 
{ 
    try 
     { 
      cmd3.Parameters["@room_id"].Value = 222; 
      cmd3.ExecuteNonQuery(); 
     } 
     catch 
     { 
      return "Error: Item could not be saved"; 
     } 
     finally 
     { 
      //Fail 
     } 
    } 
1
cmd3.Parameters.Add("room_id", System.Data.SqlDbType.Int); 

//不保留在循環要麼

將它添加
cmd3.Parameters["room_id"].Value = 222; 

在參數收集無需@needed whne使用SQL Server

3

這是未經測試,但應該作爲替代。只需添加一次,並不斷更新其價值。

.... 
cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int); 

for (int i = 0; i < arrItemsPlanner.Length; i++) 
{ 
    try 
     { 
      cmd3.Parameters["@room_id"].Value = 222; 
      cmd3.ExecuteNonQuery(); 
     } 
.... 

順便說一句,你SqlCommand應該是一個using塊內以及您SqlConnection。完整的代碼沒有顯示,所以我不知道你的連接是否實際完成。

using (var conn = new SqlConnection(...)) 
using (var cmd = new SqlCommand(..., conn)) 
{ 

} 
4

我告訴你一個簡單的解決方案&肯定它的工作原理。 如果您在循環中使用參數您需要在執行查詢後清除參數。 所以,你可以使用

cmd3.executeNonQuery(); 
cmd3.parameters.clear(); 
0

對於那些誰在看這個線程另一種解決方案。創建兩個連接。一個用於循環,另一個用於發送NonQuery語句。這對我有效。