SửdụngVB.NETđểkếtnốimySQL
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ếtnố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ếtnố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;" & _
"Connect Timeout=30;"
MyADOConnection = New MySqlConnection(MySQLConnectionString)
MyADOConnection.Open()
Ví dụ trên sẽ gửi lệnh connect thông qua phương thức khởi tạo của 9ối tượng MySQlConnection;
nếu như chưa có connection nào được tạo thì phương thức Open làm nhiệm vụ tạo ra một
connection mới; nếu như đã có rồi thì hàm open sẽ lấy một connection có sẵn trong danh sách
connection available.
Dim MySQLConnectionString As String
Dim MyADOConnection As MySqlConnection
MySQLConnectionString = "Server=myServer;" & _
"Database=myDatabase;" & _
"Uid=myUserID;" & _
"Pwd=myPassword;" & _
"Connect Timeout=30;"
MyADOConnection = New MySqlConnection()
MyADOConnection.ConnectionString = MySQLConnectionString
MyADOConnection.Open()
Ví dụ trên đây sẽ tạo một connection hoàn toàn mới vì khi khởi tạo không gán thuộc tính
connectionstring cho đối tượng mySQL Connection; do đó không thể lấy trong sanh sách các
connection có sẵn được. Chỉ khi phương thức Open được gọii thì câu lệnh
MyADOConnection.ConnectionString = MySQLConnectionString mới được sử dụng.
Lưu ý: Cái này cực kỳ quan trọng và cực kỳ hay, khi lập trình chú ý đến vấn đềsửdụng
connectionstring. Tuyệt đối kông nên nhúng connectionstirng vào trong code vì rất khó nâng cấp
và không an toàn chút nào. Có 2 lý do chính:
1. hacker có thể lợi dụng các lỗi bảo mật của MySQLđể thay thế chuổi connectionstring vì chuỗi
này đã được đóng gói lại một dòng duy nhất. Bằng cách nào đó hacker sẽ cộng dồn biến
connectionstirng với một chuỗi nào đó mà MySQLdễ dàng pass qua các lỗi hoặc chỉ trả về kết
quả thực thi câu lệnh sau cùng
2. Khó bảo trì vì nếu một trongc ác thông số của câu lệnh connectionstring thay đổi bạn phải biên
dịch lại hoàn toàn bộ code, thật là phiền phức.
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ếtnối CSDL
Mở và đóng kếtnối
Việc mở và đóng kếtnớ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ếtnố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ếtnối an toàn khi sửdụng MySQLConnection
Private Function MySQLADOConnectionOpen(ByRef pErrorMessageString As String) As
Boolean
Try
mMySqlConnection = New MySqlConnection
mMySqlConnection.ConnectionString = mMySQLConnectionString
mMySqlConnection.Open()
Return (True)
Catch exError As MySqlException
pErrorMessageString = exError.Message
Return (False)
End Try
End Function
Public Function MySQLADOConnectionClose(ByRef pErrorMessageString As String) As
Boolean
Try
If Not IsNothing(mMySqlConnection) Then
If mMySqlConnection.State = ConnectionState.Open Then
mMySqlConnection.Close()
End If
mMySqlConnection = Nothing
End If
Return (True)
Catch exError As MySqlException
pErrorMessageString = exError.Message
Return (False)
End Try
End Function
Đọc và xử lý dữ liệu
Trước khi bắt đầu; bạn dãy dùng phần mềm Toad for MySQLđể tạo CSDL và tạo dữ liệu giả
làm ví dụ. Đây là công cụ
rất hữu ích, tích hợp với MySQL, IBM DB2, và MS SQL. Ví dụ, bạn tạo được CSDL
DROP TABLE IF EXISTS `states`;
CREATE TABLE `states` (
`statename` varchar(20) NOT NULL,
`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'),
('Maine','Maine','ME','Augusta'),
('Michigan','Mich.','MI','Lansing'),
('Minnesota','Minn.','MN','St Paul'),
('Missouri','Mo.','MO','Jefferson City'),
('Mississippi','Miss.','MS','Jackson'),
('Montana','Mont.','MT','Helena'),
('North Carolina','N.C.','NC','Raleigh Durham'),
('North Dakota','N.D.','ND','Bismarck'),
('Nebraska','Nebr.','NE','Lincoln'),
('New Hampshire','N.H.','NH','Concord'),
('New Jersey','N.J.','NJ','Trenton'),
('New Mexico','N.M.','NM','Santa Fe'),
('Nevada','Nev.','NV','Carson City'),
('New York','N.Y.','NY','Albany'),
('Ohio','Ohio','OH','Columbus'),
('Oklahoma','Okla.','OK','Oklahoma City'),
('Oregon','Ore.','OR','Salem'),
('Pennsylvania','Pa.','PA','Harrisburg'),
('Puerto Rico','P.R.','PR','San Juan'),
('Rhode Island','R.I.','RI','Providence'),
('South Carolina','S.C.','SC','Columbia'),
('South Dakota','S.D.','SD','Pierre'),
('Tennessee','Tenn.','TN','Nashville'),
('Texas','Tex.','TX','Austin'),
('Utah','Utah','UT','Salt Lake City'),
('Virginia','Va.','VA','Richmond'),
('Virgin Islands','V.I.','VI','Charlotte Amalie'),
('Vermont','Vt.','VT','Montpelier'),
('Washington','Wash.','WA','Olympia'),
('Wisconsin','Wis.','WI','Madison'),
('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
If disposing Then
'TODO: free unmanaged resources when explicitly called
End If
'TODO: free shared unmanaged resources
End If
Me.disposedValue = True
End Sub
End Class
Và đây là code của Button khi xảy ra sự kiện click, trong đây có gọi hàm
ListBoxLoadVBNET2005 để xử lý dữ liệu cho ListBox
Private Sub LoadVBNET2005Button_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs)
Handles LoadVBNET2005Button.Click
Cursor = Cursors.WaitCursor
Using ConnectionStringObject As New
MySQLConnectionStringClass(mMySQLConnectionString)
Call ConnectionStringObject.ListBoxLoadVBNET2005(ListBoxStates, _
mErrorMessageString)
If Not IsNothing(mErrorMessageString) Then
Cursor = Cursors.Default
MessageBox.Show(mErrorMessageString, _
"MySQL Connection String", _
MessageBoxButtons.OK, _
MessageBoxIcon.Information)
End If
End Using
Cursor = Cursors.Default
End Sub
Public Sub ListBoxLoadVBNET2005(ByVal pListBox As ListBox, _
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
End Using
Catch exErr As MySqlException
pErrorMessageString = exErr.Message
End Try
End Sub
Lưu ý là trong đọan code trên, tất cả các đối tượng như mMySqlDataReader, mMySqlCommand
và mMySqlConnection đều được giải phóng bộ nhớ. Các chức năng khác trên form chúng tôi sẽ
không giới thiệu vì đó thuộc những kiến thức cơ bản. Chúng tôi hy vọng rằng qua bài viết này,
các bạn sẽ có đủ kiến thức để vừa sử dụng SQL Server mà mySQL và có cái nhìn tổng quát về
hai hệ CSDL rồi chọn ra cho hệ thống một CSDL quản lý phù hợp.
. 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.
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