logo

Sử dụng VB.NET để kết nối mySQL


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;" & _ "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à MySQL dễ 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. 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 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.  
DMCA.com Protection Status Copyright by webtailieu.net