Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: Lỗi không cập nhật dữ liệu datatable trở lại database.

  1. #1
    Ngày gia nhập
    04 2009
    Nơi ở
    Hà Nội
    Bài viết
    733

    Mặc định Lỗi không cập nhật dữ liệu datatable trở lại database.

    Chào các bạn, mình có đoạn code chương trình sử dụng datatable. Sau khi mình lấy toàn bộ dữ liệu của 1 bảng trong csdl về rùi, mình có thực hiện việc duyệt các row,column và change dữ liệu. Sau đó mình thực hiện code để update nó quay trở lại database nhưng lúc vào sql server để xem thì vẫn như cũ, còn khi mình test chạy trên chương trình thì datatable đó đã thay đổi dữ liệu như ý mình. Không hiểu phương thức update quay trở lại có vấn đề chăng? Đây là code của mình.
    Ý định của mình là việc thực hiện việc so sánh dữ liệu giữa 2 table, nếu khác nhau thì cập nhật lại.

    Visual C# Code:
    1.  for (i = 0; i<dtXoa.Rows.Count;i++)
    2.             {
    3.                 for (j = 0; j<dtResult.Rows.Count;j++)
    4.                 {
    5.                     if (dtXoa.Rows[i][0].ToString() == dtResult.Rows[j][0].ToString())
    6.                     {
    7.                         //dtXoa.Rows[i].Delete();  
    8.                         //Neu nhu trung ID thi thuc hien viec duyet cac column va tim ra du lieu khac nhau
    9.                         //Neu khac thi gan sang cho dtXoa.                      
    10.                                
    11.                             for (int n = 1; n < dtXoa.Columns.Count; n++)
    12.                             {
    13.                                 if ( dtXoa.Rows[0][n].ToString() != dtResult.Rows[0][n].ToString())
    14.                                 {
    15.                                     dtXoa.Rows[0][n] = dtResult.Rows[0][n];                                    
    16.                                 }
    17.                             }                          
    18.                     }                    
    19.                      
    20.                 }
    21.                
    22.             }
    23. //Cap nhat lai toan bo tren database.
    24.             dtXoa.AcceptChanges();            
    25.            
    26.             dataGridView2.DataSource = dtXoa; //Xem tren gridview thì dữ liệu đã thay đổi như ý muốn.
    27.             SqlCommandBuilder s = new SqlCommandBuilder(adapter2);
    28.             adapter2.Update(dtXoa);
    29.             return true;
    Không hiểu vì sao nó không update quay trở lại csdl nhỉ? Các bạn coi giúp mình với.
    Hỏi một câu thì chỉ dốt trong chốc lát.Nhưng nếu không hỏi thì bạn sẽ dốt suốt đời.

  2. #2
    Ngày gia nhập
    05 2011
    Bài viết
    68

    Trích dẫn Nguyên bản được gửi bởi snake_programmer Xem bài viết
    Chào các bạn, mình có đoạn code chương trình sử dụng datatable. Sau khi mình lấy toàn bộ dữ liệu của 1 bảng trong csdl về rùi, mình có thực hiện việc duyệt các row,column và change dữ liệu. Sau đó mình thực hiện code để update nó quay trở lại database nhưng lúc vào sql server để xem thì vẫn như cũ, còn khi mình test chạy trên chương trình thì datatable đó đã thay đổi dữ liệu như ý mình. Không hiểu phương thức update quay trở lại có vấn đề chăng? Đây là code của mình.
    Ý định của mình là việc thực hiện việc so sánh dữ liệu giữa 2 table, nếu khác nhau thì cập nhật lại.

    Visual C# Code:
    1.  for (i = 0; i<dtXoa.Rows.Count;i++)
    2.             {
    3.                 for (j = 0; j<dtResult.Rows.Count;j++)
    4.                 {
    5.                     if (dtXoa.Rows[i][0].ToString() == dtResult.Rows[j][0].ToString())
    6.                     {
    7.                         //dtXoa.Rows[i].Delete();  
    8.                         //Neu nhu trung ID thi thuc hien viec duyet cac column va tim ra du lieu khac nhau
    9.                         //Neu khac thi gan sang cho dtXoa.                      
    10.                                
    11.                             for (int n = 1; n < dtXoa.Columns.Count; n++)
    12.                             {
    13.                                 if ( dtXoa.Rows[0][n].ToString() != dtResult.Rows[0][n].ToString())
    14.                                 {
    15.                                     dtXoa.Rows[0][n] = dtResult.Rows[0][n];                                    
    16.                                 }
    17.                             }                          
    18.                     }                    
    19.                      
    20.                 }
    21.                
    22.             }
    23. //Cap nhat lai toan bo tren database.
    24.             dtXoa.AcceptChanges();            
    25.            
    26.             dataGridView2.DataSource = dtXoa; //Xem tren gridview thì dữ liệu đã thay đổi như ý muốn.
    27.             SqlCommandBuilder s = new SqlCommandBuilder(adapter2);
    28.             adapter2.Update(dtXoa);
    29.             return true;
    Không hiểu vì sao nó không update quay trở lại csdl nhỉ? Các bạn coi giúp mình với.
    Bạn up bài lên cho anh em thì mới biết được chứ.

  3. #3
    Ngày gia nhập
    04 2009
    Nơi ở
    Hà Nội
    Bài viết
    733

    Project của mình chạy trên 2 server riêng biệt nên không upload lên cho các bạn test được. Bạn xem code đó có giúp được mình không? Vấn đề cập nhật quay trở lại database từ datatable ý.
    Hỏi một câu thì chỉ dốt trong chốc lát.Nhưng nếu không hỏi thì bạn sẽ dốt suốt đời.

  4. #4
    Ngày gia nhập
    11 2008
    Nơi ở
    An Giang
    Bài viết
    502

    - Trước khi bạn Update bạn truyền dữ liệu lại cho adapter2 thữ xem.
    Visual C# Code:
    1. adapter2 = new SqlDataAdapter (truy vấn)
    - adapter2 có thực sự Fill cho DataTable dtXoa hay không ?

  5. #5
    Ngày gia nhập
    04 2009
    Nơi ở
    Hà Nội
    Bài viết
    733

    Trước đó mình có xài thằng adapter2 này để select dữ liệu và gán vào 1 datatable. sau đó mình viết hàm so sánh và xử lý dữ liệu có liên quan tới datatable này, và trong xử lý thì dữ liệu có thay đổi, sau đó mình dùng lại adapter2 đề update quay trở lại csdl. Khi mình debug xem ở lúc adapter2.update(dtXoa) thì adapter2 này các tham số , insertcommand,deletecommand, và updatecommand = null còn select thì là sqlcommand. Làm sao bây giờ?
    Hỏi một câu thì chỉ dốt trong chốc lát.Nhưng nếu không hỏi thì bạn sẽ dốt suốt đời.

  6. #6
    Ngày gia nhập
    06 2011
    Bài viết
    93

    Mặc định Lỗi không cập nhật dữ liệu datatable trở lại database.

    Bạn nên gọi AcceptChanges sau khi Update mới đúng, bởi vì nếu gọi AcceptChanges thì nó sẽ thay đổi tất cã các trạng thái cũa row trong datatable thành Unchanged hết, do đó khi DataAdapter Update cái datatable đó sẽ không làm gì hết.

  7. #7
    Ngày gia nhập
    04 2009
    Nơi ở
    Hà Nội
    Bài viết
    733

    Mình post code rõ hơn lên các bạn xem sao nhé:

    Lấy dữ liệu
    Visual C# Code:
    1. private void btnLayDataB_Click(object sender, EventArgs e)
    2.         {
    3.             dataGridView2.DataSource = null;
    4.             string tableB = txtTableB.Text.Trim();
    5.             string sql = "SELECT * FROM " + tableB + "";
    6.  
    7.             cmd2 = new SqlCommand(sql, con2);
    8.             adapter2 = new SqlDataAdapter(cmd2);
    9.             try
    10.             {
    11.                 adapter2.Fill(dtB);
    12.             }
    13.             catch (System.Exception ex)
    14.             {
    15.                 MessageBox.Show("Khong the lay du lieu:  " + ex.Message);
    16.             }
    17.             dataGridView2.DataSource = dtB;
    18.                      
    19.         }

    So sánh dữ liệu:
    Visual C# Code:
    1. public bool SoSanhDuLieu(ref DataTable dtResult,ref DataTable dtXoa)
    2.         {
    3.          
    4.            
    5.             int i,j;
    6.            
    7.             for (i = 0; i<dtXoa.Rows.Count;i++)
    8.             {
    9.                 for (j = 0; j<dtResult.Rows.Count;j++)
    10.                 {
    11.                     if (dtXoa.Rows[i][0].ToString() == dtResult.Rows[j][0].ToString())
    12.                     {
    13.                         //dtXoa.Rows[i].Delete();  
    14.                         //Neu nhu trung ID thi thuc hien viec duyet cac column va tim ra du lieu khac nhau
    15.                         //Neu khac thi gan sang cho dtXoa.                      
    16.                                
    17.                             for (int n = 1; n < dtXoa.Columns.Count; n++)
    18.                             {
    19.                                 if ( dtXoa.Rows[i][n].ToString() != dtResult.Rows[j][n].ToString())
    20.                                 {
    21.  
    22.                                     dtXoa.Rows[i][n] = dtResult.Rows[j][n];                                    
    23.                                 }
    24.                             }
    25.                            
    26.                     }                    
    27.                      
    28.                 }
    29.                
    30.             }
    31.                
    32.             dataGridView2.DataSource = dtXoa; //Chỗ này thấy dữ liệu thay đổi đúng như ý muốn rùi.
    33.             return true;
    34.         }

    gọi cập nhật:
    Visual C# Code:
    1.  if (SoSanhDuLieu(ref dtResult,ref dtB))
    2.             {
    3.                 dtB.AcceptChanges();
    4.                 dtResult.AcceptChanges();
    5.                 using (SqlCommandBuilder s = new SqlCommandBuilder(adapter2))
    6.                 {
    7.                     adapter2.Update(dtB);
    8.                 }

    Vẫn không update được vào dữ liệu. Chắc adapter có vấn đề.
    Hỏi một câu thì chỉ dốt trong chốc lát.Nhưng nếu không hỏi thì bạn sẽ dốt suốt đời.

  8. #8
    Ngày gia nhập
    08 2011
    Nơi ở
    Hà Nội | http://ipmac.vn
    Bài viết
    198

    AccepChange thì làm sao lưu vào được em ơi. Bỏ AcceptChange đi

    Trong Dataset, nó có biến trạng thái:
    - New
    - Deleted
    - Updated
    -> nếu gọi AcceptChange thì nó resite biến này về Nochange nên adapter nó không biết record nào mà cập nhật
    Bao chàng trai không tiếc tuổi xuân đang viết nhiều chương trình
    Em đẹp xinh cũng quyết lập công chưa muốn lấy chồng
    http://ipmac.vn/ <- Học lập trình ... sư
    http://laptrinh.tv/ <- Kênh chia sẻ video học IT
    http://www.youtube.com/user/anhnt3 <- Video thực hành lập trình... sư từ A-Z

  9. #9
    Ngày gia nhập
    04 2009
    Nơi ở
    Hà Nội
    Bài viết
    733

    Thế giờ làm sao nhỉ? Mình lấy dữ liệu vào datatable, not dataset!. OK, rùi mình change một vài row của nó, và view lên gridview thấy ok, bi giờ là làm sao update trạng thái đó của datatable quay trở lại database? Ipmac giúp mình cái nhỉ? Mai mốt vô ipmac học thêm khóa CCNA >0<
    Hỏi một câu thì chỉ dốt trong chốc lát.Nhưng nếu không hỏi thì bạn sẽ dốt suốt đời.

  10. #10
    Ngày gia nhập
    06 2011
    Bài viết
    93

    Bạn phải viết lại như sau:
    Visual C# Code:
    1. if (SoSanhDuLieu(ref dtResult,ref dtB))
    2.             {
    3.                 using (SqlCommandBuilder s = new SqlCommandBuilder(adapter2))
    4.                 {
    5.                     adapter2.Update(dtB);
    6.                     dtB.AcceptChanges();
    7.                     dtResult.AcceptChanges();
    8.                 }

Các đề tài tương tự

  1. Xin hướng dẫn add 1 DataTable ( IList,IEnumable) vào 1 DataTable có sẵn trên DataSet
    Gửi bởi billsang trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 09-11-2012, 02:44 PM
  2. Không thể lưu data từ DataTable xuống database sau khi xóa
    Gửi bởi nhuan07 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 13
    Bài viết cuối: 05-09-2011, 07:07 PM
  3. Thêm row của datatable này vào datatable khác
    Gửi bởi beginner.nguyen trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 07-08-2011, 11:49 PM
  4. Tạo 1 datatable mới nguồn từ 1 datatable cũ.
    Gửi bởi cyd_really trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 06-08-2010, 06:55 PM
  5. Cách fill dữ liệu từ datatable(dc lấy từ database) vào text box
    Gửi bởi r3z0lee trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 30-05-2010, 01:42 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn