2009-02-25 33 views
12

Vì vậy, tôi đã làm việc này tuần trước. Ít nhất, tôi nghĩ rằng tôi đã làm! DataGridView UpdateBản cập nhật yêu cầu UpdateCommand hợp lệ khi chuyển bộ sưu tập DataRow với các hàng đã sửa đổi

Sau đó, tôi bắt đầu làm việc trên dự án một lần nữa hôm nay và đang nhận được

"Cập nhật đòi hỏi một UpdateCommand hợp lệ khi thông qua bộ sưu tập DataRow với hàng sửa đổi."

On

scDB.SSIS_Configurations_StagingDataTable table = (scDB.SSIS_Configurations_StagingDataTable)stagingGrid.DataSource; 
myStagingTableAdapter.Update(table); 

Các StagingTableAdapter có một truy vấn bổ sung mà mất 'lọc' như một tham số. Điều đó đã được sử dụng để điền vào GridView. Trong trình hướng dẫn để tạo truy vấn đó, tôi thấy 'cập nhật đã được tạo'. Tôi thấy rằng hầu hết các bài đăng có lỗi này yêu cầu một câu lệnh cập nhật được tạo bằng trình tạo lệnh. Tôi làm gì?

Trả lời

6

Lỗi khá hoàn toàn: Bộ điều hợp cần có câu lệnh SQL Update hợp lệ. Các nhà thiết kế Dataset và CommandBuilder sẽ tạo ra những thứ này cho bạn, nhưng cũng không có gì sai với việc tạo thủ công một chút SQL.

Dù sao, bạn sẽ phải xác minh (trình gỡ lỗi) rằng câu lệnh Cập nhật vẫn được định cấu hình và thực tế nó là gì. Nó có thể là nhiều hơn một SQL hơn là một vấn đề C#.

Chỉnh sửa: công cụ Trình tạo lệnh sẽ chỉ xử lý thẳng, bảng đơn, Chọn câu lệnh. Sử dụng một tham gia hoặc bất cứ điều gì ưa thích và bạn đang ở trên của riêng bạn.

+0

Tại sao không có điều này được đề cập ở đây? http://msdn.microsoft.com/en-us/library/ms233819(VS.80).aspx – Sam

+0

Trang đó là về việc sử dụng Bộ điều hợp, không phải về việc thiết lập bộ điều hợp. Dưới đây là một số phụ đề khác: http://msdn.microsoft.com/en-us/library/bz9tthwx(VS.80).aspx –

0

Từ trang này:

Lưu ý Nếu có đủ thông tin trong truy vấn chính, lệnh InsertCommand, UpdateCommand, và DeleteCommand được tạo ra theo mặc định khi TableAdapter được tạo ra. Nếu truy vấn chính của TableAdapter có nhiều hơn một câu lệnh SELECT bảng đơn, nó là có thể nhà thiết kế sẽ không thể tạo ra các InsertCommand, UpdateCommand và DeleteCommand. Nếu các lệnh này không được tạo, bạn có thể gặp lỗi khi thực hiện phương thức TableAdapter.Update .

Vì vậy, từ những gì tôi có thể nói, các báo cáo này nên được tạo ra. Tôi đang sử dụng một cái bàn duy nhất.

+1

Xin lưu ý rằng các câu lệnh 'UPDATE' và' DELETE' không thể được tạo ra cho các bảng không có khóa chính. Chỉ cần chạy vào cùng một vấn đề, trong đó PK bị bỏ qua trên bảng cơ sở dữ liệu và TableAdapter-Wizard không thể tạo lệnh 'UPDATE', gây ra hành vi đã nêu ở trên. – froeschli

12

Tôi gặp vấn đề tương tự như Sam. Tôi đã làm việc mã mà chỉ đột nhiên không còn làm việc. Tôi không biết khi nào tôi viết nó, nhưng nó phải được tự động suy ra lệnh cập nhật, và sau đó ngừng làm việc đó. Có lẽ một gói dịch vụ từ MS ở giữa các phiên bản mà chúng tôi không bao giờ nhận thấy. Dù sao, giải pháp mà tôi gặp phải là sử dụng một (trong trường hợp của tôi cho oracle) một OracleCommandBuilder lấy DataAdapter (sau khi gọi fill) làm tham số cho constructor và sau đó gọi GetUpdateCommand() và gán nó cho UpdateCommand trên DataAdapter.

pseudocode: 

DataAdapter da = new DataAdapter(...) 
... 
da.Fill(); 
da.UpdateCommand = new OracleCommandBuilder(da).GetUpdateCommand(); 
... 
da.Update(); 
+0

Điều này làm việc cho tôi với SQLiteCommandBuilder (và tất nhiên tôi đã sử dụng SQLiteDataAdapter). – styfle

+0

Điều này cũng làm việc cho tôi bằng cách sử dụng Postgresql và NpgsqlDataAdapter – Kvothe

+1

Có thể dư thừa, nhưng điều này làm việc với SqlCommandBuilder và SqlDataAdapter quá – user230910

6

workaround Dan làm việc cho tôi, nhưng thay vì OracleCommandBuilder Tôi chỉ có thể sử dụng SqlCommandBuilder:

DataAdapter da = new DataAdapter(...) 
... 
da.Fill(); 
da.UpdateCommand = new SqlCommandBuilder(da).GetUpdateCommand(); 
... 
da.Update(); 
16

Thông báo này cũng sẽ được hiển thị xảy ra khi bạn không có một khóa chính xác định trên bảng bạn đang cập nhật.

+0

Và bạn có thể thêm hàng mới ngay cả với khóa chính - đó là Cập nhật/Xóa không thành công – MrTelly

0

Tôi vừa trải nghiệm cùng một vấn đề và câu trả lời của Jason đã làm việc cho tôi: Tôi quên gán khóa chính cho bảng của mình.

Chỉ cần thêm một lời nhắc thêm: Sau khi sửa vấn đề trong bảng, khi quay lại Visual Studio, trong tệp .xsd chứa tập dữ liệu, hãy đảm bảo xóa bảng gốc và thêm lại từ Server Explorer hoặc Database Explorer. Nếu không, lỗi sẽ vẫn tồn tại.

0

Tôi cũng gặp phải sự cố tương tự và nhận giải pháp sau. Thử nó.

private void btnSave_Click(object sender, EventArgs e) 
{ 
    ConnStr = "Data Source=FIN03;Initial Catalog=CmsTest;Integrated Security=True"; 
    cn = new SqlConnection(ConnStr); 
    cn.Open(); 
    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = cn; 
    mytran = cn.BeginTransaction(IsolationLevel.Serializable); 

    cmd.Transaction = mytran; 
    try 
    { 

     scb = new SqlCommandBuilder(da); 
     da.Update(ds, "tblworker"); 
     mytran.Commit(); 
     MessageBox.Show("Data update successfully"); 

    } 
    catch (Exception err) 
    { 

      mytran.Rollback(); 

      MessageBox.Show(err.Message.ToString());   
    } 
} 
+0

Mã của bạn không được định dạng đúng . hãy định dạng nó. –

+0

SAM cảm ơn bạn đã trả lời nguyên vẹn của bạn. Tôi sẽ làm điều đó vào ngày khác. – MulugetaLegesse

0

Bạn phải luôn có trường cột chính được xác định. Nếu không thì vấn đề sẽ luôn tồn tại. SqlCommandBuilder sẽ không giúp bạn nếu bạn không có một trường khóa chính.

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