Giáo trình Lập trình cơ sở dữ liệu (Phần 2)

Chương 6. Giới thiệu ADO.NET  
6.1. Kiến trúc ADO.NET  
Trong những ngày đầu khi Internet mới phát triển ADO được sử dụng nhiều  
trong các ứng dụng Web viết bằng ASP. Sau này, Mircosoft nhận ra mô hình kết  
nối ADO không thích hợp cho mô hình ứng dụng Internet và những ứng dụng phân  
tán trong tương lai. Một cuộc cách mạng lớn đã diễn ra để tạo nên công nghệ hoàn  
thiện ADO.NET. ADO.NET hỗ trợ rất mạnh các ứng dụng phân tán, ứng dụng  
Internet, ứng dụng đòi hỏi tốc độ và khối lượng người truy cập đồng thời lớn.  
Trong kiến trúc ADO.NET có hai thành phần chính đó là: thành phần truy cập  
dữ liệu và thành phần lưu trữ xử lý dữ liệu.  
Thành phần thứ nhất gọi là .NET Framework Data Providers, được thiết kế để  
thực hiện các thao tác kết nối, gửi các lệnh xử lý đến CSDL, thành phần này còn  
được gọi với tên khác là lớp kết nối (Connectivity Layer). Trong ADO.NET có bốn  
đối tượng chính để xử lý phần kết nối và tương tác với dữ liệu là:  
- Connection: Đối tượng cho phép kết nối đến nguồn cơ sở dữ liệu như: SQL  
Server, Oracle, ODBC, OLEDB  
- Command: Đối tượng cho phép truy nhập CSDL và thực thi phát biểu SQL  
hay thủ tục lưu trữ của CSDL, truyền tham số và trả lại dữ liệu  
- DataReader: Bộ đọc, dùng để đọc nhanh dữ liệu nguồn theo một chiều  
- DataAdapter: Bộ điều phối hay cầu nối, dùng để chuyển dữ liệu truy vấn  
được cho các đối tượng lưu trữ và xử lý như DataSet, DataTable, DataAdapter chủ  
yếu sẽ thực hiện các thao tác truy vấn, thêm mới, chỉnh sửa, xóa dữ liệu  
Thành phần thứ hai, DataSet được xem như đối tượng chứa dùng để chứa đối  
tượng liên quan đến dữ liệu như DataTable, DataRelation, DataView, đôi khi  
DataSet còn được gọi là là lớp không kết nối (Disconnected layer). Có thể hình  
dung DataSet như một CSDL nhỏ.  
ADO.NET cung cấp một giao diện hay đặc tả cho các đối tượng như  
Connection, Command, DataReader, DataAdapter. Các nhà cung cấp sẽ đưa ra các  
trình điều khiển gọi là Provider. Mỗi Provider sẽ đặt tên cho các đối tượng theo  
136  
cách của họ, thông thường là thêm tiếp đầu ngữ của Provider vào tên 4 đối tượng  
nêu trên. Cụ thể:  
Provider SQL Server, namespace System.Data.SqlClient, sẽ thêm tiếp đầu ngữ là  
Sql vào tên của 4 đối tượng trên (SqlConnection, SqlCommand, SqlDataReader,  
SqlDataAdapter)  
Provider Oracle, namespace System.Data.Oracle sẽ thêm tiếp đầu ngữ là  
Oracle vào tên của 4 đối tượng trên.  
Provider OLEDB, namespace System.Data.OLEDB, sẽ thêm tiếp đầu ngữ là  
Oledb vào tên của 4 đối tượng trên  
Provider ODBC, namespace System.Data.ODBC, sẽ thêm tiếp đầu ngữ là  
Odbc vào tên của 4 đối tượng trên.  
6.2. Truy xuất dữ liệu với SQL Server Provider  
Để truy xuất dữ liệu với SQL Server Provider, ta khai báo sử dụng thư viện  
Provider của SQL Server bằng câu lệnh khai báo namespace sau: Imports  
System.Data.SqlClient.  
6.2.1. Đối tượng kết nối SQLConnection  
Bước đầu tiên và quan trọng khi làm việc với CSDL là kết nối từ ứng dụng  
(chương trình) đến SQL Server. Để thực hiện công việc này, sử dụng đối tượng  
SqlConnection. Các bước để khai báo đối tượng và thực hiện lệnh kết nối như sau:  
- Khai báo đối tượng kết nối:  
Dim cnn As New SqlConnection()  
- Gán thông tin kết nối: Đối tượng SqlConnection có một thuộc tính quan trọng  
là ConnectionString (chuỗi kết nối) cung cấp thông tin kết nối như: Tên máy  
chủ chứa CSDL (Server name), tên CSDL, …  
cnn.ConnectionString ="Server = Máy_chủ_chứa_CSDL;  
Database = Tên_CSDL; user=Tên_người_dùng; pwd=Mật_khẩu"  
Trong SQL Server 2005 khi làm việc với CSDL bạn có thể sử dụng file CSDL  
dạng Attachment, tức là CSDL là một file duy nhất tách riêng như CSDL của  
Access, khi ứng dụng chạy nó sẽ gắn file CSDL này vào Engine của SQL Server.  
137  
Khi ứng dụng kết thúc ta có thể tháo CSDL ra khỏi Engine bằng cơ chế gọi là  
Detach. Để kết nối CSDL dạng này ta khai báo chuỗi kết nối như sau:  
cnn.Connectionstring ="Server = Máy_chủ_chứa_CSDL;  
AttachDbFilename = Tên_CSDL; user=Tên_người_dùng;  
pwd=Mật_khẩu"  
Nếu ta đặt thông tin kết nối ngay trong mã chương trình thì sau khi biên dịch  
người dùng không thể đổi các thông tin này được nữa. Trong thực tế các thông tin  
kết nối như máy chủ CSDL, tài khoản người dùng thường thay đổi. Vì vậy, ta nên  
đặt thông tin kết nối trong file cấu hình trong VB.NET. Để thêm file cấu hình  
(app.config đối với ứng dụng Windows Forms và web.config đối ứng dụng Web  
Forms), ta chọn Projects/Add New Item, hộp thoại Add New Item xuất hiện, ta chọn  
mục Application Config file và nhấn nút Add. Sau đó ta thêm đoạn lệnh sau vào file  
cấu hình  
<connectionStrings>  
<Add  
Name = "ConnectionInfo"  
ConnectionString = "server = (local);  
Init Catalog = Tên_CSDL;  
Intergrated Security= false;User ID = Tên_người_dùng;  
Pwd = mật_khẩu />  
</ConnectionStrings>  
Để đọc nội dung trong file cấu hình ta dùng phương thức GetConnectionString  
của lớp ConnectionStringSettings trong namespace System.Configuration như sau:  
Inports System.Configuration  
Cnn.ConnectionString = GetConnectionString("ConnectionInfo")  
Để bảo mật chuỗi kết nối thay vì cho phép người sử dụng mở và đặt thông tin  
cho chuỗi kết nối vào file cấu hình, ta có thể viết một chương trình để quản lý thông  
tin kết nối. Thông tin kết nối sẽ được người sử dụng nhập vào, sau đó được mã hóa  
và lưu vào file cấu hình. Khi xây dựng chuỗi kết nối ta sẽ giải mã thông tin và đưa  
vào chuỗi kết nối.  
- Mở kết nối: cnn.open()  
138  
- Truy xuất dữ liệu  
- Đóng kết nối: cnn.Close()  
Ví dụ 6.1.  
Giả sử ta kết nối vào SQL Server 2005 với tên Server (Server name):  
GhostViet/SQLExpress; User: sa; Password: 190016 để tạo CSDL SQL Server có  
tên là qltv gồm 3 bảng:  
Sach(mas, tens, tacgia, nhaxb, namxb), với khoá chính là mas  
Docgia(madg, tendg, donvi, dienthoai), với khoá chính là madg  
Muontra(mas, madg, ngaym, ngayht, ngaytra), với các khoá ngoại là mas và  
madg.  
Để kết nối đến CSDL qltv ta tạo tệp config.ini lưu thông tin kết nối như sau:  
Tiếp theo ta khởi động Visual Studio 2005 và tạo một ứng dụng dạng  
Windows form. Tạo form1 có thuộc tính Text là Doc gia, để thực hiện các thao tác  
bổ sung, cập nhật, loại bỏ, tìm kiếm dữ liệu trên bảng Docgia trong CSDL qltv. Ta  
sẽ đưa lên form1 các điều khiển sau:  
TT  
Điều khiển  
Label1  
Thuộc tính  
Text  
Giá trị  
Mã độc giả  
1
2
3
4
5
6
7
8
9
Label2  
Text  
Họ tên độc giả  
Đơn vị công tác  
Điện thoại  
Txtma  
Label3  
Text  
Label4  
Text  
Textbox1  
Textbox2  
Textbox3  
Textbox4  
DataGridView1  
Name  
Name  
Name  
Name  
Name  
Name  
Text  
Txtten  
Txtdv  
Txtdt  
DataGridView1  
btnAdd  
10 Button1  
Add  
139  
Name  
Text  
btnupdate  
Update  
Btndel  
Delete  
btnfind  
Find  
11 Button2  
12 Button3  
Name  
Text  
Name  
Text  
13 Button4  
Form1 có dạng như sau:  
Khai báo các namespace và biến toàn cục trong cửa sổ code của form1:  
Imports System.Data.SqlClient  
Imports System.Configuration  
Public Class Form1  
Dim cnn As New SqlConnection()  
140  
„Các thủ tục được viết ở đây  
End Class  
Trong sự kiện Load của form1 ta đưa vào các dòng lệnh sau:  
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As  
System.EventArgs) Handles MyBase.Load  
Dim cnn As New SqlConnection()  
Dim cnnstr As String = My.Computer.FileSystem.ReadAllText("config.ini")  
cnn.ConnectionString = cnnstr  
cnn.Open()  
ht()  
End Sub  
Thủ tục ht() dùng để hiển thị dữ liệu trong bảng Docgia trên DataGridView1  
như sau:  
Private Sub ht()  
Dim da As New SqlDataAdapter("select * from docgia", cnn)  
Dim tb As New DataTable  
da.Fill(tb)  
Me.DataGridView1.DataSource = tb  
End Sub  
SqlDataAdapter và DataTable là các đối tượng truy nhập dữ liệu sẽ trình bày ở phần  
sau.  
6.2.2. Thực thi lệnh SQL với SqlCommand  
Sau khi quá trình kết nối hoàn tất, phần tiếp theo là tương tác với cơ sở dữ liệu  
phía Server. Ta gửi các câu lệnh SQL đến Server và nhận kết quả trả về. Để thực thi  
các câu lệnh SQL này ta thực hiện các bước sau:  
Bước 1. Khai báo đối tượng SqlCommand  
Dim cmd As SqlCommand  
Bước 2. Khởi tạo đối tượng  
Cmd = New SqlCommand  
Bước 3. Gán kết nối cho đối tượng  
cmd.Connection = cnn  
141  
Bước 4. Gán lệnh SQL cho đối tượng  
cmd.Commandtext = Câu_lệnh_SQL  
Bước 5. Thực thi câu lệnh SQL  
cmd.ExecuteReader  
Có thể viết gọn hơn (gộp 4 bước đầu) bằng cách truyền chuỗi kết nối luôn  
trong quá trình khởi tạo đối tượng như sau  
Dim cmd As SqlCommand(Câu_lệnh_SQL, cnn)  
Có 3 dạng lệnh SQL có thể dùng thông qua đối tượng Sqlcommand, chúng  
được biểu diễn bằng thuộc tính CommandType với 3 giá trị là: Command.Text,  
Command.TableDirect, Command.StoredProcedure  
Một lệnh SQL chỉ được thực thi trong thời gian cho phép , nếu quá thời gian  
này mà phía Server vẫn chưa hoàn tất thao tác xử lý và trả về kết quả thì lỗi sẽ phát  
sinh. Lỗi này gọi là lỗi Timeout (hết hạn chờ). Thời gian chờ mặc định là 30 giây, ta  
có thể thiết lập thời gian chờ bằng câu lệnh gán:  
cmd.CommandTimeout = Thời_gian_chờ;  
a) Thực thi câu lệnh Insert  
Để thêm một bản ghi vào bảng, ta thực hiện các bước sau:  
Bước 1. Khởi tạo và mở kết nối đến CSDL (cnn)  
Bước 2. Định nghĩa câu lệnh SQL Insert  
Dim sqlStr As String = " Insert…."  
Bước 3. Định nghĩa đối tượng SqlCommand  
Dim cmd As SqlCommand(sqlStr,cnn)  
Bước 4. Thực thi câu lệnh SQL  
cmd.ExecuteNoneQuery  
Bước 5. Đóng kết nối  
Cnn.Close()  
Phương thức ExecuteNoneQuery để thực thi các câu lệnh SQL không yêu cầu trả  
về tập dữ liệu, nó trả về số bản ghi trong bảng bị tác động bởi câu lệnh SQL.  
Có thể truyền tham số cho câu lệnh SQL Insert như sau:  
Dim sqlStr As String = "Insert into Tên_bảng(Danh sách cột) Values (@biến1,  
@biến2..)"  
142  
Trong cú pháp trên @biến1, @biến2 là các tham số, trước khi thực thi câu lệnh  
SQL ta phải tạo và gán giá trị cho các tham số sử dụng phương thức Parameter.Add,  
thường giá trị của tham số do người dùng nhập từ bên ngoài vào.  
Quá trình thực thi câu lệnh SQL có thể xảy ra các lỗi như: mất kết nối đường  
truyền, dữ liệu bổ sung không hợp lệ,..khi đó ta nên dùng lệnh Try/Catch để bắt và  
sửa lỗi.  
Để thực hiện câu lệnh SQL Insert bổ sung dữ liệu vào bảng Docgia trong Ví dụ  
6.1, ta viết thủ tục sự kiện Click của nút btnAdd trên form1 như sau:  
Private Sub BtnAdd_Click(ByVal sender As Object, ByVal e As  
System.EventArgs) Handles btnAdd.Click  
Dim sqlstr As String = "insert into docgia(madg,tendg,donvi,dienthoai)  
values(@ma,@ten,@dv,@dt)"  
Dim cmd As New SqlCommand(sqlstr, cnn)  
cmd.Parameters.Add("@ma", SqlDbType.NVarChar).Value = Me.txtma.Text  
cmd.Parameters.Add("@ten", SqlDbType.NVarChar).Value = Me.txtten.Text  
cmd.Parameters.Add("@dv", SqlDbType.NVarChar).Value = Me.txtdv.Text  
cmd.Parameters.Add("@dt", SqlDbType.NVarChar).Value = Me.txtdt.Text  
cmd.ExecuteNonQuery()  
ht()  
End Sub  
b) Thực thi câu lệnh Update  
Các chương trình thường thông qua câu lệnh Update để cập nhật thông tin mà  
người sử dụng yêu cầu sửa đổi. Để thực thi câu lệnh Update phục vụ việc cập nhật  
dữ liệu ta thực hiện các bước sau:  
Bước 1. Tạo và mở kết nối đến cơ sở dữ liệu  
Ví dụ:  
Dim CnnStr As String = "server = (local);database = MyDatabase;userID  
=sa;pwd ="  
Dim Cnn As New SqlConnection(CnnStr)  
Cnn.Open  
Bước 2. Định nghĩa câu lệnh SQL Update  
143  
Ví dụ:  
Dim SqlStr As String = "Update Khachhang  
Set Dienthoai = '0904666888' where Makh = 'K009'"  
Bước 3. Định nghĩa đối tượng SqlCommand  
Ví dụ:  
Dim cmd As New SqlCommand(SqlStr,Cnn)  
Bước 4. Thực thi câu lệnh SQL Update sử dụng phương thức ExecuteNoneQuery  
Ví dụ:  
Dim int recordAffect = cmd.ExecuteNoneQuery()  
Trong đó: recordAffect là biến ghi nhận số bản ghi được cập nhật.  
Bước 5. Đóng kết nối  
Ví dụ:  
Cnn.Close()  
Ta có thể truyền tham số cho câu lệnh SQl Update bằng cách tạo và gán giá trị cho  
tham số trước khi thực thi câu lệnh SQL Update. Ví dụ:  
cmd.Parameters.Add("@Dienthoai",SqlDbType.Nvarchar).Value =  
"0904666888"  
Ví dụ để cập nhật dữ liệu cho bảng Docgia trong ví dụ 6.1 ta viết thủ tục sự kiện  
Click cho nút lệnh btnUpdate trên form1 như sau:  
Private Sub btnUpdate_Click(ByVal sender As Object, ByVal e As  
System.EventArgs) Handles btnUpdate.Click  
Dim sqlstr As String = "update docgia set tendg= @ten,donvi= @dv,dienthoai  
= @dt where madg = @ma"  
Dim cmd As New SqlCommand(sqlstr, cnn)  
cmd.Parameters.Add("@ma", SqlDbType.NVarChar).Value = Me.txtma.Text  
cmd.Parameters.Add("@ten", SqlDbType.NVarChar).Value = Me.txtten.Text  
cmd.Parameters.Add("@dv", SqlDbType.NVarChar).Value = Me.txtdv.Text  
cmd.Parameters.Add("@dt", SqlDbType.NVarChar).Value = Me.txtdt.Text  
cmd.ExecuteNonQuery()  
ht()  
End Sub  
144  
c) Thực thi câu lệnh Delete  
Câu lệnh SQL Delete dùng để xóa các bản ghi trong một bảng thỏa mãn một điều  
kiện nào đó. Để thực thi câu lệnh SQL Delete xóa các bản ghi, ta thực hiện các  
bước sau:  
Bước 1. Tạo và mở kết nối đến cơ sở dữ liệu  
Bước 2. Định nghĩa câu lệnh SQL Delete  
Ví dụ:  
Dim SqlStr As String = "Delete Khachhang where Tenkh =N'Lê Thanh'"  
Chữ N trước chữ Lê Thanh trong câu lệnh SQL trên để chỉ dữ liệu dạng Unicode  
Bước 3. Định nghĩa đối tượng SqlCommand  
Bước 4. Thực thi câu lệnh SQL Update sử dụng phương thức ExecuteNoneQuery  
Bước 5. Đóng kết nối  
Việc thực thi câu lệnh SQL Delete tương tự như đối với câu lệnh SQL Update  
chỉ khác về câu lệnh SQL. Ví dụ khi ta xoá một bản ghi trên điều khiển  
DataGridView1, bản ghi đó chỉ bị đánh dấu xoá chứ chưa thực sự bị xoá khỏi bảng  
Docgia. Để xoá thực sự bản ghi ta viết thủ tục sự kiện Click cho nút btnDel trên  
form1 trong ví dụ 6.1 như sau:  
Private Sub btndel_Click(ByVal sender As Object, ByVal e As  
System.EventArgs) Handles btndel.Click  
Dim hoten As String  
hoten = InputBox("Nhập họ tên độc giả cần xóa")  
Dim sqlstr As String = "delete docgia where tendg = @ten"  
Dim cmd As New SqlCommand(sqlstr, cnn)  
cmd.Parameters.Add("@ten", SqlDbType.NVarChar).Value = hoten  
cmd.ExecuteNonQuery()  
ht()  
End Sub  
d) Thực thi câu lệnh Select  
Lệnh SQL Select cho phép ta lấy về một tập dữ liệu gồm các hàng và các cột. Để  
thực thi câu lệnh này ta thực hiện các bước sau:  
Bước 1. Tạo và mở kết nối đến cơ sở dữ liệu  
145  
Bước 2. Định nghĩa câu lệnh SQL Select  
Ví dụ:  
Dim SqlStr As String = "Select * from Khachhang where Diachi = N'Nam Định'"  
Bước 3. Định nghĩa đối tượng SqlCommand  
Bước 4. Thực thi câu lệnh SQL Select và lấy về tập dữ liệu kết quả  
Ví dụ:  
Dim reader As SqlDataReader = cmd.ExecuteReader()  
Trong đó: SqlDataReader là một bảng dữ liệu chỉ đọc và duyệt một chiều  
Bước 5. Đóng kết nối  
Ta cũng có thể truyền tham số cho lệnh SQL Select trước khi thực thi câu lệnh  
bằng cách dùng đối tượng SqlParameter.  
Để hiển thị thông tin về độc giả có Họ và tên được nhập từ bàn phím  
Private Sub btnfind_Click(ByVal sender As Object, ByVal e As  
System.EventArgs) Handles btnfind.Click  
Dim hoten As String  
hoten = InputBox("Nhập họ tên độc giả cần tìm")  
Dim sqlstr As String = "select * from docgia where tendg = @ten"  
Dim cmd As New SqlCommand(sqlstr, cnn)  
cmd.Parameters.Add("@ten", SqlDbType.NVarChar).Value = hoten  
Dim reader As SqlDataReader = cmd.ExecuteReader()  
While reader.Read()  
txtma.Text = reader.GetString(0)  
txtten.Text = reader.GetString(1)  
txtdv.Text = reader.GetString(2)  
If reader.GetValue(3).ToString <> "" Then txtdt.Text = reader.GetString(3)  
End While  
End Sub  
e) Thực thi thủ tục lưu trữ  
Để thực thi một thủ tục lưu trữ ta thực hiện các bước sau:  
146  
Bước 1. Chọn loại câu lệnh SQL bằng cách chỉ định thuộc tính CommandType là  
Command.StoredProcedure để .NET Provider biết đây là lệnh gọi thủ tục lưu trữ  
chứ không phải là lệnh SQL.  
Bước 2. Định nghĩa đối tượng SqlCommand và gán tên thủ tục lưu trữ cần thực thi  
theo cú pháp:  
Dim Tên_đối_tượng_cmd As New  
SqlCommand(Tên_thủ_tục,đối_tượng_kết_nối)  
Bước 3. Thực thi thủ tục  
Tên_đối_tượng_cmd.ExecuteNoneQuery()  
Ví dụ:  
Tạo thủ tục lưu trữ có tên là Update_KH dùng để cập nhật số điện thoại của  
khách hàng có tham số là tên khách hàng và số điện thoại được truyền từ bên ngoài.  
Create procedure Update_KH  
@TenKH Nvarchar(30),@Dienthoai NvarChar(11)  
As  
Begin  
Update Khachhang Set Dienthoai = @Dienthoai where TenKH = @TenKH  
End  
Ta thực thi thủ tục lưu trữ trên như sau  
Dim CnnStr As String = "server = (local);database = MyDatabase;userID  
=sa;pwd ="  
Dim Cnn As New SqlConnection(CnnStr)  
Cnn.Open  
Dim cmd As New SqlCommand("Update_KH",Cnn)  
cmd.Parameters.Add("@TenKH, SqlDbType.Nvarchar).Value= "Lê Thanh"  
cmd.Parameters.Add("@Dienthoai, SqlDbType.Nvarchar).Value=  
"0904123456"  
cmd.ExecuteNoneQuery()  
6.2.3. Truyền tham số với SqlParameter  
Tham số là phần quan trọng của câu lệnh SQL, nó cho phép người dùng tùy biến  
đưa dữ liệu từ bên ngoài vào và chuyển dữ liệu lên máy chủ SQL lưu trữ. Tham số  
147  
có thể dùng để lọc dữ liệu, làm điều kiện tìm kiếm, xác định mẩu tin cần cập nhật  
hay xóa. Để sử dụng tham số cho câu lệnh SQL ta thực hiện các bước sau:  
Bước 1. Khai báo đối tượng tham số  
Dim Đối_tượng As SqlParameter  
Bước 2. Khởi tạo đối tượng tham số  
Đối_tượng = New SqlParameter  
Bước 3. Đặt tên cho đối tượng tham số  
Đối_tượng.ParameterName = Tên_tham_số  
Bước 4. Định nghĩa kiểu dữ liệu cho tham số  
Đối_tượng.DbType=Kiểu_dữ_liệu  
Bước 5. Gán giá trị cho tham số  
Đối_tượng.Value = Giá_trị  
Bước 6. Đưa tham số vào đối tượng SqlCommand  
Đối_tượng_cmd.Add(Đối_tượng)  
Ta có thể gộp các bước trên để vừa tạo tham số, đưa tham số vào tập hợp và gán giá  
trị cho tham số theo cú pháp:  
Dim Thamso As SqlParameter= cmd.Parameter.Add(Tên_tham_số).Value = Giá_trị  
Các tham số có thể đóng vai trò dữ liệu đầu vào cũng có thể đóng vai trò dữ liệu đầu  
ra có nghĩa là ta có thể dùng tham số để nhận giá trị trả về. Để một tham số đóng vai  
trò là tham số đầu ra, ta gán thuộc tính Direction của đối tượng tham số là  
ParameterDirection.Output  
6.2.4. Đọc dữ liệu với DataReader  
DataReader là khái niệm chung chỉ tập dữ liệu gồm các hàng, các cột gọn nhẹ.  
Nó được thiết kế để tải dữ liệu nhanh và không cần các thông tin metadata mô tả  
cấu trúc dữ liệu. Với DataReader ta chỉ có thể duyệt dữ liệu theo một chiều. Khi cần  
đọc dữ liệu từ DataReader ta sử dụng phương thức Read() và GetValue() như sau:  
Bước 1. Khởi tạo và mở kết nối CSDL  
Bước 2. Định nghĩa câu lệnh SQL Select  
Bước 3. Định nghĩa đối tượng SqlCommand (Giả sử là cmd)  
Bước 4. Khai báo đối tượng DataReader và nhận tập dữ liệu trả về bằng cách thi  
hành lệnh SQL Select (giả sử ta dùng reader đặt tên cho đối tượng DataReader)  
148  
Dim reader As SqlDataReader= cmd.ExecuteReader()  
Bước 5. Duyệt tập dữ liệu kết quả trả về  
While reader.Read()  
'Đọc giá trị cột ví dụ combobox1.Items.Add(reader.GetValue(1))  
End while  
Bước 5. Đóng đối tượng reader và giải phóng kết nối  
reader.Close()  
Phương thức GetValue(i) dùng để đọc giá trị của một cột thứ i ( với i = 0, 1, 2…)  
là chỉ số cột của bản ghi hiện hành trong tập dữ liệu DataReader. Nếu biết rõ kiểu  
dữ liệu của cột ta có thể sử dụng các phương thức GetString(), GetInt32(),.. để tăng  
tốc độ đọc.  
Để lấy tên cột ta sử dụng phương thức GetName() của đối tượng DataReader  
Để lấy kiểu dữ liệu của cột ta sử dụng phương thức GetDataTypeName()  
Để lấy cấu trúc bảng dữ liệu ta sử dụng phương thức GetSchemaTable()  
ADO.NET 2.0 cho phép ta chứa nhiều tập kết quả trong cùng một đối tượng  
DataReader. Ví dụ ta có thể thực hiện hai câu lệnh SQL Select liên tiếp và lưu kết  
quả vào cùng một đối tượng DataReader thay vì phải sử dụng 2 đối tượng  
DataReader. Khi đó sau khi lấy hết dữ liệu từ tập dữ liệu kết quả thứ nhất, ta dùng  
phương thức NextResult() để chuyển sang tập dữ liệu kết quả thứ hai.  
6.2.5. Tương tác dữ liệu với SQLDataAdapter  
SqlDataAdapter là đối tượng không lưu trữ dữ liệu, nó chỉ phát đi các câu lệnh  
SQL và nhận dữ liệu hay kết quả trả về của CSDL, sau đó chuyển cho đối tượng  
khác (thường là DataTable).  
SqlDataAdpter nằm trong namespace là System.Data.SqlClient, đối tượng  
DataTable nằm trong namespace System.Data được coi là thư viện ngầm định của  
Visual Studio IDE khi biên dịch.  
a) Trích rút dữ liệu  
SqlDataAdapter có thể thực hiện cùng một lúc các câu lệnh SQL Select, Insert,  
Update, Delete. Để trích rút dữ liệu ta thi hành câu lệnh SQL Select từ đối tượng  
SqlDataAdapter theo các bước sau:  
Bước 1. Tạo đối tượng DataAdapter  
149  
Dim da As New SqlDataAdapter()  
Bước 2. Tạo đối tượng command thực hiện câu lệnh select  
da.SelectCommand = New SqlCommand()  
Bước 3. Gán đối tượng kết nối cho đối tượng command  
da.SelectCommand.Connection = cnn (giả sử là cnn là đối tượng kết nối)  
Bước 4. Gán câu lệnh Select cho đối tượng command  
da.SelectCommand.CommandText = "Select …."  
Bước 5. Tạo đối tượng DataTable để nhận dữ liệu kết quả trả về  
Dim t as New DataTable  
Bước 6. Thực thi câu lệnh SQL Select và đổ dữ liệu vào DataTable  
da.Fill(t)  
Bước 7. Hiển thị dữ liệu thông qua các điều khiển, chẳng hạn DataGridView  
DataGridView.DataSource = t  
Đối tượng DataTable là đối tượng chứa dữ liệu dạng bảng cho phép ta định vị  
mọi mẩu tin trong bảng thông qua chỉ số tính từ 0.  
b) Cập nhật dữ liệu  
Để cập nhật dữ liệu ta trích rút dữ liệu ra đối tượng DataTable hoặc DataSet  
(chẳng hạn là đối tượng có tên là t) bằng cách thực hiện các bước như trong mục  
6.6.1, sau đó gán câu lệnh Update cho đối tượng command sử dụng các tham số như  
sau:  
da.SelectCommand.CommandText = "Update …."  
Bước tiếp theo định nghĩa các tham số, đặt tên tham số, xác định tên cột nhận giá  
trị tham số, bổ sung tham số vào tập hợp Parameter.  
Bước cuối cùng gọi phương thức Update từ đối tượng DataAdapter: da.Update(t)  
Để minh hoạ cho việc sử dụng đối tượng SqlDataAdapter ta tiếp tục ví dụ 6.1 bằng  
cách bổ sung vào project hiện hành form2 và đưa lên form2 các điều khiển sau:  
TT  
Điều khiển  
Thuộc tính  
Giá trị  
1
DataGridView1  
Name  
Name  
Text  
Datam_t  
Btndislay  
Display  
2
3
Button1  
Button2  
Name  
btnupdate  
150  
Text  
Update  
Viết các thủ tục sự kiện cho các điều khiển như sau:  
Imports System.Data  
Imports System.Data.SqlClient  
Public Class Form2  
Dim da As New SqlDataAdapter  
Dim cnn As New SqlConnection  
Dim tb As New DataTable  
„Sự kiện Form2_Load dùng để kết nối dữ liệu và khởi tạo các đối tượng  
„SqlCommand  
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As  
System.EventArgs) Handles MyBase.Load  
Dim p As SqlParameter  
Dim cnnstr As String = My.Computer.FileSystem.ReadAllText("config.ini")  
cnn.ConnectionString = cnnstr  
cnn.Open()  
„Khởi tạo đối tượng SelectCommand  
da.SelectCommand = New SqlCommand  
da.SelectCommand.Connection = cnn  
da.SelectCommand.CommandText = "select * from muontra"  
„Khởi tạo đối tượng UpdateCommand  
da.UpdateCommand = New SqlCommand  
da.UpdateCommand.Connection = cnn  
da.UpdateCommand.CommandText = "update muontra set  
mas=@mas,ngaym=@ngaym,ngayht=@ngayht,ngaytra=@ngayt where  
madg=@madg"  
p = New SqlParameter  
p.ParameterName = "@mas"  
p.SourceColumn = "mas"  
da.UpdateCommand.Parameters.Add(p)  
151  
p = New SqlParameter  
p.ParameterName = "@ngaym"  
p.SourceColumn = "ngaym"  
da.UpdateCommand.Parameters.Add(p)  
p = New SqlParameter  
p.ParameterName = "@ngayht"  
p.SourceColumn = "ngayht"  
da.UpdateCommand.Parameters.Add(p)  
p = New SqlParameter  
p.ParameterName = "@ngayt"  
p.SourceColumn = "ngaytra"  
da.UpdateCommand.Parameters.Add(p)  
p = New SqlParameter  
p.ParameterName = "@madg"  
p.SourceColumn = "madg"  
da.UpdateCommand.Parameters.Add(p)  
„Khởi tạo đối tượng DeleteCommand  
da.DeleteCommand = New SqlCommand  
da.DeleteCommand.Connection = cnn  
da.DeleteCommand.CommandText = "delete muontra where madg=@madg"  
p = New SqlParameter  
p.ParameterName = "@madg"  
p.SourceColumn = "madg"  
da.DeleteCommand.Parameters.Add(p)  
„Khởi tạo đối tượng InsertCommand  
da.InsertCommand = New SqlCommand  
da.InsertCommand.Connection = cnn  
da.InsertCommand.CommandText = "insert into  
muontra(mas,madg,ngaym,ngayht,ngaytra)  
values(@mas,@madg,@ngaym,@ngayht,@ngayt)"  
p = New SqlParameter  
152  
p.ParameterName = "@mas"  
p.SourceColumn = "mas"  
da.InsertCommand.Parameters.Add(p)  
p = New SqlParameter  
p.ParameterName = "@madg"  
p.SourceColumn = "madg"  
da.InsertCommand.Parameters.Add(p)  
p = New SqlParameter  
p.ParameterName = "@ngaym"  
p.SourceColumn = "ngaym"  
da.InsertCommand.Parameters.Add(p)  
p = New SqlParameter  
p.ParameterName = "@ngayht"  
p.SourceColumn = "ngayht"  
da.InsertCommand.Parameters.Add(p)  
p = New SqlParameter  
p.ParameterName = "@ngayt"  
p.SourceColumn = "ngaytra"  
da.InsertCommand.Parameters.Add(p)  
End Sub  
„Thủ tục sự kiện Click của nút lệnh btnDisplay dùng để hiển thị dữ liệu trong bảng  
„Muontra lên DataGridView có tên là DataM_T.  
Private Sub btndisplay_Click(ByVal sender As Object, ByVal e As  
System.EventArgs) Handles btndisplay.Click  
da.Fill(tb)  
DataM_T.DataSource = tb  
End Sub  
„Thủ tục sự kiện Click của nút lệnh btnUpdate  
Private Sub btnupdate_Click(ByVal sender As Object, ByVal e As  
System.EventArgs) Handles btnupdate.Click  
da.Update(tb)  
153  
MsgBox("Dữ liệu đã được cập nhật")  
End Sub  
End Class  
6.3. Các đối tượng dữ liệu  
Chúng ta đã tìm hiểu các đối tượng SqlConnection, SqlCommand, SqlParameter,  
SqlDataAdapter để trích rút, cập nhật dữ liệu, trong mục này chúng ta sẽ tìm hiểu  
các đối tượng dữ liệu giúp chúng ta lập trình phía ứng dụng, chúng là những đối  
tượng độc lập với CSDL và không phụ thuộc vào .NET Provider.  
Đối với ADO.NET mỗi khi có nhu cầu về dữ liệu chương trình sẽ kết nối với  
CSDL, truy vấn dữ liệu, sau đó ngắt kết nối. Dữ liệu được đem về ứng dụng xử lý.  
Nếu có nhu cầu cập nhật hoặc thêm mới quá trình kết nối được thiết lập lại và dữ  
liệu được chuyển lê máy chủ CSDL xử lý, xử lý xong lại ngắt kết nối mô hình hoạt  
động này được gọi là Disconnected, ưu điểm của nó là CSDL có thể phục vụ được  
nhiều ứng dụng đồng thời.  
6.3.1. DataSet  
Đối tượng DataSet nằm trong namespace System.Data, để làm việc với DataSet  
trước tiên ta khai báo đối tượng DataSet như sau:  
Dim Tên_đối_tượng As DataSet  
Ví dụ: Dim ds As DataSet  
Cũng có thể vừa khai báo vừa tạo ra đối tượng mới như sau:  
Dim Đối_tượng As New DataSet()  
DataSet bao gồm một tập các bảng dạng DataTable, để truy xuất hoặc thêm bảng  
mới vào tập hợp, ta dùng thuộc tính Tables của DataSet. Ngoài ra DataSet còn có  
các phương thức sau để ta có thể thêm, xóa, tham chiếu đến đối tượng DataTable  
trong DataSet như sau:  
+ Add: Là phương thức cho phép ta thêm một đối tượng DataTable vào đối tượng  
DataSet.  
Ví dụ:  
Dim Ds As New DataSet  
Dim t As New DataTable("Employee")  
154  
Ds.Tables.Add(t)  
+ Remove: Là phương thức cho phép ta xóa một đối tượng DataTable khỏi đối  
tượng DataSet  
Ví dụ:  
Ds.Tables.Remove(t)  
Hoặc  
Ds.Tables.Remove("Employee")  
+ RemoveAt: Là phương thức cho phép ta xóa một đối tượng DataTable khỏi đối  
tượng DataSet bằng cách chỉ ra chỉ mục (chỉ số) của DataTable trong DataSet  
Ví dụ:  
Ds.Tables.Remove(0)  
+ Clear: Là phương thức cho phép ta xóa tất cả các đối tượng DataTable khỏi đối  
tượng DataSet  
Ví dụ:  
Ds.Tables.Clear()  
+ CanRemove: Là phương thức trả về giá trị True nếu tham số ứng với đối tượng  
DataTable đang tồn tại có thể cho phép loại bỏ chúng trong đối tượng DataSet.  
+ Contains: Là phương thức cho phép kiểm tra đối tượng DataTable có tồn tại trong  
đối tượng DataSet hay không. Nếu muốn biết số đối tượng DataTable tồn tại trong  
đối tượng DataSet ta dùng thuộc tính Count.  
6.3.2. DataTable  
DataTable là đối tượng được khai báo trong namespace System.Data, để làm việc  
với DataTable ta khai báo namespace như sau:  
Imports System.Data  
Để tạo đối tượng DataTable ta khai báo và khởi tạo đối tượng như sau:  
Dim t As New DataTable  
Ta cũng có thể khởi tạo đối tượng DataTable và đặt tên cho đối tượng như sau:  
Dim t As New DataTable(Tên_đối_tượng)  
155  
Tải về để xem bản đầy đủ
pdf 67 trang yennguyen 21060 Free
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình cơ sở dữ liệu (Phần 2)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_lap_trinh_co_so_du_lieu_phan_2.pdf