You are on page 1of 33

Chương 7

SQL Server và lập trình ứng


dụng
ADO.NET
• Thông qua ADO.NET chúng ta có thể kết nối
tới nhiều nguồn dữ liệu khác nhau và có thể
xây dựng các giao diện người sử dụng cho
phép truy xuất một CSDL
• Ta cần 4 đối tượng để xây dựng dự án:
– Nguồn dữ liệu: Là nơi chứa CSDL
– Một đối tượng Connection: Để kết nối tới CSDL
– Một đối tượng Data Adapter (hoặc đối tượng
Command): Cung cấp một cơ chế cho phép đọc và
ghi dữ liệu vào CSDL
– Một đối tượng Dataset: Là nơi chứa các bảng mà
chúng ta sẽ sử dụng
ADO.NET
• Nguồn dữ liệu (Data Souce): Có thể là một
CSDL, tài liệu XML, bảng tính Excel, hoặc thậm
chí một file text.
• Các kết nối dữ liệu (Data Connection):
– sử dụng đối tượng Connection để kết nối với cơ sở
dữ liệu.
– Đối tượng này có hai phiên bản đó là đối tượng
SqlConnection hoặc đối tượng OleDbConnection
– Khi chúng ta đang làm việc với SQL Server Engine
Desktop, chúng ta sẽ sử dụng đối tượng
SqlConnection
ADO.NET
• Khi tạo một kết nối sử dụng đối tượng SqlConnection, ta
cần cung cấp một số thông số kết nối sau:
– Nguồn dữ liệu - tên của máy chủ, nơi chứa nguồn dữ liệu của
bạn
– User ID and Password
– Initial Catalog: đây là tên của cơ sở dữ liệu mà chúng ta muốn
làm việc
• Ví dụ:
Dim myConnection As New SqlClient.SqlConnection()
myConnection.ConnectionString = "Data Source=localhost;" &
"Initial Catalog=NorthwindSQL;User Id=sa;Password=sa;“

Hoặc

