• Thứ Năm, 20/03/2008 09:44 (GMT+7)

    Chuyển đổi font TCVN sang Unicode trong dữ liệu Foxpro

    Câu hỏi :

    Tôi có một cở sở dữ liệu của Foxpro lưu dưới dạng file *.dbf và *.cdx, font chữ TCVN. Tôi muốn chuyển đổi từ TCVN sang Unicode, cụ thể như sau: import tự động file *.dbf hoặc *.cdx của Foxpro vào MySQL, sau đó hiển thị theo font Unicode lên trang web. Xin hướng dẫn.



     



    Trả lời :
    Yêu cầu của bạn gồm 2 vấn đề chính cần giải quyết:
     1. Chuyển mã tiếng Việt 1 chuỗi văn bản từ bản mã này sang bản mã khác (cụ thể là từ TCVN sang Unicode). Chúng tôi có viết sẵn 1 thành phần COM (linh kiện phần mềm theo chuẩn Component Object Model của Microsoft) để cho phép chuyển mã chuỗi văn từ từ bản mã này sang bản mã khác.

     2. Copy các record dữ liệu từ file *.dbf hay *.cdx sang 1 table của MySQL.
     File *.dbf hay *.cdx tương ứng với 1 bảng (table) dữ liệu trên các database Access, MySQL, SQL Server,... Do đó việc chuyển thông tin từ file *.dbf sang Access là hoạt động copy dữ liệu từ table này sang table khác. Ở các số báo trước chúng tôi đã trình bày mã nguồn viết bằng VB 6.0 và VB .Net dùng các đối tượng ADO để copy table này sang table khác.

     Sau đây chúng tôi xin trình bày qui trình điển hình để xây dựng ứng dụng bằng VB 6.0 đọc nội dung từ file *.dbf, chuyển mã tiếng Việt từ TCVN sang Unicode cho bất kỳ field chuỗi nào, rồi ghi kết quả lên table của MySQL. Ứng dụng xây dựng được có tính tổng quát cao vì nó cho phép chuyển dữ liệu từ table của bất kỳ database server nào sang table của bất kỳ database server nào (FoxPro, Excel, Access, MySQL, SQL, Oracle...).

     1. Do Provider truy xuất database MySQL chưa có sẵn trên máy nên bạn cần phải tìm và cài đặt nó vào máy. Nếu bạn đã viết ứng dụng truy xuất database của MySQL thì bước này đã được thực hiện.

     2. Chạy Control Panel.Administrative Tools.Data Source (ODBC) để hiển thị cửa sổ "ODBC Data Source". Chọn tab System DSN, chọn button Add để định nghĩa tên DSN nhận dạng file *.dbf cần chuyển mã (lưu ý là file *.dbf chỉ chứa 1 table có tên trùng với tên file). Tiếp tục dùng button "Add" để định nghĩa tên DSN nhận dạng database MySQL cần chứa table của file *.dbf.

     3. Copy file miêu tả thành phần COM chuyển mã của chúng tôi vào 1 vị trí thư mục thích hợp trên máy rồi đăng ký nó vào Windows bằng cách chạy Start.Run, nhập hàng lệnh:
     C:\WINDOWS\system32\regsvr32.exe c:\COM\BkTrans.dll

     4. Chạy VB 6.0, tạo Project mới thuộc loại "Standard EXE" (loại Project mặc định có 1 Form giao diện rỗng ban đầu).

     5. Chọn menu Project.References để hiển thị cửa sổ Refrerences. Duyệt tìm và chọn mục BkTrans 1.0 Type Library để "add" thành phần COM phục vụ chuyển mã tiếng Việt vào Project. Tương tự, duyệt tìm và chọn mục Microsoft ActiveX Data Objects 2.x Library để "add" thành phần COM phục vụ truy xuất database.

     6. Thiết kế Form ứng dụng có 3 textbox và 1 button như sau. Đặt tên cho các textBox lần lượt là txtTable, txt DSN1, txtDSN2. Đặt tên cho button là btnStart.

     7. Nhấn đúp chuột vào button btnStart để tạo thủ tục xử lý sự kiện click chuột trên button rồi viết đoạn code thực hiện copy dữ liệu từ table sang table (có chuyển mã tiếng Việt từ TCVN sang Unicode) như sau:
     
     Option Explicit
     'thủ tục xử lý sự kiện click chuột trên button
     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
     Dim fldBuf As String
     'khai báo đối tượng chuyển mã tiếng Việt
     Dim bktrans As New BKTRANSLib.BKTRANSLib
     'khởi động COM chuyển mã
     bktrans.Init
     'Tạo connection tới database nguồn
     Set Connection1 = New ADODB.Connection
     Connection1.Open "DSN=" & txtDSN1.Text
     'Tạo recordset chua cac data cua table nguon
     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 cua table nguon
     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 129 strBuf = "Text"
     Case 131 strBuf = "Integer"
     Case 133 strBuf = "Date"
     Case Else
     MsgBox "Type với mã " & fld.Type & " chua duoc xu ly!!!"
     End Select
     If fStart Then
     strSQL = strSQL & fld.Name & " " & strBuf
     fStart = 0
     Else
     strSQL = strSQL & ", " & fld.Name & " " & strBuf
     End If
     Next fld
     strSQL = strSQL & ")"
     'Xóa table trên database đích nếu có rồi
     'Command2.CommandText = "DROP TABLE " & txtTable.Text
     'Command2.Execute
     'Tạo table trên database đích
     Command2.CommandText = strSQL
     Command2.Execute
     'Tạo recordset chứa data của table nguồn
     Set RecordSet2 = New ADODB.Recordset
     RecordSet2.Open txtTable.Text, Connection2, adOpenKeyset, adLockOptimistic, adCmdTable
     'duyệt chuyển mã và copy từng record
     While Not RecordSet1.EOF
     'xây dựng SQL INSERT record hiện hành
     RecordSet2.AddNew
     For i = 0 To RecordSet1.Fields.Count - 1
     'nếu field i là chuỗi thì chuyển mã rồi copy
     If (RecordSet1.Fields(i).Type = 129) Or (RecordSet1.Fields(i).Type = 202) Then
     kq = bktrans.TransStr(2, 25, RecordSet1.Fields(i).Value, fldBuf)
     RecordSet2.Fields(i).Value = fldBuf
     Else
     'nếu không thì chỉ copy dữ liệu
     RecordSet2.Fields(i).Value = RecordSet1.Fields(i).Value
     End If
     Next i
     'lưu lại record lên table đích
     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

     8. Chọn menu Run.Start để chạy thử ứng dụng xem nó hoàn thành nhiệm vụ qui định không.
     Bạn có thể liên hệ với TGVT để copy Project VB 6.0 quản lý tiện ích chuyển mã và sao chép dữ liệu này (có tên là VBTableTransCopy).
    Chuyên mục: Lập trình