Sử dụng VB.NET để kết nối mySQL
Yêu cầu:
- MySQL 5.0.27
- My SQL Connector/Net 5.0.3
- Toad for MySQL Freeware 2.0.3
- VB.NET 2005 Express Edition
Phần I. Định nghĩa ConnectionString
Những ai đã quen với lập trình .NET khi sử dụng ADO để kết nối với CSDL cũng đã rất quen
thuộc với cụm từ Connection String. Đúng ra, trong lập trình ConnectionString là thuộc tính của
đối tượng ADO Connection. Với MySQL cũng vậy, một số thông số truyền vào chuỗi định nghĩa
kết nốivới CSDL gần như giống hoàn toàn với ADO.NET; tuy nhiên chúng ta không sử dụng
ADO.NET mà là MySQL Connector.
Ví dụ:
Dim MySQLConnectionString As String
MySQLConnectionString = "Server=myServer;" & _
"Database=myDatabase;" & _
"Uid=myUserID;" & _
"Pwd=myPassword;" & _
"Connect Timeout=30;"
Vi dụ trên đây không bao gồm thông số Persist Security Info và mặc định giá trị PSI là false; bất
cứ thông số nào trong chuỗi ConnectionString mà thiếu đều mang giá trị mặc định.
Một đối tượng dùng để kết nối với CSDL phải được khởi tạo và mở kết nối. Tuy nhiên, có nhiều
cách khai báo khác nhau sẽ nảy sinh những vấn đề vể bộ nhớ.
Ví dụ:
Dim MySQLConnectionString As String
Dim MyADOConnection As MySqlConnection
MySQLConnectionString = "Server=myServer;" & _
"Database=myDatabase;" & _
"Uid=myUserID;" & _
"Pwd=myPassword;" & _
Có môt cách mà bạn có thể an tâm giao phó việc bảo mật cho các nhà quản lý host hoặc admin
đó là đưa câu lệnh này vào file cấu hình (web.config) ; do đó khi có thay đổi bất kỳ thông số nào
cũng có thể thay đổi không cần biên dịch lại.
<CONNECTIONSTRINGS>
<ADD name="MySQLConnectionString . My . MySettings . MySQLConnectionString
connectionString=" Server='xxx; Database=xxx; Uid=xxx; Pwd=xxx;"' />
</CONNECTIONSTRINGS>
Khi đó muốn sử dụng chỉ cần khai báo như sau:
Dim mMySQLConnectionString As String = My.Settings.MySQLConnectionString
Dim mMySQLConnectionString As String = My.Settings.MySQLConnectionString
Dim MyADOConnection As New MySqlConnection
MyADOConnection.ConnectionString = MySQLConnectionString
MyADOConnection.Open()
Thế là xong phần khai báo kết nối CSDL
Mở và đóng kết nối
Việc mở và đóng kết nới một đối tượng ADO.NET là công việc cực ký quan trọng nhất trong bất
cứ tình huống nào. Bởi vì nếu coding không cẩn thận sẽ dễ gây ra tràn bộ nhớ. Quá trình mở và
đóng kết nối luôn trãi qua 3 bước: Tạo một đối tượng ADO Connection; gửi ConnectionString
cho thuộc thính của đối tượng hoặc truyền vào hàm khởi tạo của đối tượng; dùng phương thức
Open() để mời kết nối.
Khi không có nhu cầu sử dụng đối tượng Connection này nữa, hãy dùng IsNothing (cho
VB.NET) để hủy tất cả các connection và liên kết tới đối tượng; và cũng để giải phóng tài
nguyên hệ thống. Cũng giống như SQL; MySQL cũng dựng sẵn các exception để giải quyết vấn
đề lỗi xảy ra của đối tượng.
Xem 2 ví dụ để có thể thấy cách mở và đóng kết nối an toàn khi sử dụng MySQLConnection
Private Function MySQLADOConnectionOpen(ByRef pErrorMessageString As String) As
Boolean
Try
mMySqlConnection = New MySqlConnection
`abbrev` varchar(10) NOT NULL,
`postal` char(2) NOT NULL,
`capital` varchar(20) NOT NULL,
PRIMARY KEY (`postal`),
KEY `statename` (`statename`),
KEY `capital` (`capital`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `states`(`statename`,`abbrev`,`postal`,`capital`) VALUES
('Alaska','Alaska','AK','Juneau'),
('Alabama','Ala.','AL','Montgomery'),
('Arkansas','Ark.','AR','Little Rock'),
('Arizona','Ariz.','AZ','Phoenix'),
('California','Calif.','CA','Sacramento'),
('Colorado','Colo.','CO','Denver'),
('Connecticut','Conn.','CT','Hartford'),
('Dist. of Columbia','D.C.','DC','Washington'),
('Delaware','Del.','DE','Dover'),
('Florida','Fla.','FL','Tallahassee'),
('Georgia','Ga.','GA','Atlanta'),
('Guam','Guam','GU','Agaña'),
('Hawaii','Hawaii','HI','Honolulu'),
('Iowa','Iowa','IA','Des Moines'),
('Idaho','Idaho','ID','Boise'),
('Illinois','Ill.','IL','Springfield'),
('Indiana','Ind.','IN','Indianapolis'),
('Kansas','Kans.','KS','Topeka'),
('Kentucky','Ky.','KY','Frankfort'),
('Louisiana','La.','LA','Baton Rouge'),
('Massachusetts','Mass.','MA','Boston'),
('Maryland','Md.','MD','Annapolis'),
('West Virginia','W.Va.','WV','Charleston'),
('Wyoming','Wyo.','WY','Cheyenne');
Tạo sẵn một SP để đọc và hiển thị tất cả các Statename từ bảng State như sau:
DROP PROCEDURE IF EXISTS `usp_state_select_name`;
CREATE PROCEDURE `usp_state_select_name`()
BEGIN
SELECT `statename`
FROM `states`
ORDER BY `statename`;
END;
Và cũng giả sử rằng bạn tạo một form, trên form có button dùng để đọc dữ liệu. Ở đây, chúng tôi
xin giới thiệu những dòng lệnh trong VB.NET 2005. Khi click đúp vào button Load
VB.NET2005 thì .NET sẽ tạo sẵn cho bạn sự kiện Click của Button.
Trước hết chúng ta phải giải phóng bộ nhớ cho đối tượng connection. Để làm việc này, trong
VB.NET có một interface gọi là IDisposable, chúng ta tạomột class gọi là ObjectDisposeClass
cài đặt từ interface IDisposable. Đọan code sau đây sẽ tự động sinh ra khi chúng ta tạo đối tượng
từ interface IDisposable. Vì đối tượng Connection thuộc class
MySQLConnection kế thừa từ class ObjectDisposeClass, do đó để giải phóng bộ nhớ chúng ta
dùng phương thức Dispose
Public Class ObjectDisposeClass
Implements IDisposable
Private disposedValue As Boolean = False
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
ByRef pErrorMessageString As String)
Dim StateNameString As String
Try
Using mMySqlConnection As New MySqlConnection(mMySQLConnectionString)
mMySqlConnection.Open()
Using mMySqlCommand As New MySqlCommand
With mMySqlCommand
.Connection = mMySqlConnection
.CommandType = CommandType.StoredProcedure
.CommandText = "usp_state_select_name"
mMySqlDataReader = .ExecuteReader(CommandBehavior.SingleResult)
End With
With pListBox
.Items.Clear()
If mMySqlDataReader.HasRows Then
.BeginUpdate()
Do While mMySqlDataReader.Read()
mObjectjValue = mMySqlDataReader.GetString(0)
If Not IsDBNull(mObjectjValue) Then
StateNameString = mObjectjValue.ToString()
Else
StateNameString = String.Empty
End If
.Items.Add(StateNameString)
Loop
.EndUpdate()
.SelectedIndex = 0
End If
End With
End Using