Dim myConnection As New SqlClient.SqlConnection("Data


Source=localhost;" & "Initial Catalog=NorthwindSQL;User
Id=sa;Password=sa;""
ADO.NET
Đối tượng Command
ADO.NET
• Nếu muốn thực thi phát biểu SQL dạng hành động (Delete, Insert,
Update, Create, Drop, Alter) hay các thủ tục (Stored procedure)
hành động, ta có thể sử dụng phương thức ExecuteNonQuery của
đối tượng SqlCommand.
• Ví dụ
Dim Conn As String
Conn=”Database=Northwind;UID=sa;”
Conn+=”Server=localhost”
Dim myConn As New SqlConnection(Conn)
Dim strSQL as string
strSQL=”Delete from customers where country= ’A’”
Dim myCom As New SqlCommand (strSQL, myConn)
……………………………………
’Mở kết nối có sở dữ liệu
myConn.Open()
’Thực thi câu lệnh SQL dạng hành động
myCom. ExcuteNonQuery ()
’Đóng kết nối cơ sở dữ liệu
myConn.Close()
ADO.NET
• DataAdapter:
– Đối tượng DataAdapter được dùng như một liên kết
giữa đối tượng DataSet và nguồn dữ liệu.
– Có hai loại DataAdapters: SqlDataAdapter và
OleDbDataAdapter
– DataAdapter cho phép lựa chọn, cập nhật, xóa hoặc
là chèn dữ liệu vào nguồn dữ liệu.
– Những phương thức này được thực hiện thông qua
việc sử dụng các thuộc tính SelectCommand,
UpdateCommand, InsertCommand, và
DeleteCommand để thiết lập chuỗi lệnh cơ sở dữ liệu
cần thiết cho hoạt động cụ thể.
ADO.NET
• Cấu trúc của 1 DataAdapter
ADO.NET
• Để khai báo đối tượng DataAdapter
Dim myAdapter As SqlDataAdapter
myAdapter = New SqlDataAdapter (strSQL, myConn)

• Để điền dữ liệu từ dữ liệu nguồn vào đối tượng


DataSet, ta có thể sử dụng phương thức Fill của
DataAdapter như sau:
myAdapter.Fill(myDataSet, strSQL)

• Để cập nhật dữ liệu từ đối tượng DataSet vào dữ liệu


nguồn, bạn có thể sử dụng phương thức Update của
DataAdapter.
myAdapter.Update(myDataSet)
ADO.NET
• Đối tượng DataSet: DataSet là một container hoặc
một tập hợp các bảng, nó có thể chứa một hoặc nhiều bảng và
được duy trì chúng trong bộ nhớ. Mối quan hệ giữa các bảng cũng
được lưu trữ ở đây.
ADO.NET
ADO.NET
• DataSet có 5 đối tượng khác nhau đó là: Tables, Rows,
Columns, Constraints, and Relations collections giống
như trong CSDL
ADO.NET
• Khai báo đối tượng Dataset
Dim myDataSet As DataSet = New DataSet()
' Hoặc
Dim myDataSet As DataSet=New DataSet("MyCustomerDataSet")
Đối tượng DataTable:
DataSet chứa một tập các bảng, dataset tham chiếu tới các bảng này thông
qua thuộc tính Tables. Mỗi vùng nhớ của bảng trên bộ nhớ được tham
chiếu tới bởi DataTable, DataTables chứa nhiều hàng, các hàng này được
tạo bởi các cột
Ta có thể tạo một đối tương DataTable như sau:
Trong VB.NET
Dim myCustomerTable As DataTable = New DataTable()
' or by specifying the name for the DataTable
Dim myCustomerTable As DataTable = New DataTable("CustomerTable")
Trong C#
System.Data.DataTable myCustomerTable = new DataTable();
// Hoặc
System.Data.DataTable myCustomerTable=new DataTable("CustomersTable");
ADO.NET

• Bạn có thể thêm 1 bảng mới vào Dataset bằng phương


thức Add trong thuộc tính Tables của Dataset
Dim myDataSet As DataSet = New DataSet()
Dim myTable As DataTable= myDataSet.Tables.Add("CusTable")

• Bạn cũng có thể tham chiếu tới một bảng thông qua chỉ
số của nó trong dataset
Dim myCustomerTable As DataTable = myDataSet.Tables(0)

• Để gỡ bỏ một bảng ra khỏi dataset ta dùng lệnh


myDataSet.Tables.Remove("CustomersTable")
• Đối tượng DataColumn: Trong một bảng ta có tập hợp các cột gọi
là DataColumnCollection

Dim myDataColumn As DataColumn


For Each myDataColumn in myCustomerTable.Columns
Console.WriteLine(myDataColumn.ColumnName)
Next
• Để tham chiếu tới một cột thông qua tên cột ta sử dụng thuộc tính
Column của DataTable

Dim myColumn As DataColumn


myColumn = myCustomerTable.Columns("Address")

• Ta cũng có thể tham chiếu tới cột thông qua chỉ số:
Dim myColumn As DataColumn
myColumn = myCustomerTable.Columns(0)
Để thêm một cột mới vào một bảng ta sử dụng phương thức Add trong
thuộc tính Column của bảng:

Dim myDataSet As DataSet = New DataSet()


' Add one new table...
myDataSet.Tables.Add("CustomersTable")
' Reference the new table...
Dim myCustomerTable as DataTable =
myDataSet.Tables("CustomersTable")
' Add a address column to the new table.
myCustomerTable.Columns.Add("Address",
Type.GetType("System.String"))
Khóa chính (Primary Keys)

Bạn có thể thêm một khóa chính bằng cách thiết lập giá trị False cho thuộc tính
AllowDBNull, và giá trị true cho thuộc tính Unique của DataColumn
Dim myColumn As DataColumn =
myCustomerTable.Columns.Add("Address",
Type.GetType("System.String"))
myColumn.AllowDBNull = False
myColumn.Unique = True

Hoặc bạn có thể xác định thuộc tính PrimaryKey của một đối tượng bảng
Dim myColumn(1) As DataColumn
myColumn(0) = myCustomerTable.Columns("CustomerID")
myCustomerTable.PrimaryKey = myColumn

Nếu khóa chính được tạo bởi nhiểu trường bạn sử dụng như sau:
Dim myColumn(2) As DataColumn
myColumn(0) = myCustomerTable.Columns("CustomerID")
myColumn(1) = myCustomerTable.Columns("PostalCode")
myCustomerTable.PrimaryKey = myColumn
Đối tượng DataRow

• Đối tượng DataRow và DataColumn tạo nên đối tượng DataTable. Sử


dụng các thuộc tính và phương thức của những đối tượng này ta có thể
xem, chèn, cập nhật và xóa thông tin trong bảng
• Các hàng được biểu diễn bởi một tập hơp trong một bảng gọi là Rows
vì thế muốn truy xuất vào dòng dữ liệu đầu tiên trong bảng ta sử dụng

myCustomerTable.Rows(0)
• Để duyệt tất cả các hàng trong tập hợp DataRow ta sử dụng:

CONST ADDRESS_COLUMN As Integer = 2


Dim myDataRow As DataRow
For Each myDataRow in myCustomerTable.Rows
Console.WriteLine(myDataRow(ADDRESS_COLUMN).ToString())
’Alternative method
Console.WriteLine(myDataRow("Address").ToString())
Next
• Để thêm một dòng mới và bảng ta sử dụng phương thức
NewRow để tạo ra một đối tượng DataRow trống
' Create a new row.
Dim myRow As DataRow
myRow = myCustomerTable.NewRow()
' Set the field values.
myRow("Address") = "100 Elm Street"
myRow("City") = "Sacramento"
myRow("PostalCode") = "95825"
' Add the new row to the collection.
myCustomerTable.Rows.Add(myRow)

• Mỗi DataRow có một thuộc tính RowState để luu trữ trạng thái
của dòng đó. Ta có thể kiểm tra trạng thái của 1 dòng trước khi
thực hiện các thao tác để đảm bảo rằng nó phù hợp với các điều
kiện đặt ra. Để hiển thị trạng thái của dòng đầu tiên trong bảng ta
sử dụng lệnh:
Console.WriteLine("My Row State is " &
myCustomerTable.Rows(0).RowState.ToString())
• Để truy cập vào từng cột ta sử dụng thuộc tính Item của
DataRow. Ta có thể sử dụng chỉ mục, tên cột hoặc đối tượng cột
để truy nhập tới cột

Dim myRowNumber As Integer = 0


Dim myColumnNumber As Integer = 2
myCustomerTable.Rows(myRowNumber).Item(myColumnNumber)
' or...
myCustomerTable.Rows(myRowNumber).Item("Address")
' or...
Dim AddressColumn As DataColumn
AddressColumn = myCustomerTable.Columns("Address")
myCustomerTable.Rows(myRowNumber).Item(AddressColumn)
Các trạng thái của một dòng

Các trạng thái của một dòng đóng vai trò quan trọng trong việc trong
việc xác định dòng nào sẽ được cập nhật. Một dòng có thể có nhiều
trạng thái khác nhau. Khi bạn thay đổi, sửa một bản ghi thì dòng tương
ứng sẽ được bật cờ.

RowState Value Description

Unchanged Một dòng đã bị thay đổi kể từ khi lệnh


AcceptChanges cuối cùng được gọi
Added Một dòng mới được thêm vào và AcceptChanges
vẫn chưa được gọi
Modified Một dòng đã bị thay đổi và AcceptChanges vẫn
chưa được gọi
Deleted Một dòng đã bị xóa và AcceptChanges vẫn chưa
được gọi
Dim myRow As DataRow = myCustomerTable.Rows(0)
myRow("Address") = "200 Elm Street"
myCustomerTable.AcceptChanges()

Lưu ý rằng những phương pháp này chỉ cập nhật các bảng trong DataSet cục bộ
mà không ảnh hưởng tới CSDL trên server. Để cập nhật những thay đổi này vào
CSDL trên server ta sử dụng DataAdapter

Để xóa một dòng trong bảng ta gọi phương thức Delete của DataRowCollection

Dim myRow As DataRow = myCustomerTable.Rows(0)


myRow.Delete()
myCustomerTable.AcceptChanges()
Method Name Description
AcceptChanges Xóa tất cả các dòng có Rowstate được đánh dấu là Deleted.
Thiết lập các dòng có RowState là Modified hoặc Added là
UnChanged. Gọi EndEdit trên những dòng đã được chỉnh sửa
với BeginEdit nhưng không khai báo EndEdit
RejectChanges Phương thức này gọi CancelEdit. Tất cả các dóng có
RowState là Modified hoặc Deleted sẽ đổi thành
UnChanged.Nếu một dòng có RowState là Added thì dòng đó
sẽ bị xóa. Phương thức này có thể được gọi sau phương thức
EndEdit nhưng phải trước phương thức AcceptChanges
Delete Đánh dấu xóa một dòng bằng cách thiết lập RowState của
dòng đó là Deleted. Các dòng sẽ được xóa sau khi phương
thức AcceptChanges được thực hiện
BeginEdit Đặt một DataRow vào chế độ soạn thảo
Cập nhật CSDL

Khi bạn thực hiện các thay đổi trên DataSet làm thế nào để cập nhật những thay
đổi này vào CSDL?

Những phương thức chúng ta sử dụng sau đây giả sử rằng bạn chưa gọi
AcceptChanges trên bất cứ 1 bản ghi đã được chỉnh sửa trước khi chúng ta cập
nhật những thay đổi đó vào CSDL. Để cập nhật DataSet ta gọi phương thức
Update của DataAdapter. Nó kiểm tra RowState của mỗi dòng để xác định các
dòng đã bị thay đổi sau đó cho thực hiện các phương thức Insert, Update, or
Delete tùy theo Rowstate tương ứng
Gắn kết dữ liệu vào các điều khiển

Hầu hết các điều khiển trong hộp công cụ đều có khả năng gắn kết dữ
liệu, điều đó có nghĩa rằng chúng ta có thể chỉ định một cột, hoặc đôi
khi một nhóm các cột, từ một bảng cơ sở dữ liệu được hiển thị trong
nó. Khi bạn di chuyển qua lại giữa các dòng trong một bảng, thì nội
dung của cột hoặc các cột được chọn sẽ hiển thị trong điều khiển.
Các điều khiển có khả năng gắn kết dữ liệu bao gồm TextBoxes,
Labels, CheckBoxes, ComboBoxes và ListBoxes.
Hầu hết các điều khiển này được gắn kết dữ liệu bằng cách thiết lập
thuộc tính DataBindings.Text là tên cả một bảng mà ta muốn gắn kết.
Các điều khiển khác như DataGrid sử dụng thuộc tính DataSource và
DataMember cho việc gắn kết.
• Đối tượng DataReader

– Khi bạn muốn truy cập dữ liệu với số lượng nhỏ và không cần
xử lý hay điều hướng trên mẩu tin, bạn có thể sử dụng đối
tượng SqlDataReader hay OleDbDataReader. Lưu ý rằng chúng
ta không tìm hiểu chi tiết lý thuyết mà chỉ tập trung vào các ví dụ
cụ thể.
– Trong trường hợp bạn muốn viết đoạn chương trình dùng để
kiểm tra người sử dụng đó tồn tại trong bảng của có sở dữ liệu
SQL Server hay không, bạn chỉ cần sử dụng đối tượng
DataReader.
– Để điền dữ liệu từ dữ liệu nguồn vào đối tượng DataReader,
bạn sử dụng phương thức ExecuteReader của đối tượng
Command.

You might also like