2012-01-05 36 views
6

Tôi đang cố chèn một bản ghi cơ sở dữ liệu bên trong một vòng lặp trong C#.ExecuteNonQuery bên trong vòng lặp

Nó hoạt động khi tôi cứng mã các giá trị như thế này:

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

Nhưng khi tôi sử dụng các truy vấn parameterised nó không hoạt động - thậm chí nếu tôi cứng mã một giá trị vào các truy vấn parameterised như thế này:

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

Có ai có thể thấy tôi đang đi sai ở đâu không?

Rất cám ơn!

Trả lời

4

Dường như bạn đang thêm vào bộ sưu tập tham số của lệnh nhiều lần. Xóa nó với mỗi lần lặp.

Tôi cũng khuyên bạn nên ném ngoại lệ thực sự để bạn có thể xem vấn đề là gì.

+0

Cảm ơn - Tôi đã gãi đầu của tôi về điều đó đối với TUỔI! Đưa bạn vài giây để tìm ra. Cảm ơn tất cả mọi người. – Dan

+0

@Dan - không sao cả! BTW, tôi khuyên bạn nên cập nhật mã của bạn để sử dụng bố cục thích hợp với câu lệnh 'using' (được đề xuất bởi bài viết của Austin Salonen). –

1

Việc bạn đang làm là thêm tham số lặp vòng lặp. Trong đoạn mã dưới đây, nó thêm tham số một lần và chỉ sửa đổi giá trị của tham số đơn. Hãy thử điều này:

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

Vâng, không thêm các thông số trong vòng lặp, chỉ thiết lập giá trị của nó:

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

// không tiếp tục bổ sung nó trong vòng lặp hoặc

cmd3.Parameters["room_id"].Value = 222; 

Không @needed trong bộ sưu tập các thông số Whne sử dụng SQL Server

3

Đây là chưa được kiểm tra nhưng nên hoạt động thay thế. Chỉ cần thêm nó một lần và liên tục cập nhật giá trị của nó.

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

Là một sang một bên, SqlCommand phải nằm trong một khối using cũng như SqlConnection của bạn. Mã đầy đủ không được hiển thị vì vậy tôi không biết liệu kết nối của bạn có thực sự được thực hiện như cách hay không.

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

} 
4

Tôi đang nói cho bạn một giải pháp đơn giản & để chắc chắn nó hoạt động. Nếu bạn đang sử dụng tham số trong vòng lặp Bạn cần xóa các tham số sau khi thực hiện truy vấn. Vì vậy, bạn có thể sử dụng số

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

Một giải pháp khác cho những người đang xem chuỗi này. Tạo hai kết nối. Một cho vòng lặp của bạn và một để gửi các câu lệnh NonQuery của bạn. Điều này làm việc cho tôi.