Hỏi: Em lập trình VB.NET với CSDL là Access. Xin chỉ giúp em làm cách nào để dùng câu lệnh SQL đưa từng phần bản ghi vào ListBox. Ví dụ như lúc đầu có 10 bản ghi hiển thị trong ListBox, khi click chuột thì 10 bản ghi tiếp theo sẽ được đưa vào tiếp. |
Đáp: Trong VB.NET, để truy cập cơ sở dữ liệu (CSDL), bà con phải xài các lớp trong System.Data.DLL. Các lớp này được chia (căn cứ vào chức năng) thành nhiều namespace, trong đó có 2 namespace tương tự nhau là System.Data.OleDb (nối với nguồn dữ liệu OLE DB, như Microsoft Access hoặc Visual Foxro) và System.Data.SqlClient (sử dụng nguồn dữ liệu Microsoft SQL Server 7.0 hoặc cao hơn). |
Như vậy để dùng CSDL Access, phải xài namespace System.Data.OleDb. Trong namespace này, các lớp bà con mình khoái xài nhất là: |
• OleDbConnection: nối kết đến nguồn dữ liệu OLE DB. • OleDbCommand: thực thi các câu lệnh SQL đối với cơ sở dữ liệu OLE DB. • OleDbDataReader. đọc dữ liệu được trả về từ đối tượng OleDbCommand (sau khi đã xài hai lớp trên để truy xuất nguồn dữ liệu OLE DB). |
Bây giờ, bà con hãy xúm vào thử đọc nguồn dữ liệu Access, đưa vào ListBox cho... vui nhé! Đương nhiên bà con phải mở VB.NET rồi tạo một dự án Windows Application. Căn cứ vào bảng 1 và hình 1, bà con đặt để các thuộc tính cho biểu mẫu Form1 cùng các ô điều khiển trên nó (một nút lệnh và một ô danh sách). Xong xuôi, bà con mở cửa sổ Code của biểu mẫu frmADONet để gõ các đoạn mã. |
Bảng 1: Các ô điều khiển cần thiết kế Ô điều khiển | Thuộc tính | Trị | Form | Name | frmADONet | ListBox | Name | lstEmployees | Button | Name | Button1 | | Text | Đọc lần nữa |
|
Hình 1: Biểu mẫu ví dụ |
Cụ thể, bà con thêm vào ngay trước và sau dòng Public Class frmADONet các dòng lệnh để thu được đoạn mã 1. Sau đó, gõ đoạn mã 2 vào thủ tục xử lý tình huống Load của biểu mẫu. Cuối cùng là đoạn mã 3, xử lý tình huống Click của nút lệnh Button1. |
Đoạn mã 1: Imports System.Data.OleDb Public Class frmADONet Inherits System.Windows.Forms.Form Dim myAccessConnection As OleDbConnection Dim dbReader As OleDbDataReader Dim dbCmd As OleDbCommand = New _ OleDbCommand("SELECT Employees.FirstName,Employees.LastName FROM Employees") Dim nSoBanGhi As Integer = 2 Dim I As Integer, lDayDuRoi As Boolean |
Đoạn mã 2: Private Sub frmADONet_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles MyBase.Load Try myAccessConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=D:\Program Files\Microsoft Visual Studio\VB98\NWIND.MDB") myAccessConnection.Open() dbCmd.Connection = myAccessConnection dbReader = dbCmd.ExecuteReader(CommandBehavior.SingleResult) Catch ex As Exception MsgBox(ex.Message) End Try End Sub |
Đoạn mã 3: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Try lDayDuRoi = False I = 0 Do While (dbReader.Read()) lstEmployees.Items.Add(dbReader.GetString(0) & " " & dbReader.GetString(1)) I = I + 1 If (I >= nSoBanGhi) Then lDayDuRoi = True Exit Do End If Loop If Not lDayDuRoi Then MsgBox("Đã hết thông tin cần đọc rồi !") End If Catch ex As Exception MsgBox(ex.Message) End Try End Sub |
Ví dụ của ta "chôm" CSDL có sẵn của Access (hoặc Visual Basic) mang tên Northwind.MDB (có thể mang tên khác là NWIND.MDB). Nội dung dữ liệu gồm hai cột FirstName và LastName của bảng Employees. |
Thủ tục xử lý tình huống Load của biểu mẫu mần công việc xử lý lệnh SQL để mang kết quả truy vấn (query) về cho đối tượng OleDbDataReader có tên dbReader, sẵn sàng để mỗi khi bà con “bộp” vào nút Button1 thì chỉ cần moi dữ liệu từ đây, nhét vào ô danh sách. |
Tui sử dụng biến nSoBanGhi để xác định mỗi lần đọc tối đa là bao nhiêu bản ghi (ví dụ này là 2). Biến lDayDuRoi để xác định xem còn bản ghi nào trong dbReader nữa không. |
Chương Can Chíp (Theo Echip) |