• Thứ Ba, 09/11/2004 10:59 (GMT+7)

    Câu hỏi :
    Làm sao để chuyển mã tiếng Việt? Tôi có 1 tập tin FoxPro for Win không biết version nào, bản thân tập tin này được tạo ra từ phần mềm FAMIS chạy trên MicroStaion. Khi mở tập tin này trên FoxPro for Windows 2.6 thì nó hỏi chọn bảng mã để mở, chọn Cancel thì lại xem được tiếng Việt, nhưng tôi chuyển CSDL này sang Access 97 thì không nhận được bản mã tiếng Việt. Nếu kết nối qua ODBC thì chuyển được thành tiếng Việt.
     Xin hỏi 2 vấn đề sau:
     1. Làm sao mở tập tin DC12.dbf để xem nội dung tiếng Việt mà không Save dưới bất kỳ hình thức nào. Có khoảng vài trăm tập tin như vậy, việc mở ra rồi lưu lại bản mã để Access 97 nhận được tiếng Việt rất mất thời gian.
     2. Dùng VB, không dùng ODBC, chuyển CSDL DC12.dbf sang CSDL Access 97 nhưng vẫn đảm bảo tiếng Việt.

    Trả lời :
    1. Nếu bạn chỉ muốn xem nội dung của các file *.dbf của mình thì hãy chạy Visual Fox, trong cửa sổ Command, bạn hãy dùng các lệnh tương ứng (use dc12.dbf, browse...) để hiển thị nội dung của file lên 1 cửa sổ riêng. Lưu ý để cửa sổ hiển thị đúng tiếng Việt, trước hết bạn phải biết mã tiếng Việt nào được dùng trong file *.dbf, rồi hãy thiết lập font chữ tương ứng cho cửa sổ hiển thị bằng cách vào menu Table.Font và chọn font chữ thích hợp.

     Nếu muốn tự viết ứng dụng hiển thị các file *.dbf, cách dễ dàng nhất là dùng VB tạo 1 Form, "add" vào Form 2 đối tượng ADODC và DataGrid và khai báo các thông tin thích hợp. ADODC là đối tượng "Microsoft ADO Data Control", nó cho phép truy xuất 1 Table của 1 database nào đó, thí dụ file *.dbf của bạn. Còn đối tượng DataGrid cho phép hiển thị nội dung các record của ADODC tương ứng. Lưu ý để hiển thị đúng nội dung tiếng Việt, bạn phải thiết lập thuộc tính font phù hợp cho DataGrid. Bạn có thể liên hệ với tòa soạn PCWorld để copy Project VB cho ứng dụng hiển thị nội dung các file *.dbf mà chúng tôi viết thử dùm bạn.

     2. Hiện có nhiều công nghệ quản lý database khác nhau như dBase (FoxPro), Excel, Access, SQL Server, Oracle, MySQL... Để code của ứng dụng không phụ thuộc vào công nghệ quản lý database cụ thể, nhờ đó giảm nhẹ công sức lập trình truy xuất database và ứng dụng sẽ chạy như nhau trên nhiều loại database khác nhau, người ta đã định nghĩa giao tiếp ODBC (open database connectivity) để truy xuất các database khác nhau trên cùng 1 tập các hàm API cố định. Microsoft còn giới thiệu 2 giao tiếp lập trình cao cấp hơn, đó là DAO (Data Access Objects) và ADO (ActiveX Data Objects). Hai giao tiếp lập trình này phục vụ cho lập trình hướng đối tượng và dùng lại giao tiếp ODBC cấp dưới. Có thể nói, giao tiếp lập trình ADO của Microsoft là giao tiếp lập trình truy xuất database dễ dàng nhất hiện nay vì trong đại đa số trường hợp, ta chỉ cần tạo 1 số ít đối tượng trực quan như Connection, RecordSet và DataGrid rồi thiết lập các thuộc tính cho chúng là giải quyết được việc truy xuất database và hiển thị kết quả.

    Tóm lại, nếu bạn dùng 1 trong các giao tiếp ODBC, DAO và ADO để truy xuất database thì đoạn code truy xuất database của bạn sẽ không phụ thuộc vào công nghệ quản lý database nào cả. Hiện các giao tiếp ODBC, DAO và ADO đều không cung cấp lệnh đơn lẻ nào để copy toàn bộ database vì yêu cầu này rất ít khi cần trong thực tế. Thực vậy, để đảm bảo tính nhất quán dữ liệu của database, người ta hiếm khi nhân bản vật lý dữ liệu mà chỉ tạo view hay link đến dữ liệu gốc từ database đích mà thôi. Tóm lại, bạn không nhất thiết phải chuyển các table
    *.dbf sang dạng Access làm gì, cứ để nguyên như vậy mà truy xuất chúng vì nếu dùng giao tiếp ODBC thì việc truy xuất dữ liệu của các file *.dbf, của Access, của SQL Server, của Oracle... là như nhau. Tuy nhiên, nếu thực sự muốn chuyển các file *.dbf sang dạng Access mà vẫn giữ nguyên được dữ liệu tiếng Việt thì bạn có thể viết đoạn code nhỏ để làm điều này. Thí dụ sau là đoạn code cho phép chuyển dữ liệu từ file *.dbf sang thành 1 Table trong file
    *.mdb của Access dùng giao tiếp ADO. Lưu ý để code không phụ thuộc vào vị trí vật lý cũng như công nghệ quản lý database cụ thể, bạn nên định nghĩa DSN tương ứng với từng database cần truy xuất. Đoạn code của chúng tôi chỉ truy xuất 2 database gốc và đích thông qua tên DSN của chúng chứ không hề biết chúng ở đâu và dùng công nghệ lưu trữ nào.

    Trong thí dụ dưới đây, chúng tôi có 1 file tbk.dbf chứa bảng dữ liệu gốc, có dữ liệu tiếng Việt trong các field holot, ten, diachi. Chúng tôi đã định nghĩa DSN tên là "tbk" để truy xuất file tbk.dbf (vào Control Panel, chạy icon ODBC Data Source Name, rồi định nghĩa từng DSN cần dùng). Tương tự, chúng tôi đã định nghĩa DSN tên là newdb để truy xuất file newdb.mdb, file này lúc đầu rỗng, chưa có Table nào bên trong. Nhiệm vụ của đoạn code dưới đây sẽ copy file tbk.dbf sang thành Table "tbk1" trong file newdb.mdb mà vẫn giữ nguyên mã tiếng Việt.

     Private Sub Command1_Click()

     Dim cns As New ADODB.Connection

     Dim rss As New ADODB.Recordset

     Dim cnd As New ADODB.Connection

     Dim rsd As New ADODB.Recordset

     ' Tạo connection truy xuất database gốc dùng DSN
     cns.Open "tbk", ""

     ' Tạo Recordset truy xuất Table gốc
     Set rss = cns.Execute("Select * From tbk1")

     ' Tạo connection truy xuất database đích dùng DSN
     cnd.Open "newdb", ""

     ' Tạo Table mới để copy Table gốc sang

     ' Tuy nhu cầu mà khai báo số lượng field và tên field cho thích hợp.
     cnd.Execute ("create table tbk1 (holot char(30), ten char(10), diachi char(100))")

     ' Tạo recordset để truy xuất Table mới
     rsd.Open "Select * from tbk1", cnd, adOpenKeyset, adLockOptimistic

     ' Duyệt từng record gốc và copy các field cần dùng sang Table đích
     While (Not rss.EOF)
     rsd.AddNew
     rsd.Fields("holot").Value = rss.Fields("holot").Value
     rsd.Fields("ten").Value = rss.Fields("ten").Value
     rsd.Fields("diachi").Value = rss.Fields("diachi").Value
     rsd.UpdateBatch
     rss.MoveNext
     Wend

     ' Đóng các đối tượng đã tạo ra
     rsd.Close
     rss.Close
     cnd.Close
     cns.Close
     End Sub
     Lưu ý rằng đoạn code copy vật lý Table ở trên không hề phụ thuộc vào Table gốc và đích thuộc công nghệ database nào và vị trí vật lý của file database gốc và file database đích. 
     
    Chuyên mục: Cơ sở dữ liệu