• Thứ Ba, 21/08/2007 09:00 (GMT+7)

    VB6, cách sao chép dữ liệu ở 2 bảng có cùng cấu trúc

    Câu hỏi :
    Xin hướng dẫn cách sao chép dữ liệu ở hai bảng có cùng cấu trúc thuộc hai cơ sở dữ liệu bằng ngôn ngữ VB 6.0.


    Trả lời :

    Nếu lập trình bằng VB 6.0, bạn có thể dùng các đối tượng ADO để truy xuất database cho dễ dàng và độ tin cậy cao. Các đối tượng ADO thường dùng là Connection, Recordset, Command. Sau đây là qui trình điển hình để xây dựng 1 ứng dụng VB copy dữ liệu từ table của database này sang database khác:

     1. Để đoạn code VB độc lập với công nghệ database mà nó truy xuất, bạn hãy định nghĩa 2 DSN (Data Source Name) kết hợp với 2 database cần truy xuất: database chứa table nguồn và database chứa table đích. Để định nghĩa 1 DSN kết hợp với 1 database, từ Windows, bạn hãy vào Control Panel.Administrative Tools.Datasource (ODBC).

     2. Chạy VB, tạo project quản lý ứng dụng dạng "Standard EXE". Sau khi Form trống được tạo ra, bạn hãy thiết kế trực quan form có dạng như sau:

     Hãy đặt tên cho 3 textbox lần lượt là txtTable, txtDSN1, txtDSN2. Đặt tên cho Button là btnStart. Nhấn kép chuột vào button Start để tạo thủ tục xử lý sự kiện Click cho nó, cửa sổ soạn code sẽ hiển thị.

     3. Chọn menu Projects.References, duyệt tìm và chọn mục "Microsoft ActiveX Data Objects 2.x Library" rồi nhấn button Ok để "add" thư viện chứa các đối tượng ADO vào Project ứng dụng.

     4. Viết thủ tục xử lý Click chuột cho button Start như sau:
     
     'Thủ tục xử lý Click chuột vào button Start
     Private Sub btnStart_Click()
     'Khai báo các biến cần dùng
     Dim Connection1 As ADODB.Connection
     Dim Connection2 As ADODB.Connection
     Dim Command1 As ADODB.Command
     Dim Command2 As ADODB.Command
     Dim RecordSet1 As ADODB.Recordset
     Dim RecordSet2 As ADODB.Recordset
     Dim strSQL As String
     Dim strBuf As String
     'Tạo connection tới database nguồn
     Set Connection1 = New ADODB.Connection
     Connection1.Open "DSN=" & txtDSN1.Text
     'Tạo recordset chứa các data của table nguồn
     Set RecordSet1 = New ADODB.Recordset
     RecordSet1.Open txtTable.Text, Connection1, adOpenStatic, adLockReadOnly, adCmdTable
     'Tạo connection tới database đích
     Set Connection2 = New ADODB.Connection
     Connection2.Open "DSN=" & txtDSN2.Text
     'Tạo command làm việc với database đích
     Set Command2 = New ADODB.Command
     Command2.ActiveConnection = Connection2
     'xây dựng SQL tạo Table đích
     strSQL = "CREATE TABLE " & txtTable.Text & "("
     
     'duyệt tìm từng field của table nguồn
     fStart = 1
     For Each fld In RecordSet1.Fields
     'tìm tên và kiểu của field
     Select Case fld.Type
     Case 2
     strBuf = "Integer"
     Case 3
     strBuf = "Long"
     Case 5
     strBuf = "Currency"
     Case 6
     strBuf = "Double"
     Case 11
     strBuf = "Logical"
     Case 202
     strBuf = "Text"
     Case 135
     strBuf = "Date"
     Case Else
     MsgBox "Type với mã " & fld.Type & "chưa được xử lý!!!"
     End Select
     If fStart Then
     strSQL = strSQL & fld.Name & " " & strBuf
     fStart = 0
     Else
     strSQL = strSQL & ", " & fld.Name & " " & strBuf
     End If
     Next fld
     strSQL = strSQL & ")"
     'Tạo table trên database đích có cùng cấu trúc như table nguồn
     Command2.CommandText = strSQL
     Command2.Execute
     'Tạo recordset quản lý dữ liệu của table đích
     Set RecordSet2 = New ADODB.Recordset
     RecordSet2.Open txtTable.Text, Connection2, adOpenKeyset, adLockOptimistic, adCmdTable
     'duyệt copy từng record từ nguồn sang đích
     While Not RecordSet1.EOF
     'tạo record mới trên table đích
     RecordSet2.AddNew
     For i = 0 To RecordSet1.Fields.Count - 1
     'copy nội dung của field
     RecordSet2.Fields(i).Value = RecordSet1.Fields(i).Value
     Next i
     RecordSet2.Update
     'di chuyển đến record kế
     RecordSet1.MoveNext
     Wend
     'đóng các đối tượng đã dùng lại
     RecordSet1.Close
     Connection1.Close
     Connection2.Close
     End Sub
     
     5. Chọn menu Run.Start để chạy thử ứng dụng. Khi Form hiển thị, bạn hãy thử nhập tên của table cần copy, tên của DSN miêu tả database chứa table nguồn, tên của DSN miêu tả database đích rồi nhấn button Start.

     Lưu ý nếu 2 database nguồn và đích được tạo ra bởi 2 hệ quản trị database khác nhau (Foxpro, Access, SQL Server, MySQL, Oracle...) thì có thể xuất hiện vấn đề không tương thích về kiểu dữ liệu của các field dữ liệu. Một lưu ý khác là đoạn code VB do chúng tôi viết chỉ chứa những hoạt động thiết yếu, chứ chưa đầy đủ, còn thiếu những đoạn code xử lý lỗi cho từng hoạt động truy xuất database. Để có được ứng dụng hoàn chỉnh, bạn cần bổ sung thêm những hoạt động xử lý lỗi còn thiếu. 

    Chuyên mục: Cơ sở dữ liệu