Chương 7 - Lập trình Web Form Với ADO.Net. Chương này gồm có những nội dung chính sau: Tổng quan về ADO.Net, các đối tượng trong ADO.Net, xây dựng lớp xử lý dữ liệu, xử lý giỏ hàng cho website thương mại điện tử. Mời các bạn cùng tham khảo.
Trang 1Giảng Viên: Th.S Phạm Đào Minh Vũ Email: phamdaominhvu@yahoo.com
LẬP TRÌNH WEB ASP.NET VỚI C#
Trang 2Chương 7 Lập Trình Web Form Với ADO.Net
Trang 37.1 Tổng Quan Về ADO.Net
7.1.1 Giới thiệu 7.1.2 Kiến trúc ADO Net 7.1.3 Minh họa tạo kết nối CSDL
Trang 4Hầu hết ứng dụng windows hay website đều cần
có CSDL, để lưu trữ, xử lý, tìm kiếm và báo cáo…
việc cung cấp các chức năng tới người dùng phụ thuộc vào khả năng thao tác dữ liệu, vấn đề cần quan tâm là:
Lưu dữ liệu tập trung
Đảm bảo toàn vẹn dữ liệu
Đảm bảo khả năng truy xuất đồng thời
Đảm bảo thời gian hồi đáp ngắn
Bảo mật dữ liệu
7.1.1 Giới Thiệu
Trang 5Vấn đề này được giải quyết dựa vào khả năng của các Hệ QTCSDL
Trang 67.1.2 Kiến Trúc ADO.Net
MANAGED
Trang 7Kiến trúc ADO.NET có thể chia làm 2 phần chính:
Managed Provider Component: Bao gồm các đối
tượng như DataAdapter, DataReader,… giữ nhiệm
vụ làm việc trực tiếp với dữ liệu như database, file,…
Content Component: Bao gồm các đối tượng như
DataSet, DataTable,… đại diện cho dữ liệu thực sự cần làm việc
Trang 8 DataReader: Là đối tượng giúp truy cập dữ liệu nhanh chóng
DataSet: Là một bản sao thu nhỏ của CSDL trong
bộ nhớ với nhiều bảng và các mối quan hệ
DataAdapter: Là đối tượng kết nối giữa DataSet và
như cập nhật dữ liệu từ DataSet xuống CSDL
Trang 97.1.3 Minh họa tạo kết nối CSDL
Cơ bản các bước thực hiện với database
Bước 1: Tạo kết nối
Bước 2: Mở kết nối dữ liệu
Bước 3: Tạo lệnh điều khiển truy vấn SQL
Bước 4: Thực thi lệnh
Bước 5: Đóng kết nối
Bước 6: in kết quả
Trang 10using System;
using System.Data;
using System.Data.SqlClient;
public partial class vd1 : System.Web.UI Page {
protected void Page_Load( object sender, EventArgs e) {
//Khai báo và khởi tạo biến Connection
SqlConnection cnn = new SqlConnection ("Data Source=(local);
Initial Catalog=QLbansach;User ID=sa;Password=");
Trang 117.2 Các đối tượng trong ADO.Net
7.2.1 Connection
7.2.2 Command
Trang 127.2.1 Connection
nối giữa ứng dụng với CSDL
Data Provider
System.Data.Oledb : Sử dụng với Access
System.Data.SqlCient : Sử dụng với SQLServer Ứng với mỗi tên miền:
Trang 13Connection String:
cho Connection thông qua thuộc tính Connection String Tùy thuộc vào Data Provider:
Nếu kết nối với CSDL Access
Provider: Khai báo Data Provider của Access
Data Source: Tên tập tin CSDL (.mdb)
User ID: Tên người dùng
Password : Mật khẩu
Trang 14Ví dụ: Tạo kết nối với CSDL Access
Trang 15Nếu kết nối với CSDL SQLServer
Data Source/Server: Tên Server
Initial Catalog/DataBase : Tên CSDL
User ID/UID : Tên người dùng
Password/ PWD: Mật khẩu
Integrated Security: Cơ chế chứng thực đăng nhập
true: tài khoản Windows;
false: Tài khoản SqlServer (ví dụ: sa)
Trang 16Ví dụ: Tạo kết nối với CSDL SQLServer
Trang 17Các thuộc tính Của Connection
Database: Tên CSDL
Data Source: Tên Server
Provider: Tương ứng với Provider của HQTCSDL
State: Tình trạng kết nối của Connection:
Broken: Kết nối đã bị ngắt khi đã kết nối Closed: Kết nối đã đóng
Connecting: Đang kết nối Executing: Kết nối đang thực hiện một lệnh Fetching: Kết nối đang truy xuất dữ liệu
Open: Kết nối đang mở
Trang 197.2.2 Command
Sau khi tạo kết nối CSDL, mọi thao tác với nguồn
dữ liệu có thể được thực hiện thông qua Command
Tùy theo loại Connection đối tượng Command thuộc tên miền:
System.Data.OleDb.OleDbCommand System.Data.SqlClient.SqlCommand
Trang 20Tạo Command
Cú pháp:
<Loai Command> <Biến Command> As New <Loai Command>;
<Biến Command>.Connection=<Biến Connection >;
<Biến Command>.CommandText=Lệnh SQL>;
Hoặc
<Loai Command> <Biến Command>
As New <Loại Command>(<Lệnh SQL>);
<Biến Command>.Connection=<Biến Connection >;
Trang 21Các thuộc tính Của Command
CommandText: Lệnh SQL hay tên Procedure
CommandType: Loại Command
Text: (Mặc định): Là câu lệnh SQL StoredProcedure: Tên thủ tục
TableDirect: Tên của table (SQLProvider không hỗ trợ) VD:
SqlCommand cmd = new SqlCommand ();
cmd.Connection = cnn;
cmd.CommandType = CommandType Text;
cmd.CommandText = "Select * From Khachhang";
Trang 22VD: khai báo câu lệnh SQL trong SqlCommand
SqlCommand cmd = new SqlCommand ("select * from Khachhang",cnn);
cnn : biến connection hoặc chuỗi connection string
VD: Khai báo sử dụng 1 StoredProcedure
SqlCommand cmd = new SqlCommand ; cmd.Connection = cnn;
cmd.CommandType = CommandType StoredProcedure;
cmd.CommandText = "Sachtheogia";
Trang 23Parameters
Lệnh SQL trong commandText có thể sử dụng
? (khi sử dụng Access)
@Tênbiến (khi sử dụng SQLServer)
dùng đối tượng Parameters để truyền giá trị vào dấu ?/ @Tênbiến
Tùy theo Command Parameter sẽ khai báo khác nhau
Trang 24Access
OleDbParameter <tên Parameter > = new OleDbParameter ();
OleDbParameter <Ten Parameter > = new
OleDbParameter (<Tên tham số>);
OleDbParameter <Tên parameter> = new
OleDbParameter (< Tên tham số >,<giá trị>);
Trang 25Các thuộc tính cần chú ý:
Direction: Giá trị cho biết lọai tham số
InputOutput: Loại tham số đầu vào và ra
Output: Loại tham số đầu ra
ReturnValue: Loại tham số nhận trị trả về
Value: Giá trị tham số
Trang 26VD: Khi sử dụng OleDbCommand
cmd.CommandText="Select * From KhachHang Where MaKH=?";
OleDbParameter Par = new OleDbParameter ();
Trang 27Đưa tham số vào tập hợp Parameters
VD: Khi sử dụng OleDbCommand
cmd.CommandText= "Select * From BangDiem Where Masv=? And MaMH=?";
OleDbParameter Par1 = new OleDbParameter ();
cmd.CreateParameters.Add("Sinhvien", OleDbType Char,4);
Par1.Value="SV01";
OleDbParameter Par2 = new OleDbParameter ();
cmd.CreateParameters.Add("Monhoc", OleDbType Char,4);
Par2.Value="MH01";
Trang 29Tạo tham số và đưa vào tập hợp Parameters
sinh viên đó
Trang 30cmd.CommandText="spKetQuaThi";
cmd.CommandType= CommandType StoredProcedure;
OleDbParameter ts3 = new OleDbParameter ();
ts3.Direction= ParameterDirection ReturnValue;
ts3.OleDbType=OleDb.OleDbType.Int;
cmd.parameters.Add(ts3);
OleDbParameter ts1 = new OleDbParameter ();
cmd.Parameters.Add("@MaSV", OleDbType Char,4);
ts1.Value="SV01";
OleDbParameter ts2 = new OleDbParameter ();
Trang 31CREATE PROC SpKetQuaThi (
Select @DiemThi=DiemThi from SVMH
where MaSV=@MaSV & MaMH = @MaMH;
Trang 32SqlCommand cmd = new SqlCommand ();
cmd.Connection = cn; //bien connection;
cmd.CommandText = "SVMH";
cmd.CommandType = CommandType StoredProcedure;
SqlParameter ts1 = new SqlParameter ("@MaSV", SqlDbType VarChar,4);
SqlParameter ts2 = new SqlParameter ("@MaMH", SqlDbType VarChar,4);
ts1.Value = "SV01";
ts2.Value = "MH01";
cmd.Parameters.Add(ts1);
cmd.Parameters.Add(ts2);
SqlParameter ts3 = new SqlParameter ("@DiemThi", SqlDbType Int);
ts3.Direction = ParameterDirection Output ;
cmd.Parameters.Add(ts3);
cmd.ExecuteNonQuery();
Trang 33Thực hiện Command:
phương thức Read.(DataReader đọc dữ liệu trực tiếp
từ nguồn nên phải duy trì kết nối đến khi đọc xong)
SqlDataReader <Tên DataReader>;
<Tên DataReader> = <tên Command>.ExecuteReader();
VD: SqlDataReader dr;
dr = cmd.ExecuteReader;
while (dr.Read()) {
Label1.Text += dr["MaNXB"] + ", " + dr["TenNXB"] + "<br>"; }
Trang 34Thực hiện Command:
Phương thức ExcuteNoneQuery: Dùng thực thi các
phát biểu T-Sql như: Insert, Update, Delete, Create,… Phương thức này trả về số dòng dữ liệu chiệu tác động, ngược lại trả về -1
VD : cmd.ExcuteNonQuery()
được dùng để thực thi các câu lệnh SQL như Count,
Trang 35try
{
SqlConnection cnn = new SqlConnection ("Data
Source=(local);Initial Catalog=QLbansach;User ID=sa;Password=" );
SqlCommand cmd = new SqlCommand ();
cmd.Connection = cnn;
//Loại command là câu lệnh SQL
cmd.CommandText = "Select Count(*) From Chude";
cmd.CommandType = CommandType Text;
//Mở kết nối và lấy dữ liệu
Trang 36//Biến Commnad thao tác Insert, Update, Delete
cmd.CommandText = "Insert Into Chude(tencd) Values(n'văn hóa')"; cmd.CommandType = CommandType Text;
Trang 37Ví dụ 3: Command với lệnh Insert,Update,Delete + Tham số
new SqlParameter ( "@TENCHUDE" , SqlDbType NVarChar, 50);
cmd.CommandType = CommandType Text;
Trang 387.2.3 DataReader
Là đối tượng truy cập dữ liệu trực tiếp, sử dụng con trỏ phía Server và duy trì kết nối với Server trong suốt quá trình đọc dữ liệu,
Tùy theo loại Connection mà DataReader thuộc tên miền:
System.Data.OleDb.OleDbDataReader System.Data.SqlClient.SqlDataReader
Trang 39Các thuộc tính
FieldCout: Số cột trên dòng hiện hành của DataReader
IsClosed : Cho biết dataReader đã đóng
vào là tên cột hoặc số thứ tự tính từ 0
Trang 40Các phương thức
Close: Đóng DataReader
GetFieldType: Trả về kiểu dữ liệu của tham số truyền vào
GetName: Trả về tên của cột truyền vào
GetValue: Trả về trị của cột truyền vào
Read: Di chuyển đến dòng kế tiếp và trả về true nếu còn dòng để di chuyển, ngược lại trả về False
Trang 41Ví dụ 1:DataReader với lệnh Insert,Update,Delete +Tham số
list = list + dr[ "TenNXB" ].ToString().Trim() + " " ; }
Trang 42Ví dụ 2: DataReader + gọi procedure (VD: Getnhaxuatban)
try
{ SqlConnection cnn = new SqlConnection ("Data
Source=(local);Initial Catalog=QLbansach;User ID=sa;Password=" );
SqlCommand cmd = new SqlCommand ("Getnhaxuatban", cnn); cmd.Connection = cnn;
cmd.CommandType = CommandType StoredProcedure;
cnn.Open();
IDataReader dr = cmd.ExecuteReader();
String list = "";
while (dr.Read()) {
list = list + dr["TenNXB"].ToString();
} dr.Close();
response.write(list.ToString());
cnn.Close();
}
Trang 43Ví dụ 2: DataReader + gọi procedure có tham số
Create Procedure GetchudeByMaCD
@Machude char(15)
AS Begin
Select * From Chude Where MaCD=@Machude End
Trang 44list = list + dr[ "Tenchude" ].ToString();
} dr.Close();
response.write(list.ToString());
cnn.Close();
}
Trang 457.2.4 DataAdapter
Để lấy dữ liệu từ nguồn dữ liệu về cho ứng dụng, chúng ta sử dụng đối tượng DataAdapter Đối tượng này cho phép ta lấy cấu trúc và dữ liệu của các bảng
DataAdapter là một bộ gồm 4 đối tượng:
SelectCommand: Cho phép lấy thông tin từ nguồn
Trang 46 Tạo DataAdapter
Cú pháp:
<Loai>DataAdapter <Biến DataAdapter> =
New <Loai>DataAdapter(<Lệnh>,<Biến Connection>)
DataAdapter chỉ thao tác với nguồn dữ liệu qua đối tượng connection đang kết nối, khi Connection chưa mở thì DataAdapter sẽ tự động mở kết nối khi cần và đóng lại
Trang 47 Các thuộc tính của DataAdapter
DeleteCommand: Đối tượng Command chứa nội dung lệnh hủy các mẫu tin trên nguồn dữ liệu
dung lệnh thêm các mẫu tin trên nguồn dữ liệu
dung lệnh truy xuất các mẫu tin trên nguồn dữ liệu
dung lệnh sửa các mẫu tin trên nguồn dữ liệu
Trang 48 Các chức năng của DataAdapter
Lấy dữ liệu từ nguồn:
- DataTable: Fill(<DataTable>)
- DataSet: Fill(<DataSet>)
Dữ liệu lấy về DataSet dưới dạng các dataTable với tên là: Table0,Table1, Table2
chưa có sẽ tạo mới:
Fill(<DataSet>,<Tên dataTable>)
Trang 49 Phương thức trả về số mẫu tin lấy được
Dataset DS as New Dataset() Integer so;
so= DA.Fill(DS, “Sinhvien”)
Để cập nhật dữ liệu về nguồn
Update(<mảng dòng>): Cập nhật các dòng (Các đối tượng DataRow) vào nguồn dữ liệu
Update(<Dataset>): Cập nhật các thay đổi trên tất cả các bảng của Dataset vào nguồn dữ liệu
Update(<DataTable>): Cập nhật tất cả các thay đổi trên DataTable vào nguồn dữ liệu
Update(<Dataset>,<Tên bảng>) Cập nhật các thay đổi trên bảng trong Dataset vào nguồn
Trang 507.2.5 Dataset
đáp ứng nhu cầu của ứng dụng
(DataRelation) và các ràng buộc (constraint)
Dataset thuộc tên miền: System.Data.Dataset
Khai báo
New System.Data.Dataset() Hoặc
New System.Data.Dataset(<tên Dataset>)
Trang 51Một bảng mới tạo ra theo đúng <tên bảng>
Ghi chú: Tên bảng có phân biệt chữ in, thường
Xóa bảng ra khỏi Dataset
Tables.Remove(<Tên bảng>)
Xóa bảng ra khỏi tập hợp Table
Trang 52Kiểm tra bảng có thuộc về Dataset
Trang 53Để hủy các thay đổi trên Dataset
Tạo quan hệ giữa hai bảng trong Dataset
Relations.Add(<DataColumn trên bảng cha>,
<Data Column trên bảng con>)
Xóa quan hệ giữa hai bảng trong Dataset
Trang 547.2.6 DataTable
Dữ liệu các bảng trong nguồn dữ liệu được lấy về
và đưa vào các DataTable DataTable thuộc tên miền :
Trang 55try
{ SqlConnection cnn = new SqlConnection ( "Data Source=(local);Initial
Catalog=QLbansach;User ID=sa;Password=" );
SqlDataAdapter da=new SqlDataAdapter ( "select * from CHUDE" , cnn);
SqlCommandBuilder commandBuilder = new SqlCommandBuilder (da);
DataSet ds = new DataSet ();
da.Fill(ds);
foreach ( DataRow row in ds.Tables[0].Rows)
if (row[ "MaCD" ]== "1" ) {
row[ "TENCHUDE" ] = "BBB" ;
} response.write(ds.Tables[0].Rows[2].ItemArray[1].ToString());
Trang 56try
{
SqlConnection cnn = new SqlConnection ("Data Source=(local);Initial Catalog=QLbansach;User ID=sa;Password=");
SqlDataAdapter da = new SqlDataAdapter ("GETNXB", cnn);
DataSet ds = new DataSet ();
Trang 57try
{ SqlConnection cnn = new SqlConnection ( "Data Source=(local);Initial
Catalog=QLbansach;User ID=sa;Password=" );
SqlCommand cmd = new SqlCommand ( "Getchude" , cnn);
cmd.CommandType = CommandType StoredProcedure;
SqlParameter parMACD = new SqlParameter ( "@MACD" , SqlDbType NChar, 10);
parMACD.Value = "1" ; cmd.Parameters.Add(parMACD);
Trang 597.3 Xây Dựng Lớp Xử Lý Dữ Liệu
Để các thao tác với CSDL thuận lợi Ta nên xây dựng lớp xử lý dữ liệu đảm nhận việc kết nối CSDL và các thủ tục xử lý
truy vấn SQL để trả về dữ liệu là 1 DataTable
lệnh Insert, Update, Delete để cập nhật dữ liệu cho CSDL
Thực hiện:
Tạo cấu hình chuỗi kết nối CSDL trong tập tin Webconfig (Có thể dùng SQLDatasource để sinh mã)
<add name=" KetnoiCSDL " connectionString=" Data Source =(local);
Initial Catalog=QLBansach;Integrated Security=True“
Trang 60 Tạo mới lớp XLDL.cs: Thêm mới 1 Item
Tên lớp: XLDL.cs
Sẽ lưu lớp này trong thư mục App_Code
Trang 61Thực hiện mã code cho lớp XLDL.cs
SqlDataAdapter bodocghi = new SqlDataAdapter (LenhSQL, cnn);
DataTable bang = new DataTable ();
bodocghi.Fill(bang);
return bang;
}
}