BàiGiảngMônLậpTrìnhWebsiteASP.Net Biên sọan: Dương Thành Phết Trang 94 Chương 5 XỬ LÝ DỮ LIỆU VỚI ADO.NET I. Tìm hiểu về ADO.NET Hầu hết ứng dụng hay các website đều cần phải có cơ sở dữ liệu, để lưu trữ dữ liệu, xử lý thông tin và đưa ra các báo cáo, hỗ trợ tìm kiếm… Khi dữ liệu trở thành trung tâm của ứng d ụng thì 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 đề mà người thiết kế và người xây dựng ứng dụng quan tâm khi sử dụng dữ liệu 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 của nhiều người dùng trên dữ liệu Đảm bảo thời gian hồi đáp ngắn cho mỗi người dùng Bảo mật dữ liệu Trao đổi dữ liệu giữa các hệ thống khác nhau Nh ững vấn đề này được giải quyết dựa vào khả năng của các hệ quản trị cơ sở dữ liệu(HQT CSDL) và các phần mềm xử lý dữ liệu do HQT CSDL cung cấp. .Net truy xu ất dữ liệu qua ADO.NET, đặc điểm chính của ADO.NET là khả năng làm việc với dữ liệu không kết nối, dữ liệu được lưu trữ trong bộ nhớ như một csdl thu nhỏ gọi là dataset, nh ằm tăng tốc độ tính toán, xử lý tính toán và hạn chế sử dụng tài nguyên trên Database Server. Đặc điểm quan trọng thứ 2 là khả năng xử lý dữ liệu chuẩn XML, dữ liệu ở dạng XMl có th ể trao đổi giữa bất kỳ hệ thống nào nên ứng dụng của bạn sẽ có nhiều khả năng làm việc với nhi ều ứng dụng khác. 1. Kiến trúc ADO .Net Kiế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. BàiGiảngMônLậpTrìnhWebsiteASP.Net Biên sọan: Dương Thành Phết Trang 95 o DataReader là đối tượng mới, giúp truy cập dữ liệu nhanh chóng nhưng forward-only và read-only gi ống như ADO RecordSet sử dụng Server cursor, OpenFowardOnly và LockReadOnly. o DataSet cũng là một đối tượng mới, không chỉ là dữ liệu, DataSet có thể coi là một b ản sao gọn nhẹ của CSDL trong bộ nhớ với nhiều bảng và các mối quan hệ. o DataAdapter là đối tượng kết nối giữa DataSet và CSDL, nó bao gồm 2 đối tượng Connection và Command để cung cấp dữ liệu cho DataSet cũng như cập nhật dữ liệu từ DataSet xuống CSDL. 2. Minh họa tạo kết nối cơ sở dữ liệu using 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="); //M ở kết nối cnn.Open(); //Command điều khiển truy vấn sql SqlCommand cmd = cnn.CreateCommand(); cmd.CommandText = "select HotenKH from Khachhang where MaKH=5"; //l ấy về chuỗi giá trị trong cơ sở dữ liệu string result = (string)cmd.ExecuteScalar(); //đóng kết nối cnn.Close(); //in giá tr ị ra màn hình Response.Write(result); } } Thi hành 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ả BàiGiảngMônLậpTrìnhWebsiteASP.Net Biên sọan: Dương Thành Phết Trang 96 II. Các đối tượng trong ADO.Net 1. Đối tượng Connection Vai trò của Connection trong ADO.net là tạo kết nối giữa ứng dụng với nguồn dữ liệu(CSDL) Data Provider : o System.Data.Oledb : Sử dụng với Access o System.Data.SqlClient : Sử dụng với SQLServer Ứng với mỗi t ên miến ta có một connection tương ứng: o System.Data.Oledb.OledbConnection o System.Data.SqlClient.SqlConnection Ngòai ra Ado.net còn h ỗ trợ các Data Provider khác như o System.data.OcracleClient : Dành cho Ocracle o MicroSoft.data.Odbc : Dành cho dạng kết nối thong qua Odbc Connectionủa Hệ điều h ành o Microsoft.Data.Sqlxml: Dành cho XML trên Sqlserver Connection String Trước khi thực hiện kết nối Connectionần khai báo các thong tin cho Connection thông qua thuộc tính Connection String. Cách khai báo thay đổi tùy thuộc vào Data Provider. G ồm có các thành phần sau: o Nếu kết nối với CSDL Access Provider: Khai báo Data Provider Connectionủa Hệ QT CSDL Access Data Source: Nguồn dữ liệu (Tên CSDL.mdb) User ID: Tên người dùng Password : M ật khẩu Ví dụ: Tạo kết nối với CSDL Access using System; using System.Data; using System.Data.OleDb; public partial class VD2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //Khai báo và kh ởi tạo biến Connection String StrCnn="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Server.MapPath("~/App_Data/QLBansach.mdb"); OleDbConnection cnn = new OleDbConnection (StrCnn); //M ở kết nối cnn.Open(); //Command điều khiển truy vấn sql OleDbCommand cmd = cnn.CreateCommand(); cmd.CommandText = "select HotenKH from Khachhang where MaKH=2"; //l ấy về chuỗi giá trị trong cơ sở dữ liệu string result = (string)cmd.ExecuteScalar(); //đóng kết nối cnn.Close(); //in giá tr ị ra màn hình Response.Write(result); } } BàiGiảngMônLậpTrìnhWebsiteASP.Net Biên sọan: Dương Thành Phết Trang 97 o Nếu kết nối với CSDL SQLServer Provider: Khai báo Data Provider Connectionủa Hệ QT CSDL SQLServer Data Source:Tên máy cài đặ t SQLServer Initial Catalog: Tên CSDL User ID: Tên người dùng Password : M ật khẩu Các thuộc tính Của Connection o DataBase: : Tương ứng với Initial Catalog(SQL) hay tên CSDL muốn làm việc (Access) o DataSource: Tương ứng với DataSource Tên máy SQL hay tên CSDL o Provider: Tương ứng với Provider o State: Tình trạng kết nối Connectionủa Connection với các giá trị Broken: Kết nối đã bị ngắt chỉ xảy ra sau 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ở Các phương thức Change Databse: Thay đổi DataBase làm việc Close : Đóng kết nối sử dụng đóng Connection đang mở Dispose: Xóa tòan bộ tài nguyên liên quan đấn Connection trên vùng nhớ. Open: Thực hiện kết nối Connectionới các thông tin đã khai báo trong ConnectionString Ví d ụ: Kiểm tra kết nối với CSDL SQLServer protected void Button1_Click(object sender, EventArgs e) { //Khai báo và kh ởi tạo biến Connection SqlConnection cnn = new SqlConnection("Data Source=;Initial Catalog=QLbansach;User ID=sa;Password="); //M ở kết nối cnn.Open(); TextBox1.Text = "State = " + cnn.State; ; // Th ực hiện các câu lệnh SELECT, INSERT, DELETE, UPDATE. cnn.Close(); //Đóng kết nối } BàiGiảngMônLậpTrìnhWebsiteASP.Net Biên sọan: Dương Thành Phết Trang 98 2. Đối tượng Command Sau khi tạo kết nối với nguồn dữ liệu, mọi thao tác với nguồn dữ liệu đó đều đượ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 như sau: System.Data.OleDb.OleDbCommand System.Data.SqlClient.SqlCommand Tạo Command Chúng ta có thể tạo Command thông qua đối tượng Connection bàng cách: <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>; Các thuộc tính CommandText : Lệnh SQL hay tên Stored Procedure muốn thực hiện trên nguồn dữ liệu CommandType: Giá trị cho biết nội dugn Commandtext là gì: Text: (M ặc định) là câu lệnh SQL StoredProcedure: Tên thủ tục TableDirect: Tên Connectionủa table VD: SqlCommand cmd As SqlCommand = New SqlCommand(); cmd.Connection = cnn; cmd.CommandType = CommandType.Text; cmd.CommandText = "Select* From Khachhang Where MaKH=2"; Parameters Lệnh SQL trong commandText có thể sử dụng dấu ? thay cho trị chưa xác định và khi th ực hiện sẽ dùng đối tượng Parameters để truyền gái trị vào dấu ? . Tùy theo Command Parameter s ẽ khai báo từ lớp OledbParameter hay SqlParameter. Cú pháp khai báo sau: OleDbParameter | SqlParameter <tên Parameter> As New OleDbParameter | SqlParameter(); OleDbParameter | SqlParameter <Ten Parameter> As New OleDbparameter | SqlParameter(<Tên>); OleDbParameter | SqlParameter <Tên parameter> As New OleDbParameter | SqlParamter(<tên>,<giá>); Các thu ộc tính cần chú ý: Direction : Giá trị cho biết lọai tham số Input: (mặc định) Loại tham số đầu vào InputOutput: Lo ại tham số đầu vào và ra Output: Lo ại tham số đầu ra Bài GiảngMônLậpTrình Website ASP.Net Biên sọan: Dương Thành Phết Trang 99 ReturnValue: Loại tham số nhận giá trị trả về Connectionủa một thủ tục OleDbType / SqlDbType: Kiểu dữ liệu OleDb hay SQLDb Connectionủa tham số. ParameterName: Tên tham số Value: Giá trị tham số Dùng phương thức CreateParameter và Add Command của tập hợp Parameters. VD: Khi sử dụng OleDbCommand cmd.CommandText=”Select * From Khachhang Where MaKH=?”; OleDbParameter Par As OleDbParameter= cmd.CreateParameter(); Par.Value=”KH01”;; cmd.Parameters.Add(Par); VD: Khi s ử dụng SqlDbCommand cmd.CommandText=”Select * From Khachhang Where MaKH=@MaKH”; SqlParameter Par As SqlParameter = cmd.CreateParameter(); Par.ParameterName=”@MaKH”; Par.Value=”KH01”; cmd.Parameters.Add(Par); Đư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 As OleDbParameter= cmd.CreateParameters.Add(“Sinhvien”,OleDbType.Char,4); Par1.Value=”SV01” OleDbParameter Par2 As OleDbParameter= cmd.CreateParameters.Add(“Monhoc”,OleDbType.Char,4); Par2.Value=”MH01” VD: Khi s ử dụng SqlDbCommand cmd.CommandText=”Select * From BangDiem Where Masv=@MaSV and MaMH = @MaMH ”; SqlDbParameter Par1 As SqlDbParameter= cmd.CreateParameters.Add(“@MaSV”,SqlType.Char,4); Par1.Value=”SV01” SqlDbParameter Par2 As SqlDbParameter= cmd.CreateParameters.Add(“@MaMH”,SqlType.Char,4); Par2.Value=”MH01”; Tạo tham số và đưa vào tập hợp Parameters VD: Procedure SpKetQuaThi Cần 2 tham số đầu vào: @MaSV , @MaMH và trả về Điểm thi của Môn học Connectionủa sinh viên đó. Vì vậy chúng ta Connectionần truyền 3 tham số: 1 trả về, 2 đưa vào. Tham số trả về phải được truyền cho Command trước ti ên Bài GiảngMônLậpTrình Website ASP.Net Biên sọan: Dương Thành Phết Trang 100 cmd.CommandText=”spKetQuaThi”; cmd.CommandType=CommandType.StoredProcedure; OleDbParameter ts3 As New OleDbParameter(); ts3.Direction=ParameterDirection.ReturnValue; ts3.OleDbType=OleDn.OleDbType.Int; cmd.parameters.Add(ts3); OleDbParameter ts1 as OleDbParameter= cmd.Parameters.Add(“@MaSV”,OleDbType.Char,4); Ts1.Value=”Sv01”; OleDbParameter ts2 as OleDbParameter= cmd.Parameters.Add(“@MAMH”,OleDbType.Char,4); Ts1.Value=”MH01”; Thực hiện Command Phương thức ExecuteReader: Phương thức này trả về một đối tượng DataReader để đọc dữ liệu mỗi lần một d òng với phương thức Read. DataReader đọc dữ liệu trực tiếp từ nguốn dữ liệu nên phải duy trì kết nối đến khi đọc xong cú pháp. SqlDataReader <Tên DataReader> As SqlDataReader; <Tên DataReader> = <tên Command>.ExecuteReader; VD: SqlDataReader reader As SqlDataReader; reader = cmd.ExecuteReader; 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 ExcuteScalar: Trả về từ phát biết SQL dạng Select chỉ có một cột một hàng. 3. Đối tượng 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, DataReader thuộc tên miền System.data.OleDbDatReader hoặc System.Data.SqlDataRaeder Các thuộc tính FieldCout: Số Connectionột trên dòng hiện hành của DataReader IsClosed : Cho bi ết dataReader đã đóng Item:Trị của cột truyền vào. Tham số truyền vào là tên cột hoặc số thứ tự từ 0. Các phương thức Close: Đóng DataReader GetFieldType: Trả về kiểu dữ liệu của cột truyền vào. GetName: Tr ả về tên của cột truyền vào GetValue: Tar3 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. Trong khi dataReader đang mở các thao tác dữ liệu tr ên nguồn dữ liệu đều không thể cho đến khi dataRaeder đóng lại bằng lệnh Close. Bài GiảngMônLậpTrình Website ASP.Net Biên sọan: Dương Thành Phết Trang 101 4. Đối tượng DataAdapter Để lầy dữ liệu từ nguồn dữ liệu về cho ứng dụng, chúng ta sử dụng một đối tượng gọi là 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 trong nguồn dữ liệu. DataAdapte là một bộ gồm 4 đối tượng: - SelectCommand: Cho phép lấy thông tin từ nguồn dữ liệu về. - InsertCommand cho phép thêm dữ liệu vào bảng trong nguồn dữ liệu. - UpdateCommand cho phép điều chỉnh dữ liệu của bảng trong nguồn dữ liệu. - DeleteCommand cho phép xóa dữ liệu của bảng trong nguồn dữ liệu. a. Tạo DataAdapter Khai báo rõ DataAdapter sử dụng theo DataProvider nào: sqlDataAdapter hay OledbDataAdapter hai l ớp này thuộc tên miền: System.Data.OleDb.OleDbDataAdapter System.Data.SqlClient.SqlDataAdapter Cú pháp tạo DataAdapter New <Loai>DataAdapter(); New <Loai>DataAdapter(<Đối tượng SelectCommand>); <Đối tượng SelectCommand>: Có sẳn với nội dụng lệnh truy xuất. New <Loai>DataAdapter(<Lệnh>,<Đối tượng Connection>) DataAdapter chỉ thao tác với một nguồn dữ liệu qua một đố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. VD: OleDbDataAdapter DA As New OleDbDataAdapter(); DA.SelectCommand.CommandText=”Select * From Sinhvien”; AD.SelectCommand.Connection.ConnectionString=”Provider=MicroSoft.Jet.OleDb.4.0; Data Source=c:\QuanLySV.mdb”; b. Các thuộc tín chí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. InsertCommand : Đối tượng Command chứa nộ i dung lệnh thêm các mẫu tin trên nguồn dữ liệu. SelectCommand: Đối tượng Command chứa nội dung lệnh truy xuất các mẫu tin tr ên ngu ồn dữ liệu. UpdateCommand : Đối tượng Command chứa nội dung lệnh sửa các mẫu tin tr ên ngu ồn dữ liệu. c. Các chức năng của DataAdapter - Lấy dữ liệu từ nguồn: Sử dụng DataAdapter để lấy dữ liệu về cho các đối tượng o DataTable: Fill(<DataTable>) o DataSet: Fill(<DataSet>) Dữ liệu lấy về DataSet dưới dạng các dataTable với tên mặc định là: Table,Table1, Table2. . .: Bài GiảngMônLậpTrình Website ASP.Net Biên sọan: Dương Thành Phết Trang 102 o Đổ dữ liệu vào Datset cho bảng DataTable nếu chưa có sẽ tạo mới: Fill(<DataSet>,<Tên dataTable>) - Phương thức trả về mẫu tin lấy về được Dim DS as New Dataset() Dim so As Integer 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 they đổi trên bảng trong Dataset vào ngu ồn dữ liệu 5. Đối tượng DataSet Dataset là một mô hình CSDL quan hệ thu nhỏ đáp ứng nhu cầu của ứng dụng. Dataset chứa các bảng (DataTable) các quanhệ (DataRelation) và các ràng buộc (constraint) Dataset thuộc tên miền: System.Data.Dataset. a. Khai báo New System.Data.Dataset() Ho ặc New System.Data.Dataset(<tên Dataset>) b. Các phương thức - Thêm một bảng vào Dataset Tables.Add() Một bảng mới tự động được tạo ra với tên mặc định Table1, Table2 . . . Tables.Addd(<Tên bảng>) Mộ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. - Kiểm tra bảng có thuộc về Dataset Tables.Contains(<Tên bảng>) - Lấy chỉ số của bảng Tables.IndexOf(<tên bảng>) - Lấy số bảng trong Dataset Tables.Count - Lấy ra một bảng trong Dataset Tables(<Chỉ số>) Bài GiảngMônLậpTrình Website ASP.Net Biên sọan: Dương Thành Phết Trang 103 - Để cập nhật các thay đổi trên Dataset AcceptChanges() - Để hủy các thay đổi trên Dataset RejectChanges() - Để xóa bỏ mọi dữ liệu trên dataSet Clear() - Để tạo một bản sau của Dataset Clone() - Để xóa bỏ Dataset Gọi phương thức Dispone để giải phóng mọi tài nguyên trên vùng nhớ Dataset đang sử dụng. - 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. Relations.Remove(<quan hệ>) 6. Đối tượng 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 : System.Data.dataTable. Cú pháp: New DataTable(); New DataTable(<Tên b ảng>); DataTable được h ình thành từ các DataColumn, DataRow. . Bài Giảng Môn Lập Trình Website ASP. Net Biên sọan: Dương Thành Phết Trang 94 Chương 5 XỬ LÝ DỮ LIỆU VỚI ADO .NET I. Tìm hiểu về ADO .NET Hầu hết. các thao tác dữ liệu tr ên nguồn dữ liệu đều không thể cho đến khi dataRaeder đóng lại bằng lệnh Close. Bài Giảng Môn Lập Trình Website ASP. Net Biên sọan: