BÀI 3 : XÂY DỰNG WEB ĐỘNG
3. Các đối tượng ADO.Net:
3.1. Các đối tượng trong ADO.Net
ADO.Net là đối tượng dùng để thao tác với cơ sở dữ liệu trong .NetFramework, các ngôn ngữ lập trình trong Visual Studio (VB.Net, C#,..) dùng phương thức kết nối này để giao tiếp với cơ sở dữ liệu. Lõi của các lớp ADO.NET tồn tại trong namespace System.Data. Phần quan trọng nhất của chúng là các tên miền System.Data.SqlClient và System.Data.OleDb. Chúng cung cấp các classes sử dụng cho việc truy cập SQL Server databases và OLE (Object Linking and Embedding) DB-compliant databases (phục hồi dữ liệu).
- Mannaged Provider Component: bao gồm các đối tượng như: DataAdapter, DataReader, Connection, Command giữ nhiệm vụ làm việc trực tiếp với dữ liệu như datatbase, file,..
- Content Component: bao gồm các đối tượng như DataSet, DataTable, DataView, DataRow, DataColumn, DataRelation đại diện cho dữ liệu thực sự cần làm việc.
Bảng ADO.Net Data Objects giới thiệu sơ lược các đối tượng dùng để thao tác dữ liệu:
Object Ý nghĩa
DataSet
Sử dụng cùng với các điều khiển dữ liệu khác, dùng lưu trữ các kết quả được trả về bởi các đối tượng commands và data adapters. Data set là một view phân cấp của dữ liệu, bằng việc sử dụng các thuộc tính và các collections trong đối tượng DataSet, ta có thể nhận được toàn bộ các quan hệ (relations), các tables riêng biệt, rows, và columns.
DataTable
Là một đối tượng của dataset, đối tượng DataTable cho phép thao tác dữ liệu trong một table riêng biệt. Được dung tương tự như đối tượng recordset trong ADO.
DataView Sử dụng đối tượng này để lọc, sắp xếp dữ liệu, duy trì các views khác nhau của dữ liệu.
DataRow Đối tượng thao tác các rows của dữ liệu trong datatables. Dùng thực hiện các thao tác adding, deleting, và modifying records. DataColumn Nhận các thông tin tại các cột bằng việc sử dụng đối tượng DataColumn.
DataRelation Chứa các mối ràng buộc trong cơ sở dữ liệu
Bảng NET Data Provider Classes thường được sử dụng để thao tác dữ liệu: Command Tương tự như đối tượng ADO Command, cho phép ta thực
hiện các stored procedures trong code.
Connection
Đây là đối tượng mở kết nối tới server và database mà ta muốn làm việc. Khác với đối tượng ADO Connection, cách thức kết nối phụ thuộc vào đối tượng mà ta muốn làm việc, như là đối tượng DataReader hay DataSet.
SQL và điền dữ liệu vào datasets. Nó cũng cho phép tạo các
action queries cần thiết, như là Insert, Update, và
Delete.
DataReader
Đối tượng này tạo một read-only, forward-onlystream của dữ liệu mà cho phép chúng đặt trên các điều khiển, như
ListBox và ComboBox.
Parameter Đây là đối tượng cho phép chỉ định các tham số mà các đối tượng DataAdapter có thể chỉ định và sử dụng.
Ngoài ra, hai tên miền con khác cũng tồn tại trong tên miền System.Data, đó là: System.Data.OracleClient và System.Data.Odbc.
Như vậy, các tên miền System.Data.SqlClient, System.Data.OleDb, System.Data.OracleClient, và System.Data.Odbc được biết như là data providers trong ADO.NET, chúng có cách thức làm việc tương tự nhau.
Trong phần này trọng tâm tìm hiểu lớp System.Data.SqlClient để làm việc với Database xây dựng trên SQL Server.
3.2. Các lớp SqlClient trong mô hình ADO.Net
Danh sách sau chứa các classes ADO.NET mà chúng sẽ được sử dụng trong quá trình xây dựng ứng dụng sử dụng SQL Server Databases: SqlConnection, SqlDataAdapter, SqlCommand, SqlParameter, SqlDataReader.
Để sử dụng provider này cần phải viết lệnh Imports (khai báo Namespace) trên đầu mỗi class:
<%@ Import Namespace="System.Data.SqlClient" %>
Nếu ta muốn sử dụng lõi của classes ADO.NET, như là DataSet và
DataView không cần gõ đầy đủ tên miền, cần phải Import tên miền System.Data như sau:
<%@ Import Namespace="System.Data" %>
Sau đây là các classes chính tồn tại trong namespace System.Data.SqlClient.
3.2.1. Class SQLConnection
Class SqlConnection cung cấp một connection tới SQL Server database. Khi xây dựng một đối tượng SqlConnection có thể chọn để chỉ định một chuỗi kết nối (connection strings) như một tham số. Chuỗi connection chứa tất
cả các thông tin cần thiết để mở một connection tới database. Nếu ta không chỉ định chuỗi kết nối trong khi xây dựng, có thể thiết lập nó bằng việc sử dụng thuộc tính SqlConnection.ConnectionString.
Khai báo chuỗi kết nối trong VB.net:
Dim strconn As String="server=AA;database=QLDiemSV; user id=sa;password=pass2008")
Dim objConnection As New SqlConnection(strconn)
Các tham số của chuỗi kết nối (Connection String Parameters)
Bảng Tham số của chuỗi kết nối.
Tham số Môtả
Server
Tên của SQL Server mà ta muốn truy xuất. Nó thường là tên của máy tính đang chạy SQL Server. Ta có thể sử dụng (local) hoặc localhost nếu SQL Server trên cùng một máy đang chạy ứng dụng. Nếu bạn sử dụng các thể hiện tên của SQL Server, thì tham số nên chứa tên của máy tính theo sau là đấu gạch chéo ngược và tiếp đó là thể hiện tên của SQL Server.
Database Là tên của database mà ta muốn connect tới. User ID
Username sử dụng để connect tới database. account với user ID này phải tồn tại trong SQL Server và được phép truy cập đến database chỉ định.
Password Là password của user đã chỉ định.
Chuỗi kết nối này sẽ connects tới SQL Server database. Tham số Server chỉ định là database nằm trên máy AA. Tham số Database chỉ định database mà ta muốn truy cập, trong trường hợp này là database QLDiemSV. Cuối cùng, các tham số User ID và Password chỉ định User ID và password của user định nghĩa trên database. Ta thấy rằng, mỗi một tham số được gán một giá trị qua dấu =, và mỗi cặp parameter - value được phân cách nhau nhau bởi dấu chấm ;.
Dim objConnection As SqlConnection = New _
SqlConnection(“Server=localhost;Database=pubs;” & _ “User ID=sa;Password=vbdotnet;”)
Ta nên khai báo chuỗi kết nối trong tệp web.config như sau: - Sử dụng <appSettings>
<add key="conn" value="server=AA;database=QLBanHang;user id=sa;password=Pass2008" />
</appSettings>
Sau đó sử dụng hàm ConfigurationManager.AppSettings("Conn") để lấy chuỗi kết nối đó:
Dim strConn As String
'Lấy chuỗi kết nối CSDL
strConn = ConfigurationManager.AppSettings("Conn")
Dim myConn As New SqlConnection(strConn) - Sử dụng <appSettings>
<connectionStrings>
<add name="MyConn" connectionString="Data Source=.\SQLEXPRESS;Initial
Catalog=QLBanHang;User ID=””;Password=””"
</connectionStrings>
Sau đó sử dụng hàm ConfigurationManager.ConnectionStrings ("MyConn").ToString để lấy chuỗi kết nối đó:
Dim strConn As String
'Lấy chuỗi kết nối CSDL
strConn=ConfigurationManager.ConnectionStrings("MyConn").T oString
Dim myConn As New SqlConnection(strConn)
Một số phương thức thường dùng của Connection
objConnection.Open(): mở kết nối đến cơ sở dữ liệu cùng với các thông tin đã được khai báo trong ConnectionString .
objConnection.Close(): Đóng kết nối với nguồn dữ liệu. Sử dụng phương thức này để đóng Connection đang mở.
objConnection.Dispose(): Xóa mọi tài nguyên liên quan đến Connection trên vùng nhớ.
3.2.2. Class SQLCommand
Lớp SqlCommand đại diện cho các câu lệnh SQL để thực hiện truy vấn dữ liệu lưu trữ. Các câu lệnh là truy vấn select, insert, update, hoặc delete,.v.v…
Có thể là các chuỗi SQL hoặc gọi một stored procedure. Truy vấn được thực hiện có thể chứa các tham số hoặc không chứa các tham số.
Bảng Các thành phần của SqlCommand
Thành phần Ý nghĩa
CommandTimeout Lấy ra hoặc thiết lập thời gian chờ trong khi đang thực thi lệnh trước khi kết thúc.
Connection Lấy ra hoặc thiết lập SqlConnection được dùng bởi thể hiện này của SqlCommand.
Cancel() Hủy bỏ việc thực thi của một lệnh.
ExecuteReader() Thực hiện câu lệnh trong CommandText. Kết quả trả về là DataReader của trình cung cấp dữ liệu.
ExecuteNonQuery() Thực hiện câu lệnh trong CommandText và không có kết quả trả về.
ExecuteScalar() Thực hiện câu lệnh trong CommandText, kết quả trả về là một giá trị đơn.
ExecuteXmlReader() Phương thức này trả về một System.Xml.XmlReader mà cho phép xử lý luồng đầu vào của XML
Parameters Lấy ra tập hợp các kiểu của SqlParameter được dùng cho một truy vấn có tham số.
Prepare() Tạo một phiên bản được chuẩn bị (hoặc được biên dịch) của lệnh trên nguồn dữ liệu.
Khai báo:
Dim objCommand As SqlCommand = New SqlCommand() Hoặc:
Dim objCommand As SqlCommand = New SqlCommand(strSQL, objConnection)
Trong trường hợp này, chuỗi truy vấn strSQL và objConnection phải được khai báo hoặc đã được gọi ở thủ tục nào trước đó.
Một số thuộc tính thường gặp:
Thuộc tính Ý nghĩa Cú pháp
Connection Thuộc tính này thiết lập tới đối tượng SqlConnection
objCommand.Connection = objConnection
CommandText Chỉ định chuỗi Sql hoặc stored procedure sẽ được thực hiện
objCommand.CommandText
= “giá trị chuỗi”
CommandType Giá trị chỉ định nội dung
CommandText phải dùng là gì:
- - Text: (mặc định) lệnh Sql. - - TableDirect: Tên của một hoặc
nhiều bảng.
cmd.CommandType =CommandType.Giatri
- - Storedprocedure: tên thủ tục nội tại trong cơ sở dữ liệu.
Ví dụ:
‘ Khai báo biến
Dim objConnection As New SqlConnection _ ("server=AA;database=QLDiemSV;user id=sa;password=pass2008")
Dim objCommand As SqlCommand = New SqlCommand()
‘Mở kết nối
objConnection.Open()
objCommand.Connection = objConnection objCommand.CommandText = "INSERT INTO HOSOSV " & _"(MaSV, HoDem, TenSV, NgaySinh, MaLop) " &_
"VALUES(@MaSV,@Hodem,@TenSV,@NgaySinh,@MaLop)"
' Add parameters for the placeholders in the SQL in the
objCommand.Parameters.AddWithValue("@MaSV", txtMaSV.Text) objCommand.Parameters.AddWithValue("@Hodem", txtHodem.Text) objCommand.Parameters.AddWithValue("@TenSV", txtTenSV.Text) objCommand.Parameters.AddWithValue("@NgaySinh",_ txtNgaySinh.Text).DbType = DbType.Date objCommand.Parameters.AddWithValue("@MaLop", cboMaLop.Text)
- Phương thức AddWithValue thừa nhận tên của tham số và giá trị ta muốn truyền cho tham số. Trong trường hợp này, ta sử dụng thuộc tính Text của đối tượng Text box trên cùng một Form.
- Phương thức Add được sử dụng để khai báo tham số và truyền giá trị cho tham số sử dụng thuộc tính Value của tham số đó.
objCommand.Parameters.Add("@Address", Data.SqlDbType.NVarChar, 255) objCommand.Parameters("@Address").Value = txtAddress.Text
Sau đây là một số phương thức thực hiện các câu lệnh khi connection đã
được mở.
* Phương thức ExecuteNonQuery
Phương thức này thực hiện câu lệnh SQL chèn dữ liệu vào database. Để hoàn thành đoạn code, ta phải mở connection, thực hiện query, và đóng connection trở lại:
Ví dụ:
Dim objConnection As New SqlConnection _ ("server=AA;database=QLDiemSV;user id=sa;password=pass2008")
Dim objCommand As SqlCommand = New SqlCommand()
HOSOSV (MaSV, HoDem) VALUES(@MaSV,@Hodem,@TenSV,@NgaySinh,@MaLop)" objCommand.Parameters.AddWithValue("@MaSV", txtMaSV.Text) objCommand.Parameters.AddWithValue("@Hodem", txtHodem.Text) objConnection.Open() ' Thực hiện chèn dữ liệu Try objCommand.ExecuteNonQuery() Catch SqlExceptionErr As SqlException
MessageBox.Show(SqlExceptionErr.Message) End Try
objConnection.Close()
* Phương thức ExecuteReader
Phương thức ExecuteReader của đối tượng SqlCommand sẽ thực hiện truy vấn trả về kết quả trên đối tượng DataReader. Và dữ liệu trên DataReader thường được đổ sang các điều khiển ListBox, ComboBox trên form ứng dụng.
Ví dụ:
' Khai báo các biến
Dim objCommand As SqlCommand = New SqlCommand() Dim objDataReader As SqlDataReader
objConnection.Open()
objCommand.Connection = objConnection
objCommand.CommandText = "Select MaLop, TenLop From Lop"
' Execute the SqlCommand object to insert the new data... objDataReader = objCommand.ExecuteReader cboMaLop.Items.Clear() Do While (objDataReader.Read()) cboMaLop.Items.Add(objDataReader.Item(0)) Loop objConnection.Close() * Phương thức ExecuteScalar
Là phương thức trả về một giá trị vô hướng.
cmd.CommandText = " Select OrderID From Orders " & _ "Where(MemberName=@MemberName) and
(OrderDate=@OrderDate) and (CustomerName=@CustomerName)and
(Address=@Address) and (County=@County) and (PostCode=@PostCode) and (Country=@Country) and (SubTotal=@SubTotal) and (Discount=@Discount) and ( Total=@Total)"
OrderID = Convert.ToInt32(cmd.ExecuteScalar())
3.2.3. Class SQLDataAdapter
DataAdapter sử dụng các đối tượng command và connection để truy xuất và điều khiển data source.
Khai báo:
Dim objDataAdapter As New SqlDataAdapter() Khởi tạo:
objDataAdapter = New SqlDataAdapter(<lệnh>, <objConnection>) Trong đó:
- <Lệnh>: câu lệnh truy vấn hoặc tên storedprocedure để thực hiện truy xuất từ nguồn dữ liệu.
- <objConnection>: đối tượng Connection đã kết nối với cơ sở dữ liệu.
Các thuộc tính:
Thuộc tính Ý nghĩa
SelectCommand Chứa nội dung lệnh truy xuất các mẫu tin từ nguồn dữ liệu DelectCommand Chứa nội dung lệnh hủy các mẫu tin từ nguồn dữ liệu
InsertCommand Chứa nội dung lệnh chèn các mẫu tin mới vào nguồn dữ liệu UpdateCommand Chứa nội dung lệnh cập nhật các mẫu tin từ nguồn dữ liệu
Phương thức Fill
Ta dùng phương thức Fill để đưa dữ liệu vào đối tượng DataSet. Cần phải khởi tạo đối tượng DataSet trước khi sử dụng nó. Để sử dụng đối tượng DataSet trong project của ta, ta phải add một tham chiếu tới System.Xml.
- Fill (<datatable>): Đổ dữ liệu vào DataTable có sẵn.
- Fill (<dataset>): Đổ dữ liệu vào DataSet có sẵn. Dữ liệu được lấy về DataSet dưới dạng DataTable. Với tên mặc định là table1, table2,..
- Fill (<dataset>, <tên datatable>): Đổ dữ liệu vào DataSet cho bảng <tên datatable>, nếu chưa có bảng này, bảng <tên datatable> sẽ được tạo ra (cách này thường được sử dụng).
Đối số DataSet chỉ định một đối tượng DataSet hợp lệ mà dữ liệu được lưu trữ ở trong đó. Chú ý rằng, một DataSet có thể chứa nhiều bảng, thường tốt nhất là sử dụng tên của các bảng nơi mà dữ liệu trong database đến. Nó giúp cho văn bản code của ta và làm cho code dễ bảo trì.
Ví dụ:
Đoạn code sau gọi phương thức Fill. Chuỗi “authors” được chỉ định là đối số string. Nó là tên ta muốn sử dụng khi đang thao tác trong các phiên bản nhớ của bảng này; nó cũng là tên của bảng trong data source.
‘ Declare a SqlDataAdapter object...
Dim objDataAdapter As New SqlDataAdapter()
‘Create an instance of a new select command object objDataAdapter.SelectCommand = New SqlCommand()
‘ Set the SelectCommand properties...
objDataAdapter.SelectCommand.Connection = objConnection objDataAdapter.SelectCommand.CommandText = “usp_select_DSSV”
objDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure Dim objDataSet as DataSet = New DataSet()
‘ Fill the DataSet object with data...
objDataAdapter.Fill(objDataSet, “DSSV”)
Phương thức Fill sử dụng thuộc tính SelectCommand.Connection để connect tới database. Nếu connection đã được mở, data adapter sẽ sử dụng nó để thực hiện SelectCommand. Và nếu như connection đã đóng thì data adapter sẽ mở nó, thực hiện SelectCommand, và sau đó đóng trở lại. Bây giờ ta đã có dữ liệu trong bộ nhớ, và có thể bắt đầu thao tác mà không phụ thuộc vào data source.
3.2.4. Class DataSet
- Là lớp dùng để thao tác với dữ liệu, được xem như một kho chứa các table. Dữ liệu có thể cập nhật trong các bảng này và khi muốn cập nhật vào cơ sở dữ liệu thì DataSet sẽ thực hiện việc cập nhật thông qua DataAdapter. Vì vậy nó được xem là mô hình dữ liệu phi kết nối.
- Các bảng trong DataSet có thể được tạo thành từ lớp DataTable hoặc do DataAdapter Fill vào.
- Một DataSet có thể lưu trữ nhiều bảng.
Khai báo: Dim objDataSet = New DataSet()
Các phương thức quan trọng của DataSet:
Phương thức Ý nghĩa Cú pháp
Add Đưa bảng vào DataSet objDataSet.Tables.Add(<t
Remove Xóa bảng objDataSet.Tables.Remove
(<tênbảng>)
Contains Kiểm tra bảng có thuộc về DataSet objDataSet.Tables. Contains (<tênbảng>)
CanRemove True: nếu có thể xóa bảng objDataSet.Tables.CanRem
ove(<tênbảng>)
Clear Xóa tất cả các bảng objDataSet.Tables.Clea()
Dispose Xóa DataSet objDataSet. Dispose()
Clear Xóa toàn bộ nội dung trong DataSet
objDataSet .Clear()
DataTable:
Khai báo: Dim objDataTable = New DataTable()
Là đối tượng chứa dữ liệu trên Dataset. Được tạo lập từ DataRows và DataColumns.
- DataColumns: tập hợp các cột có trong DataTable. Khai báo:
Dim tencot = New DataColumns(<tên cột>, <kiểu dữ liêu>) Trong đó: <kiểu dữ liêu> là kiểu dữ liệu của cột, được khai báo thông qua cú pháp System.Type.GetType(“System.Tenkieu”).
Đưa cột vào bảng: tenbang.Columns.add(tencot)
- DataRows: tập hợp các dòng dữ liệu của bảng. Mọi tham chiếu dòng đều thông qua tập hợp này.
Các thuộc tính:
Thuộc tính Ý nghĩa Cú pháp
Count Số dòng dữ liệu có trong DataTable Rows.Count Item(i)
/ Rows(i)
Tham chiếu đến dòng i Rows.Item(i) /Rows(i)
Item(i)(j) Tham chiếu đến dòng i cột j Rows.Item(i)(j) Item(i)(“Tên
cột”)
Tham chiếu đến cột có tên cột trên dòng i
Rows.Item(i)(“Tên
cột”)
Các phương thức:
Phương thức Ý nghĩa Cú pháp
Add Thêm dòng vào Table TableName.Rows.Add(
<dong>)
RemoveAt Xóa dòng khỏi bảng Rows.RemoveAt(<chỉ
số>)
Remove Xóa dòng khỏa bảng Rows.Remove(dòng)
3.2.5. DataView
DataView là khung nhìn của DataTable, dùng hiển thị dữ liệu mà người dùng muốn lấy từ Datatable.
Khai báo:
Dim objDataView = New DataView(objDataSet.Tables(“tên bảng”))
Có thể tạo một View từ bảng bằng lệnh:
Dim objDataView As DataView = tenbang.DefaultView
Các thuộc tính và phương thức quan trọng của DataView
Thuộc tính/
Phương thức Ý nghĩa Cú pháp
Sort Biểu thức sắp xếp objDataView.Sort = asc/desc,…” “Tencot RowFilter Biểu thức lọc của dataview để
thay đổi cách hiển thị dữ liệu
objDataView.RowFilter =
“Tencot = giá trị and/or …”
Find
Tìm kiếm, trả về vị trí dòng thỏa điều kiện, tìm theo cột nào phải sắp xếp dữ liệu theo cột đó
Dim vitri as Integer
objDataView.Sort = “Tencot”
vitri =
objDataView.Find(“giá trị”)
Ví dụ . Minh họa các đối tượng trong mô hình ADO.NET (vidu3_1.aspx)
<%@ Page Language="VB" %>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SqlClient" %> <script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Dim myDataSet As New DataSet() Dim myDataview As DataView Dim strConn, strSQL As String
strConn = ConfigurationManager.AppSettings("Conn") Dim myConn As New SqlConnection(strConn)
strSQL = "SELECT * From Accounts" ' Khai báo đối tượng SqlDataAdapter
Dim myDataAdapter As New SqlDataAdapter()
myDataAdapter.SelectCommand = New SqlCommand() myDataAdapter.SelectCommand.Connection = myConn myDataAdapter.SelectCommand.CommandText = strSQL
myDataAdapter.SelectCommand.CommandType = CommandType.Text
' Mở kết nối
myDataAdapter.Fill(myDataSet, "tblAccounts") myConn.Close()
' Điền dữ liệu từ DataSet vào ASP:DataGrid Control dgrResult.DataSource = myDataSet dgrResult.DataBind()
Me.MyGridView.DataSource =myDataSet.Tables("tblAccounts") Me.MyGridView.DataBind()
myDataview = New DataView(myDataSet.Tables("tblAccounts")) myDataview.Sort = "UserName" Me.grvMyDataview.DataSource = myDataview Me.grvMyDataview.DataBind() End Sub </ script> <body>
<form id="form1" runat="server">
<asp:DataGrid ID="dgrResult" runat="server" AutoGenerateColumns="False"
CellPadding="4" ForeColor="#333333" GridLines="None"> <Columns>
<asp:BoundColumn DataField="UserName" HeaderText=" Tên NSD"
ReadOnly="True"> </asp:BoundColumn>
<asp:BoundColumn DataField="Password" HeaderText=" Mật khẩu"
ReadOnly="True"> </asp:BoundColumn>
<asp:BoundColumn DataField="Address" HeaderText=" Địa chỉ "> </asp:BoundColumn>
</Columns>
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />