Tạo kếtnốitớicơsởdữliệu Author :
Xcross87
Dưới đây là tổngquanvềcáchkếtnốitới cơ sởdữliệuMSSQLServer 2005.
Như ở kì trước các bạn đã biết về các lớp cung cấp kếtnốitớidữliệu (Data Connection Provider
Classes), tất cả đều sử dụng System.Data.IdbConnection interface cho ứng dụng. Dưới đây là bảng tổng
hợp lại các ‘data provider’ được cung cấp bởi Microsoft :
Data Provider Namespace Connection Class
ODBC System.Data.Odbc OdbcConnection
OLE DB System.Data.Oledb OledbConnection
Oracle System.Data.OracleClient OracleConnection
SQL Server System.Data.SqlClient SqlConnection
SQL Server CE System.Data.SqlServerCe SqlCeConnection
Bây giờ hãy thử ứng dụng vào tạo một kếtnốitới Microsoft SQLServer2005 (bạn phải setup cái này vào
mấy trước đó) dùng lớp ‘SqlConnection’. Dưới đây là một ví dụkếtnốitới database qua máy chủ SQL
Server 2005.
[code]
using System;
using System.Data;
using System.Data.SqlClient;
public class KetNoiSQLServer
{
public static void Main()
{
// Tạo connection string để kết nối
string connectionString = @"Server = .\SQLEXPRESS;" +
"Integrated Security = true";
// Tạo một connection tới máy chủ
SqlConnection conn = new SqlConnection(connectionString);
// QUA TRINH KET NOI
try
{
// Mở kết nối
conn.Open();
Console.WriteLine("Connection opened !");
}
catch (SqlException sqle)
{
// Thông báo biến cố khi kết nối
Console.WriteLine("Error: " + sqle.Message);
}
finally
{
// Đóng kết nối
conn.Close();
Console.WriteLine("Connection closed !");
}
Page 1 of 8
Tạo kếtnốitớicơsởdữliệu Author :
Xcross87
}
}
[/code]
Phân tích đoạn code trên một chút :
_Phần đầu code ta khai báo tên miền và các lớp cần sử dụng để kết nối, ở đây ta dùng lớp
‘SqlConnection’ để kếtnối cho nên dùng tên miền ‘System.Data.SqlConnection’.
_Sau đó tạo một chuỗi chứa thông tin tham số truyền khi kết nối, nôm na thì hiểu là thông tin kếtnốitới
máy chủ. Giải thích ngắn gọn về chuỗi kếtnối này
[code]
// Tạo connection string để kết nối
string connectionString = @"Server = .\SQLEXPRESS;" +
"Integrated Security = true";
[/code]
Với : Server = .\SQLEXPRESS; là tên server mà ta cần kếtnối tới, ở đây mặc định sau khi cài
Microsoft SQLServer2005 Express thì default thường là SQLEXPRESS. Còn kí hiệu ở trước “ .\ “ thực
chất là gọi tên máy chứa cơsởdữliệu cần kết nối. Thông thường nếu bạn làm việc offline thì mặc định là
‘localhost’. Hai kí hiệu : “ .\ “ và “(local)\” là tương đương nhau. Vì thế ở đoạn code trên bạn có thể viết
lại khai báo server là : @“Server = (local)\SQLEXPRESS”
Với : Integrated Security = true đây là chỉ định cáchkếtnốitớicơsởdữ liệu, ở đây trên máy
của tớ thì để Windows Authentication cho nên tham số ‘Integrated Security’ mang giá trị ‘True’ như trên
khi kết nối, nếu bạn không dùng Windows Authentication thì bạn phải cung cấp Username | Password
đăng nhập vào hệ cơsởdữ liệu.
Còn nhiều tham số trong chuỗi kếtnối ( connection string ) khác nhưng sẽ đề cập sau chi tiết hơn về
thông tin kết nối.
_Sau đó tạo một đối tượng chứa thông tin kếtnối ( thông tin này nằm trong chuỗi kếtnối connection
string ) :
[code]
// Tạo một connection tới máy chủ
SqlConnection conn = new SqlConnection(connectionString);
[/code]
_Vậy là bạn đã có một đối tượng chứa thông tin kếtnối đầy đủ. Việc tiếp theo là ‘THỬ” kếtnốitớicơsở
dữ liệu xem thế nào.
_Yêu cầu đối tượng mở kếtnối tớ cơsởdữ liệu.
[code]
Page 2 of 8
Tạo kếtnốitớicơsởdữliệu Author :
Xcross87
try
{
// Mở kết nối
conn.Open();
Console.WriteLine("Connection opened !");
}
[/code]
_Nếu như trong trường hợp kếtnối mà có lỗi thì kếtnối tự động ngắt đi và dừng chương trình. Nếu như ta
không dùng cặp quan hệ ‘ try…catch…finally ‘ để kiểm tra kếtnối thì nếu gặp lỗi thì sẽ có thông báo lỗi
và ta không biết được lỗi gì khi kếtnối vì vậy ở đây lỗi bắt được bị ném vào trong ‘catch’ và in ra lỗi bắt
được ( lỗi bắt được luôn được ghi ở chế độ Debug nếu như bạn RUN chương trình ở Debug mode chứ
không phải là Release mode ).
[code]
catch (SqlException sqle)
{
// Thông báo biến cố khi kết nối
Console.WriteLine("Error: " + sqle.Message);
}
[/code]
Lớp ‘SqlException’ là lớp chứa thông tin về các lỗi bắt trong quá trình kếtnốitới hệ cơ sởdữliệuSQL
Server. Bạn có thể xem thông tin chi tiết hơn về các Exception của SQL trong trang chủ MSDN.
_Cuối cùng khi kếtnối thành công và không gặp trở ngại gì thì ta tiến hành công việc trong thẻ finally. Ở
đây là đóng kết nối.
[code]
finally
{
// Đóng kết nối
conn.Close();
Console.WriteLine("Connection closed !");
}
[/code]
_Chương trình tưởng chừng đơn giản đọc rất dễ hiểu nhưng nếu bạn có kiến thức sâu hơn vềkếtnỗi và
tương quan server/client sẽ thấy một số vấn đề ở đây. Tớ đưa ra một số vấn đề mà tớ đã gặp :
+ Giả sử kếtnối bị lỗi không thực hiện được thì kết quả ra màn hình chỉ có thông báo lỗi thôi
đùng không ? . Trả lới : Sai ! Có cả thông báo đóng kếtnối nữa. Lý do : vì thẻ ‘finally’ dùng để đưa ra
thao tác cuối cùng của công việc cho nên sau khi thông báo lỗi xong nó sẽ nhảy tiếp tục thẻ ‘finally’.
+ Nếu mà kếtnối thế này có bị hao tổn tài nguyên máy không? Trả lời : Có ! Tốn cả 2 bên server
và client. Nếu mà càng nhiều kếtnối thực hiện thì hao tổn càng nhiều và làm chậm server rất nhiều và
nhiều lúc quá giới hạn cho phép sẽ không thể thực hiện được kếtnối nữa. Vì vậy sau khi mở kếtnối thành
công và hoàn thành quá trình xử lý thông tin thì phải đóng kếtnối ngay.
Page 3 of 8
Tạo kếtnốitớicơsởdữliệu Author :
Xcross87
+ Làm cách nào đảm bảo đóng/mở kếtnối đúng quy cách tránh ảnh hưởng nhiều 2 bên server và
client ? Trả lời : Bạn có thể đóng và mở kếtnối ngay trong khi ‘ try ‘ và cuối cùng đóng thêm một kếtnối
tại thẻ ‘finally’. Bạn có thể tham khảo code mẫu dưới đây :
Code minh họa đóng/ mở kếtnối an toàn :
[code]
// QUA TRINH KET NOI
try
{
// Mở kết nối
conn.Open();
Console.WriteLine("Connection opened !");
//
// Xử lý công việc online
//
// Đóng kết nối
conn.Close();
//
// Xử lý công việc offline
//
// Mở kếtnối lần nứa
conn.Open();
//
// Xử lý công việc online
//
// Đóng lại kết nối
conn.Close();
}
catch (SqlException sqle)
{
// Thông báo biến cố khi kết nối
Console.WriteLine("Error: " + sqle.Message);
}
finally
{
// Đóng kết nối
conn.Close();
Console.WriteLine("Connection closed !");
}
[/code]
Nếu như khi kếtnối mà SQLServer không xài chế độ Windows Authentication mà có username |
password riêng để truy cập (access) cơsởdữliệu (database) thì trong chuỗi kếtnối ( connection string )
bạn phải cung cấp username | password cho thông tin kết nối. Dưới đây là một ví dụ dùng username |
password để kếtnối :
Page 4 of 8
Tạo kếtnốitớicơsởdữliệu Author :
Xcross87
[code]
string connectionString = @"Server = .\SQLEXPRESS; " +
"User ID = sa; " +
"Password = pete_87";
[/code]
Ở đây : ‘sa’ là tên mặc định cho system administrator và ‘password’ là tớ đặt. Thông số này tùy thuộc vào
thông số máy chủ được cài đặt. Bạn có thể có system admin và không xài password. Lúc này password sẽ
được mặc định (default) là chuỗi rỗng (empty string) cho nên trong chuỗi kếtnối bạn có thể để tham số
là :
Password =;
Nhưng đây không phải một code tốt ^&^.
Dưới đây là bảng các tham số truyền trong chuỗi kết nối, cung cấp thông tin khi kếtnốitới máy chủ.
Name Alias Default Value Allowed Value Description
Application Name .NET SqlClient
Data Provider
Any string Name of
Application
AttachDBFileNam
e
Extended
properties, initial
file name
None Any path Full path of
attachable
database file
Connect timeout Connection
Timeout
15 0-32767 Seconds to wait
to connect
Data Source Server,Address,
Network Address
None Servername or
network address
Name of the
target SQL
Server instance
Encrypt False True,false,
Yes,no
Use SSL
encryption
Initial Catalog Database None Any database that
exists on server
Database name
Integrated security Trusted_connectio
n
False True,false,yes,no,ssp
i
Authentication
mode
Network library Net Dbmssocn Dbnmpntw,
Dbmsrpcn,
Dbmsadsn,
Dbmsgnet,
Dbmslpcn,
Dbmslpcn,
Dbmsspxn,
Dbmssocn
Network.dll
Packet Size 8192 Multiple of 512 Network packet
size in bytes
Password PWD None Any string Password if not
using win authen
Persist Security False True, false, yes, no Sensitive info
Page 5 of 8
Tạo kếtnốitớicơsởdữliệu Author :
Xcross87
Info should be passed
back after
connecting
User ID UID None Username if not
using win authen
Workstation ID Local
Computer
Name
Anystring Workstation
connecting to
SQL Server
Ví dụ một vài tham sốkếtnối :
Data Source = .\SQLEXPRESS
Server = .\SQLEXPRESS
Address = .\SQLEXPRESS
Addr = .\SQLEXPRESS
Network Address = .\SQLEXPRESS
Chú ý là : như đã nói ở trên : .\SQLEXPRESS tương đương với (local)\EXPRESS
Thử áp dụng vào viết một ứng dụng Console báo cáo thông tin vềkết nối.
Kết nốitớiSQLServer dùng SqlConnection
Dùng code mẫu sau :
[code]
using System;
using System.Data;
using System.Data.SqlClient;
public class ThongTinKetNoi
{
static void Main()
{
// Connection string
string connString = @"Server = .\SQLEXPRESS; " +
"Integrated Security = SSPI";
// Create connection
SqlConnection conn = new SqlConnection(connString);
try
{
// Open connection
conn.Open();
Console.WriteLine("Connection opened.");
Page 6 of 8
Tạo kếtnốitớicơsởdữliệu Author :
Xcross87
// Display connection properties
Console.WriteLine("Connection Properties:");
Console.WriteLine("\tConnection String:
{0}",conn.ConnectionString);
Console.WriteLine("\tDatabase: {0}",conn.Database);
Console.WriteLine("\tDataSource: {0}",conn.DataSource);
Console.WriteLine("\tServerVersion: {0}",conn.ServerVersion);
Console.WriteLine("\tState: {0}",conn.State);
Console.WriteLine("\tWorkstationId: {0}",conn.WorkstationId);
}
catch (SqlException e)
{
// Display error
Console.WriteLine("Error: " + e);
}
finally
{
// Close connection
conn.Close();
Console.WriteLine("Connection closed.");
}
}
}
[/code]
Đọc qua code bạn có thể hiểu code dùng như thế nào. Ở đây mình ghi chú thêm một vài điều
_Nếu khi kếtnối bạn không chỉ rõ là kếtnốitới database nào thì mặc định database sẽ là : master
_Nếu muốn thay đổi database kếtnối thì bạn thêm tham số ‘Database = db_name;’ vào trong chuỗi kết
nối.
_Nếu bạn đưa vào một database_name không tồn tại trong server thì sẽ gặp thông báo lỗi :
“System.Data.SqlClient.SqlException : Cannot open database ‘db_name’ requested by the login. The
login failed.”
_Workstation chỉ định tên của máy mà làm việc với máy chủ database cho nên mỗi máy kếtnốitới sẽ thu
kết quả là tên của máy. Nếu mà bạn muốn tất cả các máy kếtnốitới máy chủ SQLcó một Workstation ID
giống nhau thì trong chuỗi kếtnối (connection string) bạn thêm tham số cho Workstation ID. Ví dụ :
Workstation ID = Vo Danh Tieu Tot;
Kết nốitớiSQLServer dùng OleDbConnection
Bạn nên đọc bài : ADO.NET cơ bản do tớ viết trước rồi tham khảo ở đây cũng được.
Như đã viết ở đầu bài, khi kếtnối ta có thể luân chuyển giữa các nhà cung cấp kếtnối để kếtnốitớicơsở
dữ liệu. Ví dụ ở trên là kếtnốitớiSQLServer dùng lớp ‘SqlConnection’.
Phần này tương tự sẽ dùng lớp OleDbConnection để kếtnốitớiSQL Server.
Page 7 of 8
Tạo kếtnốitớicơsởdữliệu Author :
Xcross87
[code]
using System;
using System.Data;
using System.Data.OleDb;
public class KetNoiDungOleDbConnection
{
static void Main()
{
// Connection string
string connString = @"Provider = SqlOleDb;
Data Source = .\SQLEXPRESS;
Integrated Security = SSPI";
// Create connection
OleDbConnection conn = new OleDbConnection(connString);
try
{
// Open connection
conn.Open();
Console.WriteLine("Connection opened.");
// Display connection properties
Console.WriteLine("Connection Properties:");
Console.WriteLine("\tConnection String:
{0}",conn.ConnectionString);
Console.WriteLine("\tDatabase: {0}",conn.Database);
Console.WriteLine("\tDataSource: {0}",conn.DataSource);
Console.WriteLine("\tServerVersion: {0}",conn.ServerVersion);
Console.WriteLine("\tState: {0}",conn.State);
}
catch (OleDbException e)
{
// Display error
Console.WriteLine("Error: " + e);
}
finally
{
// Close connection
conn.Close();
Console.WriteLine("Connection closed.");
}
}
}
[/code]
Kết nốitớicơsởdữliệu không khó và phức tạp nhưng đòi hỏi kĩ năng và biết cách vận dụng khi kếtnối
một cách hợp lý, tránh hao tổn tài nguyên máy.
Kết thúc bài về ‘tạo kếtnốitớicơsởdữ liệu
Page 8 of 8
. Tạo kết nối tới cơ sở dữ liệu Author :
Xcross87
Dưới đây là tổng quan về cách kết nối tới cơ sở dữ liệu MS SQL Server 2005.
Như ở kì trước. tới cơ sở
dữ liệu. Ví dụ ở trên là kết nối tới SQL Server dùng lớp ‘SqlConnection’.
Phần này tương tự sẽ dùng lớp OleDbConnection để kết nối tới SQL Server.
Page