• Thứ Hai, 21/01/2008 13:27 (GMT+7)

    Bài toán "truy xuất dữ liệu đồng thời và đồng bộ việc truy xuất"

    Câu hỏi :

    Ứng dụng VB.NET kết nối với CSDL dùng ADO.NET, gồm 1 Form với các thành phần sau:
     - 2 Label có tên lần lượt là Mã nhân viên và Tên nhân viên,
     - 1 button có tên cập nhật, button cho phép nhập mới và sữa dữ liệu nhân viên.
     - 1 datagridview, dùng để hiển thị thông tin của tất cả nhân viên có trong CSDL. Khi sự kiện Form_load xảy ra thì datagridview này tự động nạp toàn bộ thông tin của tất cả nhân viên lên.

     Tôi gặp vấn đề như sau: Chương trình được mở bởi 2 người dùng ở hai máy khác nhau (SQL SERVER ở máy thứ 3) và cả hai cùng đọc một thông tin nhân viên có mã nhân viên là 1 và tên nhân viên là A. Lúc này datagridview ở cả 2 máy đã nạp thông tin toàn bộ nhân viên trong CSDL lên. Khi người dùng thứ nhất cập nhật tên nhân viên này thành C thì trên chương trình của người dùng thứ hai, datagridview vẫn hiển thị nhân viên này có mã nhân viên là 1 và vẫn có tên là A.

     Vậy có cách nào cho datagridview của chương trình người thứ hai tự động cập nhật tên của nhân viên này thành C mà không cần thực hiện bất cứ thao tác nào hay không.

     



    Trả lời :
    Vấn đề mà bạn cần giải quyết là bài toán "truy xuất dữ liệu đồng thời và đồng bộ việc truy xuất" giữa nhiều chương trình cùng chạy tại thời điểm nào đó. Đây là bài toán rất khó nhưng người dùng lại rất cần, Microsoft đã giải quyết bài toán này ở một cấp độ nhất định trong ADO .Net. Trước hết, chúng ta hãy tổng kết lại qui trình giao tiếp dữ liệu từ đối tượng DataGridView đến database và ngược lại. Trong môi trường Visual Studio .Net, khi bạn thiết kế trực quan 1 đối tượng DataGridView để hiển thị/hiệu chỉnh dữ liệu của 1 Table trong database, máy sẽ tạo ra một số đối tượng sau:

     DataGridView <---> BindSource <---> DataSet <---> DataAdapter <---> Database trên Database Server

     Để hiển thị dữ liệu của 1 Table (hay kết quả của lệnh truy vấn), máy sẽ thực hiện hàm Fill của đối tượng DataAdapter, hàm này sẽ load dữ liệu liên quan từ Database Server về và để tạm trên đối tượng DataSet, nội dung tạm này sẽ được liên kết đến đối tượng DataGridView để nó hiển thị lên màn hình.

     Khi người dùng hiệu chỉnh/thêm/ bớt record trực tiếp trên DataGridView, nội dung được hiệu chỉnh/thêm/bớt chỉ được chứa cục bộ trong DataSet tương ứng, chứ chưa được lưu lên database và như vậy, người dùng khác sẽ chưa thấy các thay đổi này. Muốn lưu thông tin hiện có trong DataSet lên Database Server, chương trình phải thực hiện tường minh lệnh Update của đối tượng DataAdapter.

     Tóm lại để giải quyết yêu cầu của bạn (khi 1 người cập nhật dữ liệu trên DataGridView của mình thì nội dung cập nhật sẽ được hiển thị trên DataGridView của người dùng khác), ứng dụng của bạn sẽ phải thực hiện 2 công việc sau:

     1. Gọi hàm Update của đối tượng DataAdapter kết hợp với DataGridView khi cần thiết để cập nhật nội dung lên database. Bạn hãy vẽ 1 button trong Form chứa DataGridView, tạo hàm xử lý Click chuột trên button này và đặt lệnh gọi hàm Update trong hàm xử lý Click chuột của button. Thí dụ sau đây là code của hàm này :

     Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click
     Me.YourTableTableAdapter.Update(Me.DataSet1.YourTable)
     End Sub
     trong đó Dataset có tên là DataSet1, nó chứa các record của đối tượng Table tên là YourTable, còn YourTableTableAdapter là tên của DataAdapter kết hợp với DataGridView.

     2. Gọi hàm Fill của đối tượng DataAdapter kết hợp với DataGridView khi cần thiết để hiển thị lại nội dung mới trên database. Bạn hãy vẽ 1 button trong Form chứa DataGridView, tạo hàm xử lý Click chuột trên button này và đặt lệnh gọi hàm Fill trong hàm xử lý Click chuột của button. Thí dụ sau đây là code của hàm này:

     Private Sub btnRefresh_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRefresh.Click
     Me.YourTableTableAdapter.Fill(Me.DataSet1.YourTable)
     End Sub

     trong đó Dataset có tên là DataSet1, nó chứa các record của đối tượng Table tên là YourTable, còn YourTableTableAdapter là tên của DataAdapter kết hợp với DataGridView.
     Người dùng sẽ click button Update mỗi khi họ muốn lưu các thông tin đã thay đổi lên database. Tương tự, họ sẽ click button Refresh mỗi khi họ muốn hiển thị thông tin đã cập nhật bởi những người dùng khác.
    Chuyên mục: Cơ sở dữ liệu