2012-05-22 36 views
7

Tôi đang cố gắng xóa bản ghi từ datagridview rồi cập nhật nó lên máy chủ mysql, tuy nhiên tôi tiếp tục nhận được "Vi phạm đồng thời: DeleteCommand bị ảnh hưởng 0 trong số 1 bản ghi dự kiến ". Tôi đã googled và messed xung quanh với nó một chút và không thể tìm ra một sửa chữa cho tình yêu cũng không tiền. Tôi làm sai ở đâu?Vi phạm đồng thời: DeleteCommand bị ảnh hưởng 0 trong số 1 hồ sơ dự kiến ​​

private void Form1_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      // create a connection to the server 
      connection = new MySqlConnection("SERVER=" + Constants.SERVER + ";" + "DATABASE=" + Constants.DATABASE + ";UID=" + Constants.USERNAME + ";" + "PASSWORD=" + Constants.PASSWORD + ";"); 
      connection.Open(); 

      // create our default handler 
      adapter = new MySqlDataAdapter(); 

      // set the default commands to do 
      adapter.SelectCommand = new MySqlCommand("SELECT * FROM npc_drops", connection); 
      MySqlCommand query = new MySqlCommand("DELETE FROM npc_drops WHERE id = @id", connection); 
      query.Parameters.Add("@id", MySqlDbType.Int32, 10, "id"); 
      adapter.DeleteCommand = query; 

      // create a table to put our data in and fill it with the results 
      table = new DataTable(); 
      adapter.Fill(table); 

      // bind both the data table and the datagridview togeather 
      BindingSource source = new BindingSource(); 
      source.DataSource = table; 
      dataGridView1.DataSource = source; 
      dataGridView1.Columns["id"].Visible = false; 
     } 
     catch (MySqlException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      table = table.GetChanges(); 
      adapter.Update(table); 
     } 
     catch (MySqlException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

Bảng:

CREATE TABLE `npc_drops` (
    `id` INT(10) NULL AUTO_INCREMENT, 
    `npcs` VARCHAR(250) NULL DEFAULT NULL, 
    `rate` INT(3) NULL DEFAULT NULL, 
    `item` INT(5) NULL DEFAULT NULL, 
    `amount` INT(10) NULL DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) 
+0

http: // stackoverflow .com/questions/6111961/mysql-limit-on-delete-statement kiểm tra điều này – BizApps

+0

@BizApps cảm ơn bạn Tôi đã cập nhật dòng đó, nhưng vẫn nhận được cùng một lỗi đáng sợ! –

+0

- bảng của bạn có sử dụng INNODB hoặc MYISAM không? - bạn có đang sử dụng tự động không? – Sebas

Trả lời

0

Một đồng thời trường hợp ngoại lệ có nghĩa là hàng kém đã được thay đổi so với dự kiến, nó thường xảy ra khi bạn có một mệnh đề where trên một bản cập nhật/xóa, giúp ngăn chặn các hành động thực thi. (đây thường là cách hoạt động của đồng thời - bạn kiểm tra LastUpdateDate không thay đổi bằng cách sử dụng một nơi, để xác minh không ai có được giữa hoạt động đọc và viết của bạn) chỉ nơi bạn có trên xóa là "id = @id", vì vậy vấn đề phải là id không tồn tại trong DB khi DeleteCommand được thực hiện.

tôi có thể thấy hai vấn đề với mã của bạn:

  1. Không sử dụng lại "bảng" cho những thay đổi, sử dụng một DataTable mới để thay thế.
  2. bàn gọi.AcceptChanges() sau khi cập nhật, thao tác này sẽ xóa các mục đã xóa khỏi DataTable.

vấn đề có thể là do các beeng hàng xóa giữ và xóa một lần nữa, hoặc một số hoạt động khác xóa các entry trước khi bạn xóa nó (trong trường hợp thứ hai, bạn cần phải xử lý các ngoại lệ đồng thời)

3

Tôi biết đây là một chủ đề cũ, nhưng tôi đã có cùng một vấn đề và tìm ra giải pháp. Có thể ai đó sẽ thấy nó ở đây.

Sử dụng Visual Studio, trong tệp .xsd, có lệnh DELETE trong bộ điều hợp dữ liệu. Lệnh đó ở dạng SQL "DELETE từ bảng trong đó column1 = @ Original_column1 AND column2 = @ Original_column2 AND ..." theo mặc định, nó so sánh tất cả các cột với các giá trị mà chúng có khi bạn đọc db, và sẽ không xóa bản ghi trừ khi tất cả đều khớp. Điều này là để tránh ghi đè lên những thay đổi được thực hiện bởi những người khác giữa khi bạn đọc hồ sơ và khi bạn đang cố gắng thay đổi nó.

Đây là vấn đề. Nếu bất kỳ cột nào trong số đó là NULL trong db, nó sẽ không khớp và lỗi khi bạn mô tả.

PS: Tôi đã không có gì ngoài rắc rối cho phép NULL trong DB khi sử dụng thư viện VS db. LINQ2SQL hoặc bất cứ thứ gì được gọi là ...

3

Ngoại lệ đồng thời xảy ra khi bạn cố gắng xóa bản ghi không khớp trong cơ sở dữ liệu thực, điều này xảy ra với các bản ghi vừa được thêm có cột nhận dạng. giá trị cột nhận dạng ngay lập tức sau khi thêm. để sửa lỗi này, bạn cần

1-để truy xuất giá trị cột nhận dạng từ cơ sở dữ liệu bằng cách thực hiện lệnh SQL rồi cập nhật bản ghi trong tập dữ liệu với giá trị này.

hay
2- bạn có thể chấp nhận thay đổi nào trên bảng dữ liệu cơ sở dữ liệu bằng cách gọi:

table.AcceptChanges(); 

sau đó ngay sau khi bảng nạp tiền cho bạn dữ liệu bằng cách gọi

Adapter.Fill(table); 
+0

Tôi biết điều này là cũ nhưng điều này có thể xảy ra nếu bạn có một đối tượng giao dịch và được gọi là cam kết trên nó trước .AcceptChanges()? (nghĩa là cam kết sẽ sau AccpectChanges) – Hershizer33

Các vấn đề liên quan