Tiếp nội dung phần 1, Giáo trình Lập trình cơ sở dữ liệu: Phần 2 cung cấp cho người học những kiến thức như: Giới thiệu ADO.NET; Tạo báo cáo bằng Crystal report; Phân phối và đóng gói ứng dụng Visual Basic.NET. Mời các bạn cùng tham khảo!
Trang 1Chươ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
Trang 2cá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
Trang 3Khi ứ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;
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()
Trang 4- 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:
Trang 511 Button2 Name btnupdate
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()
Trang 6„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
Dim da As New SqlDataAdapter("select * from docgia", cnn)
Dim tb As New DataTable
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
Trang 7Bước 4 Gán lệnh SQL cho đối tượng
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
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 )"
Trang 8Trong 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
Trang 9Ví 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
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
Trang 10c) 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
Trang 11Bước 2 Định nghĩa câu lệnh SQL Select
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()
Trang 12Bướ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
@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ố
Trang 13có 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ố
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)
Trang 14Dim reader As SqlDataReader= cmd.ExecuteReader()
Bước 5 Duyệt tập dữ liệu kết quả trả về
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
Trang 15Dim 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.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:
Trang 16Text 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
Trang 17„Khởi tạo đối tượng DeleteCommand
da.DeleteCommand = New SqlCommand
„Khởi tạo đối tượng InsertCommand
da.InsertCommand = New SqlCommand
Trang 18„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)
Trang 19MsgBox("Dữ liệu đã được cập nhật")
EndSub
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
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")
Trang 206.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)
Trang 21Tên_đối_tượng sẽ được sử dụng để tham chiếu đến đối tượng DataTable trong đối tượng DataSet, ngoài ra ta cũng có thể dùng thuộc tính TableName để đặt tên cho đối tượng DataTable
Ví dụ:
Dim t As New DataTable
t.TableName = "Products"
sẽ tương đương với câu lệnh
Dim t As New DataTable("Products")
Các thuộc tính của đối tượng DataTable:
+ Columns: Là thuộc tính kiểu tập hợp chứa các cột dữ liệu của bảng
+ Rows: Là thuộc tính kiểu tập hợp chứa các hàng dữ liệu của bảng
Các phương thức của đối tượng DataTable:
+ GetChanges(): Là phương thức trả về một bảng chứa tất cả các dòng dữ liệu bị
người dùng thay đổi
+ RejectChange(): Là phương thức hủy bỏ tất cả các thay đổi của người dùng tác động lên dữ liệu (tương tự như hành động Undo)
+ AcceptChange(): Là phương thức chấp nhận tất cả thay đổi trên dữ liệu
+ Clear(): Là phương thức xóa tất cả dòng dữ liệu trong bảng
+ Copy(): Là phương thức dùng để tạo một bảng mới có cùng cấu trúc và các dòng
+ Load(): Là phương thức cho phép tải dữ liệu từ IdataReader vào bảng
+ LoadDataRow(): Là phương thức cho phép tải các dòng dữ liệu mới vào bảng dưới dạng mảng
+ WriteXML(): Là phương thức cho phép ghi toàn bộ cấu trúc và dữ liệu trong bảng thành tập tin cấu trúc XML
+ ReadXML(): Là phương thức cho phép tải và đọc lại nội dung bảng từ tập tin XML
Trang 22+ CreatDataReader(): Là phương thức cho phép tạo đối tượng DataReader từ bảng
dữ liệu hiện hành
6.3.3 BindingSource
BindingSource là điều khiển cho phép điều khiển việc di chuyển qua các bản ghi trên bảng DataTable và theo theo dõi vị trí của bản ghi hiện hành bằng các lệnh chương trình BindingSource cung cấp các phương thức MoveFirst(), MoveNext(), MovePrevious(), MoveLast() để ta di chuyển vị trí của con trỏ bản ghi Để sử dụng đối tượng BindingSource ta thực hiện các bước sau:
Bước 1 Khai báo đối tượng BindingSource
Dim Binding As New BindingSource
Bước 2 Tạo đối tượng DataTable (ví dụ t là đối tượng DataTable)
Bước 3 Ràng buộc đối tượng BindingSource với bảng dữ liệu, sử dụng thuộc tính DataSource của đối tượng BindingSource
+ DataType: dùng để xác định kiểu dữ liệu cho cột trong bảng
+ AllowDBNull: dùng để quy định cột có được nhận giá trị Null hay không, thuộc tính trên nhận giá trị True nghĩa là cột có thể nhận giá trị Null, ngược lại không cho phép cột nhận giá trị Null
+ Caption: dùng để đặt tiêu đề cho cột
+ ColumnName: dùng để đặt tên cột
+ DefaultValue: dùng để gán giá trị mặc định cho cột
+ Unique: dùng để quy định cột thể nhận giá trị trùng nhau hay không
Để bổ sung một cột vào bảng t ta thực hiện các bước sau:
Bước 1 Khai báo đối tượng DataColumn
Dim column As DataColumn
Trang 23Bước 2 Thiết lập giá trị cho các thuộc tính của đối tượng column như: DataType, ColumnName, AllowDBNull, DefaultValue,…)
Bước 3 Dùng phương thức Add của đối tượng DataTable để thêm cột vào tập hợp Columns trong bảng t
t.Columns.Add(column)
6.3.5 DataRow
Trong khi đối tượng DataColumn dùng để xây dựng nên cấu trúc của bảng cho đối tượng DataTable thì đối tượng DataRow nắm giữ các dòng dữ liệu cho đối tượng DataTable Để khai báo và sử dụng đối tượng DataRow ta thực hiện các bước sau:
Bước 1 Khai báo và khởi tạo đối tượng DataTable (Ví dụ là đối tượng t)
Bước 2 Khởi tạo đối tượng DataRow sử dụng phương thức NewRow của đối tượng DataTable
Dim r As DataRow = t.NewRow()
Bước 3 Gán dữ liệu cho dòng
r(Tên_cột_1) = Giá_trị_1
r(Tên_cột_2) = Giá_trị_2
………
Ví dụ:
r("Name") = "Nguyễn Tuấn Anh"
Bước 4 Dùng phương thức Add của đối tượng Datatable để bổ sung dòng dữ liệu vào bảng
t.Rows.Add(r)
DataRow cung cấp các thuộc tính và phương thức thông dụng sau để ta làm việc với
dữ liệu:
+ RejectChange(): Hủy bỏ tất cả các thay đổi trên một dòng dữ liệu
+ AcceptChange(): Chấp nhận tất cả các thay đổi trên một dòng dữ liệu
+ CancelEdit(): Hủy bỏ trạng thái nhập liệu hiện hành đang diễn ra trên dòng dữ liệu
+ Delete(): Xóa dòng dữ liệu hiện hành
Trang 24+ RowState: Trả về trạng thái của dòng dữ liệu
+ GetChildRows(): Trả về danh sách các dòng con dựa vào quan hệ DataRelation + GetParentRow(): Trả về dòng cha trong mối quan hệ với DataRelation
6.3.6 DataRelation
DataRelation cho phép thiết lập mối quan hệ giữa các bảng Để tạo mối quan hệ giữa hai bảng, ta thực hiện các bước sau:
Bước 1 Khai báo và khởi tạo đối tượng DataSet ( giả sử là đối tượng ds)
Bước 2 Khai báo và khởi tạo hai đối tượng DataTable (giả sử là t1 và t2)
Bước 3 Tạo quan hệ giữa hai bảng
Dim rel As New DataRelation(Tên_mối_qh,t1.Columns(T_cột), t2.Columns(T_cột) Bước 3 Thêm mối quan hệ vào DataSet
Dim view As New DataView
Mỗi đối tượng DataView cần một nguồn dữ liệu DataTable, để xác định nguồn
dữ liệu cho DataView ta sử dụng thuộc tính Table của đối tượng DataView như sau: View.Table = Đối_tượng_DataTable
Đối với DataTable thì DataRow là các dòng dữ liệu, còn đối với DataView thì các dòng dữ liệu được quản lý bởi DataRowView DataRowView cho biết vị trí của
dữ liệu trong DataView, bản chất của nó là không nắm giữ dữ liệu mà nó tham chiếu đến dữ liệu trong Datatable DataRowView cung cấp thuộc tính Count cho biết số dòng dữ liệu mà nó quản lý
DataView cung cấp một số thuộc tính và phương thức thông dụng:
+ RowFilter: dùng để lọc dữ liệu (giống mệnh đề where trong câu lệnh SQL)
+ Sort: Dùng để sắp xếp dữ liệu
Trang 25+ AllowDelete: dùng để thiết lập có cho phép xóa dòng dữ liệu trên DataView hay không
+ AllowEdit: dùng để thiết lập có cho phép sửa dữ liệu trên DataView hay không + AllowNew: dùng để thiết lập có cho phép thêm dòng dữ liệu mới vào DataView hay không
+ AddNew(): là phương thức cho phép thêm mới một bản ghi vào DataView, cũng
có nghĩa là thêm vào DataTable
+ Delete(): là phương thức cho phép xóa bản ghi trong DataView dựa vào chỉ số dòng
+ ToTable(): Là phương thức cho phép sao chép hoặc chuyển toàn bộ các bản ghi từ DataView sang một DataTable khác
6.4.2 DataGridView
DataGridView là điều khiển dùng để tiếp nhận và trình bày dữ liệu trong đối tượng DataSet, DataTable, DataView Để lấy dữ liệu từ các đối tượng dữ liệu này ta gán thuộc tính DataSource cho đối tượng DataGridView như sau:
+ Đối với đối tượng DataTable và DataView, ta gán trực tiếp tên đối tượng DataTable
Ví dụ: DataGridView1.DataSource = t (t là đối tượng DataTable hoặc DataView) + Đối với đối tượng DataSet, ta phải thông qua thuộc tính DataMember
Ví dụ: DataGridView1.DataSource = ds (ds là đối tượng DataSet)
DataGridView1.DataMember = Tên_bảng_trong_DataSet
Để lấy ra thông tin đang chọn trên điều khiển DataGridView ta dùng thuộc tính CurrentRow Thuộc tính này trả về đối tượng DataGridViewRow chứa thông tin về dòng đang chọn trên khung lưới
Để lấy thông tin của ô hiện hành ta dùng thuộc tính CurrentCell Ngoài ra để biết được số lượng hàng và cột đang được trình bày trên điều khiển DataGridView ta dùng các thuộc tính RowCount và ColumnCount
Điều khiển DataGridView còn cung cấp một số sự kiện như:
+ SelectionChange: là sự kiện xảy ra khi người sử dụng di chuyển con trỏ sang dòng dữ liệu khác trên điều khiển DataGridView
Trang 26+ DoubleClick: là sự kiện xảy ra khi người sử dụng Click đúp chuột trên điều khiển DataGridView
Ta có thể thêm các điều khiển như: Button, Textbox, Combobox, Image, Link hay Checkbox vào điều khiển DataGridView để phục vụ việc nhập dữ liệu trong lúc thiết kế hoặc bằng câu lệnh bằng cách Click chuột phải vào điều khiển DataGridView trên form rồi chọn Edit Columns, hộp thoại Edit Columns xuất hiện,
ta chọn thuộc tính ColumnType là DataGridViewButtonColumn hoặc
DataGridViewTextboxColumn hoặc DataGridViewComboboxColumn để thêm các điều khiển Button, Textbox hoặc Combobox vào DataGridView
6.5 Ràng buộc dữ liệu (Binding) với các điều khiển
Để ràng buộc dữ liệu với các điều khiển dữ liệu ta thực hiện các bước sau:
Bước 1 Khai báo đối tượng BindingSource
Dim Binding As New BindingSource
Bước 2 Gán nguồn dữ liệu cho điều khiển BindingSource
Trang 28Chương 7 Tạo báo cáo bằng Crystal report 7.1 Thiết kế báo cáo
Để tạo cáo báo ta mở một project và tạo các file rpt trong đó Việc thêm một báo cáo vào project bao gồm 10 bước
Bước 1 Từ thanh thực đơn, chọn Project/Add New Item để mở hộp thoại Add New Item
chọn Crystal Report, gõ tên báo cáo rồi Click chuột vào nút Add để thêm một bản
báo cáo vào Project hiện hành
Bước 2 Crystal Report Wizard sẽ nhắc ta chọn kiểu báo cáo cần xây dựng Giữ nguyên báo cáo chuẩn mặc định, rồi Click OK
Trang 29Bước 3 Crystal Report Wizard hiển thị hộp thoại Standard Report Creation Wizard
Click vào dấu cộng trong thư mục Create new connection trong hộp danh sách
Available Data Sources
Trang 30thấy xuất hiê ̣n hộp thoại OLE DB (ADO) Chọn Microsoft Jet 4.0 OLE Provider, rồi Click nút Next
Trang 31Bước 4 Chọn cơ sở dữ liệu Access cần kết nối trong mu ̣c Database Name
Trang 32nhấn nút Finish để quay về hộp thoại Standard Report Creation Wizard
Bước 5 Trong hộp thoại Standard Report Creation Wizard, chọn nháy đúp chuột chọn bảng Sach, Muontra, docgia để lập báo cáo, rồi nhấn nút Next
Trang 33Bước 6 Thiết lâ ̣p liên kết (Link) giữa các bảng khi ta cho ̣n nhiều bảng để lâ ̣p
báo cáo