Xem mẫu
- 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
- - 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 Thuộc tính Giá trị
1 Label1 Text Mã độc giả
2 Label2 Text Họ tên độc giả
3 Label3 Text Đơn vị công tác
4 Label4 Text Điện thoại
5 Textbox1 Name Txtma
6 Textbox2 Name Txtten
7 Textbox3 Name Txtdv
8 Textbox4 Name Txtdt
9 DataGridView1 Name DataGridView1
Name btnAdd
10 Button1
Text Add
139
- Name btnupdate
11 Button2
Text Update
Name Btndel
12 Button3
Text Delete
Name btnfind
13 Button4
Text Find
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 Datam_t
Name Btndislay
2 Button1
Text Display
3 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
nguon tai.lieu . vn