Kiến thức

[C#][Basic][Chương VIII] DATA PROCESSING WITH ADO.NET (XỬ LÝ DỮ LIỆU VỚI ADO.NET)

Bạn đang xem: [C#][Basic][Chương VIII] DATA PROCESSING WITH ADO.NET (XỬ LÝ DỮ LIỆU VỚI ADO.NET)

[C#][Basic][Chương VIII] DATA PROCESSING WITH ADO.NET (XỬ LÝ DỮ LIỆU VỚI ADO.NET)

NỘI DUNG
• Kiến trúc tổng quan của ADO.NET
• Tổng quan về các mô hình xử lý dữ liệu trong 
ADO.NET
• Làm việc với mô hình Kết nối trong ADO.NET
• Làm việc với mô hình Ngắt kết nối
• Sử dụng Data Binding
• Lựa chọn giữa mô hình Kết nối và Ngắt kết nối

Kiến trúc của ADO.Net
Kiến trúc của ADO.NET bao gồm hai thành phần chính: Thành phần truy cập nguồn dữ liệu và thành phần lưu trữ xử lý dữ liệu.

• Thành phần thứ nhất:.NET Framework Data Provider đượ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. Trong ADO.NET, có 4 đối tượng chính:
– Connection: thực hiện kết nối đến các CSDL
– Command: giúp truy cập đến CSDL và thực hiện các phát biểu SQL
– DataReader: dùng để đọc nhanh nguồn dữ liệu, chỉ được duyệt tuần tự theo chiều tiến của các record
– DataAdapter: dùng để chuyển dữ liệu truy vấn được cho các đối tượng lưu trữ và xử lý (DataSet, DataTable). DataAdapter chủ yếu thực hiện các thao tác như SELECT, INSERT, UPDATE, DELETE
• .NET Framework Data Provider cung cấp giao diện lập trình chung để làm việc với các nguồn dữ liệu. 
• Mỗi nhà cung cấp đặc thù sẽ đưa ra một loại data provider riêng. Bảng dưới đây mô tả giao diện lập trình cùng với các lớp cơ bản của các data provider mà ADO.NET cung cấp sẵn
• Để sử dụng data provider nào, chúng ta phải khai báo using namspace tương ứng. 
Vd: 
using System.Data.SqlClient;

• Thành phần thứ hai là DataSet được xem là container dùng để lưu các đối tượng liên quan đến dữ liệu như DataTable, DataRelation, DataView. Thành phần này còn được gọi là lớp không kết nối.
– DataSet như là một CSDL thu nhỏ tại máy client, có thể chứa các đối tượng table, view, relationship …
– Tất cả dữ liệu từ nguồn dữ liệu thực sẽ được nạp vào DataSet dưới dạng các DataTable. Khối dữ liệu này sẽ được chỉnh sửa độc lập, sau đó nếu cần sẽ được cập nhật trở lại nguồn dữ liệu thực.
– Vì vậy, không cần duy trì kết nối liên tục một cách không cần thiết với nguồn dữ liệu thực trong suốt quá trình thao tác với nó.
2. Mô hình Kết nối
• Trong mô hình kết nối của ADO.NET, có một connection hoạt động được duy trì giữa đối tượng DataReader của ứng dụng và một data source (nguồn dữ liệu). Một dòng dữ liệu (data row) được trả về từ data source mỗi khi phương thức Read của đối tượng DataReader được thực thi.
• Điểm quan trọng nhất của mô hình này là dữ liệu được lấy từ tập dữ liệu (các record được trả về bởi một lệnh SQL nào đó) theo kiểu từng record một cho một lần đọc, chỉ đọc (readonly), và chỉ theo một hướng tiến (forward-only).

• Các bước điển hình để làm việc với đối tượng DataReader như sau:
– Tạo đối tượng Connection bằng cách truyền một chuỗi Connection string cho hàm khởi dựng của nó.
– Khởi tạo một biến chuỗi và gán cho nó câu lệnh SQL dựa theo dữ liệu muốn nạp về.
– Khởi tạo một đối tượng Command từ nội dung câu lệnh SQL đã xác định ở trên.
– Tạo đối tượng DataReader bằng cách thực thi phương thức Command.ExecuteReader(). Đối tượng này được dùng để đọc kết quả của câu truy vấn mỗi dòng một lần
• Ví dụ: đọc danh sách họ tên các sinh viên trong bảng SinhVien của csdl và hiển thị lên một điều khiển ListBox

 using System.Data.SqlClient; ... // (1) Tao Connection SqlConnection conn = new SqlConnection(chuoiKetNoi); conn.Open(); // (2) Chuoi SQL lay danh sach ten cac sinh vien xep tang dan theo NgaySinh string sql = "SELECT HoTen, NgaySinh FROM SinhVien ORDER BY NgaySinh"; // (3) Tao doi tuong Command SqlCommand cmd = new SqlCommand(sql, conn); // (4) Tao doi tuong DataReader SqlDataReader rdr; rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); while (rdr.Read()){ ListBox1.Items.Add(rdr["HoTen"].ToString()); // đưa vào ListBox } // Dong datareader sau khi da su dung xong rdr.Close(); 


3. Làm việc với mô hình kết nối
• Mô hình Kết nối dựa trên việc thiết lập một Connection đến CSDL và sau đó sử dụng các Command để thực hiện việc thêm, xóa, sửa, hay đọc dữ liệu từ data source được kết nối.
• Đặc điểm của mô hình này là các Command được phát sinh, làm việc với data source thông qua một Connection đang hoạt động
 – Connection này sẽ mở cho đến khi các thao tác được hoàn tất.
• Bước đầu tiên trong quá trình truy xuất một data source đó là tạo ra một đối tượng Connection để làm đường truyền giữa ứng dụng với data source.

3.1. Lớp Connection
• Có nhiều lớp Connection trong ADO.NET
– mỗi lớp tương ứng với một Data Provider
– bao gồm SqlConnection, OracleConnection, OleDbConnection, OdbcConnection.
• Mặc dù mỗi lớp có thể gồm những đặc tính riêng, nhưng các lớp này đều phải implement interface IDbConnection.
• 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)

• Thuộc tính:
– ConnectionString: Chứa chuỗi kết nối dữ liệu
– ConnectionTimeout: Khoảng thời gian tối đa tính bằng giây để chờ thực hiện việc kết nối đến data source
– Database: Tên CSDL ứng với Connection hiện tại, có thể thay đổi csdl theo phương thức: Sqlconn.ChangeDatabase(“name_database_thaydoi”);
– State: Cho biết trạng thái kết nối csdl
• 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:
– ChangeDatabse: Thay đổi DataBase làm việc
– Close: Đóng kết nối sử dụng
– Dispose: huỷ bỏ hay giải phóng đối tượng Connection đang sử dụng
– Open: Thực hiện kết nối với các thông tin đã khai báo trong ConnectionString
– CreateCommand: cho phép gán hay trả về một đối tượng Command ứng với đối tượng Connection,

 SqlConnection sqlconn = new SqlConnection(driver); SqlCommand sqlcom = sqlconn.CreateCommand(); 

• Connection string
– Thuộc tính này xác định data source và các thông tin cần thiết để truy xuất data source, chẳng hạn như User ID và Password, …
– Cách thành lập chuỗi kết nối cho các data provider thường gặp
• SqlConnection sử dụng cơ chế xác thực kiểu SQL Server:

 "server=(1);database=(2);uid=(3);pwd=(4)" hoặc "Data Source = (1); Initial Catalog = (2); UserID = (3); Password=(4)"

• SqlConnection sử dụng cơ chế xác thực kiểu Windows:

 "Server=(1);Database=(2);Trusted_Connection=yes" 

Ở đây, (1) là tên máy chủ chứa CSDL, (2) là tên CSDL, (3) là tên đăng nhập, (4) là mật khẩu tương ứng.
• Ví dụ:

"server=192.168.0.1;database=qlnhanvien;uid=k32;pwd=spider"


Hoặc:

"Server=192.168.0.1;Database=qlnhanvien;Trusted_Connection=yes"


• Connection string – OleDbConnection sử dụng để kết nối CSDL Access phiên bản trước 2003:

 "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="

– Ví dụ:

 string connstr = string.Format("Provider = Microsoft.Jet.OLEDB.4.0; DataSource ={ 0}",@"c:program filesqlnhanvien.mdb");

– Sử dụng trong ứng dụng Internet:

 string constr = string.Format("Provider = Microsoft.Jet.OLEDB.4.0; DataSource ={0}",Server.MapPath(@"/data/qlnhanvien.mdb");

-
ODBC: “DSN =” với là Data Source Name (DSN), ví dụ: “DSN = qlnhanvien”;

• Các Connection string được dùng để tạo ra đối tượng Connection. Cách thực hiện thông thường là truyền chuỗi này cho hàm khởi dựng
• Ví dụ:

 string connstr = "Data Source=192.168.0.1;"+ "Initial Catalog = films; User Id = k32;"+"Password = spider"; SqlConnection conn = new SqlConnection(connstr); conn.Open();

-

 

3.2. Đối tượng Command

• Sau khi một connection được tạo ra, bước tiếp theo là tạo ra một đối tượng Command để gửi một query (select) hay một action command (thêm, xóa, sửa) đến data source.
• Có nhiều loại lớp Command ứng với các data provider; các lớp này đều implement interface IDbCommand
• Tạo đối tượng Command
– Cú pháp: = new ; .Connection=; .CommandText=; 
– 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 dung Commandtext là gì: 
– Text: (Mặc định) là câu lệnh SQL 
– StoredProcedure: Tên thủ tục 
– TableDirect: Tên Connection của table
• Ví dụ

 SqlConnection conn = new SqlConnection(connstr); conn.open(); string sql= "Select MaNV From DSNV Where MaPhong='DT'"; SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = sql;

• Thực thi một Command: Lệnh SQL được gán trong thuộc tính CommandText của đối tượng Command sẽ được thực thi bằng một trong các phương thức sau
• Phương thức
– ExcuteReader: Thực thi một query và trả về đối tượng DataReader để có thể truy cập tập kết quả của query đó

cmd.CommandText = "SELECT * FROM DSSV " + " WHERE YEAR(NgaySinh) > 1981"; SqlDataReader rdr= cmd.ExecuteReader();

– ExcuteNoneQuery: Thực thi truy vấn hành động và trả về số lượng dòng dữ liệu bị ảnh hưởng bởi truy vấn đó:

cmd.CommandText = "DELETE FROM DSSV WHERE MaSV=‘12’"; int soLuong = cmd.ExecuteNonQuery();

- – ExcuteScalar: Thực thi một query và trả về giá trị của cột đầu tiên trong dòng đầu tiên của tập kết quả.

 cmd.CommandText="SELECT COUNT(MaSV) FROM SinhVien"; int soSinhVien = (int)cmd.ExecuteScalar();

• Ví dụ: tạo đối tượng Command và thiết lập các thuộc tính của nó

 SqlConnection conn = new SqlConnection(connstr); conn.Open(); string sql = "INSERT INTO DMNganh (MaNganh, TenNganh) VALUES (@pMaNganh, @pTenNganh)"; SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = sql; cmd.Parameters.AddWithValue("@pMaNganh",txtMaNganh.Text.ToString()); cmd.Parameters.AddWithValue("@pTenNganh", txtTenNganh.Text.ToString()); int sl=(int)cmd.ExecuteNonQuery();

- • Ví dụ: tạo đối tượng Command và thiết lập các thuộc tính của nó

 SqlConnection conn = new SqlConnection(connstr); conn.Open(); string sql = string.Format("DELETE FROM DMNganh WHERE MaNganh={0}’", txtMaNganh.Text.ToString()); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = sql; int sl = cmd.ExecuteNonQuery();

- • Ví dụ: tạo đối tượng Command và thiết lập các thuộc tính của nó

 SqlConnection conn = new SqlConnection(connstr); conn.Open(); string sql = "UPDATE DMNganh SET TenNganh='" + txtTennganh.Text + "'WHERE MaNganh='" + txtManganh.Text + "'"; SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = sql; int sl = cmd.ExecuteNonQuery();

-
3.3. Đối tượng DataReader

• Đối tượng này dùng để đọc dữ liệu từ bảng csdl. Trong khi truy xuất sẽ giữ kết nối liên tục với database (hướng kết nối)
• Khai báo và khởi tạo đối tượng

 SqlDataReader sqlreader; sqlreader = cmd.ExecuteReader();

-
• Truy xuất các dòng dữ liệu với DataReader
– DataReader lấy về từng dòng đơn từ một tập dữ liệu trả về mỗi khi phương thức Read của nó được gọi. Nếu không có dòng dữ liệu nào thì phương thức này trả về giá trị False.
– DataReader phải được đóng sau khi các thao tác xử lý các dòng được hoàn tất để giải phóng tài nguyên hệ thống. Có thể sử dụng thuộc tính DataReader.IsClosed để biết DataReader đã được đóng hay chưa.
– Mặc dù DataReader ứng với một Command đơn, nhưng Command này có thể chứa nhiều query, do đó có thể trả về nhiều tập dữ liệu kết quả.

• Vd: Hiển thị danh sách họ tên sinh viên trong bảng DSSV thỏa điều kiện lên điều khiển ListBox

 string sql = "SELECT * FROM DSSV " +" WHERE YEAR(NgaySinh) > 1981"; SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader rdr; rdr =cmd.ExecuteReader(); while (rdr.Read()){ listBox1.Items.Add(rdr["TenSV"].ToString()); } rdr.Close(); 

-
• Ví dụ: Command chứa nhiều query

 string q1 = "SELECT * FROM DSSV WHERE YEAR(NgaySinh) < 1981"; string q2 = "SELECT * FROM DSSV WHERE YEAR(NgaySinh) > 1990"; // hai query được ngăn cách nhau bởi ; cmd.CommandText = q1 + ";" + q2; SqlDataReader rdr = cmd.ExecuteReader(); bool readNext = true; while (readNext) { while (rdr.Read()){ Response.Write(rdr.GetString(1)); } readNext = rdr.NextResult(); // kiem tra xem con tap du lieu nao khong } rdr.Close(); conn.Close();


• Truy xuất giá trị của column
– Có nhiều cách để truy xuất dữ liệu chứa trong các columns của dòng hiện tại của DataReader:
• Truy xuất như là một mảng dùng số thứ tự column (bắt đầu từ 0) hoặc dùng tên column
• Sử dụng phương thức GetValue bằng cách truyền cho phương thức này số thứ tự của column
• Sử dụng một trong các phương thức định kiểu bao gồm GetString, GetInt32, GetDateTime, GetDouble, …
• Truy xuất giá trị của column
– Ví dụ:

 cmd.CommandText = "SELECT MaSV, HoTen, GioiTinh, NgaySinh FROM" +"DSSV WHERE YEAR(NgaySinh) = 1981"; rdr = cmd.ExecuteReader(); rdr.Read(); // Các cách để lấy dữ liệu kiểu string ở cột thứ 2 (HoTen) string stHoTen; stHoTen = rdr.GetString(1); stHoTen = (string)rdr.GetSqlString(1); stHoTen = (string)rdr.GetValue(1); stHoTen = (string)rdr["HoTen"]; stHoTen = (string)rdr[1]; // Lấy dữ liệu kiểu DateTime ở cột thứ 4 (NgaySinh) có kiểm tra giá trị NULL if (!rdr.IsDbNull(3)) { DateTime dtNgaySinh = rdr.GetDateTime(3); }

4. Mô hình ngắt kết nối
• Các thành phần chính của mô hình này là DataApdapter và DataSet.
• DataAdapter làm nhiệm vụ như cầu nối giữa nguồn dữ liệu và DataSet, nạp dữ liệu vào các bảng của DataSet và đẩy các thay đối ngược trở lại nguồn dữ liệu.
• DataSet đóng vai trò như một csdl quan hệ chứa một hay nhiều DataTable, giữa các DataTable này cũng có thể có các mối quan hệ với nhau. Một DataTable chứa các dòng và các cột dữ liệu thường được lấy từ csdl nguồn.

• Trong số các phương thức và thuộc tính của DataAdapter thì Fill() và Update() là hai phương thức quan trọng nhất.
• Fill() chuyển một query đến csdl và lưu tập kết quả trả về trong một DataTable
• Update() thực hiện một thao tác thêm, xóa, cập nhật dựa trên những thay đối của đối tượng DataSet.
• Ví dụ:

 string sql = "SELECT MaSV, HoTen, NgaySinh FROM DSSV"; string connstr = "Data Source=MYSERVER;Initial Catalog=qlsinhvien;Trusted_Connection = yes"; // (1) Tao doi tuong dataadapter SqlDataAdapter da = new SqlDataAdapter(sql, connstr); // (2) Tao doi tuong dataset DataSet ds = new DataSet(); // (3) Tao 1 Table co ten “SinhVien” trong dataset va nap du lieu cho no da.Fill(ds, "SinhVien"); // (4) Hien thi danh sach ten sinh vien ra listbox DataTable dt = ds.Tables["SinhVien"]; for (int i = 0; i < dt.Rows.Count; i++) { DataRow row = dt.Rows[i]; ListBox1.Items.Add(row["HoTen"].ToString()); }


4.1. Lớp DataSet
• DataSet đóng vai trò như một CSDL nằm trong bộ nhớ.
– Thuộc tính Tables của DataSet là một tập hợp các DataTable chứa dữ liệu và lược đồ dữ liệu mô tả dữ liệu trong DataTable.
– Thuộc tính Relations chứa tập hợp các đối tượng DataRelation xác định cách thức liên kết các đối tượng DataTable của DataSet.
• Lớp DataSet cũng hỗ trợ việc sao chép, trộn, và xóa DataSet thông qua các phương thức: Copy, Merge, và Clear.
• DataTable
– Thuộc tính DataSet.Tables chứa các đối tượng DataTable. Mỗi đối tượng trong tập hợp này có thể được truy xuất bằng chỉ số hoặc bằng tên.
– Các DataTable trong tập hợp DataSet.Tables mô phỏng các Table trong CSDL quan hệ (các row, column,…). Các thuộc tính quan trọng nhất của lớp DataTable là Columns và Rows định nghĩa cấu trúc và nội dung bảng dữ liệu.
• DataTable
– Phương thức Add, Remove

 DataSet dataset=new DataSet(); DataTable datatable=new DataTable(“datatablename”); dataset.Tables.Add(datatable); dataset.Tables.Remove(datatable);

- – Xóa với datatable được đặt tên

 dataset.Tables.Remove(datatablename); dataset.Tables.RemoveAt(0);

- – Phương thức Clear loại bỏ tất cả các đối tượng trong DataTable

 dataset.Tables.Clear();

- – Đếm số dòng dữ liệu trong bảng ta có thể thực hiện

 int sodong=dataset.Tables[0].Rows.Count;

- • DataColumn
– Thuộc tính DataTable.Columns chứa một tập các đối tượng DataColumn biểu diễn các trường dữ liệu trong DataTable. Bảng dưới đây tóm tắt các thuộc tính quan trọng của lớp DataColumn.
– Các column của DataTable được tạo ra một cách tự động khi table được nạp dữ liệu từ kết quả của một database query hoặc từ kết quả đọc được ở một file XML. Tuy nhiên, chúng ta cũng có thể viết code để tạo động các column

• Ví dụ: tạo một đối tượng DataTable, tạo các đối tượng DataColumn, gán giá trị cho các thuộc tính của column, và bổ sung các DataColumn này vào DataTable.

 DataTable tb = new DataTable("DonHang"); DataColumn dCol = new DataColumn("MaSo", Type.GetType("System.Int16")); dCol.Unique = true; // Dữ liệu của các dòng ở column này không được trùng nhau dCol.AllowDBNull = false; tb.Columns.Add(dCol); dCol = new DataColumn("DonGia", Type.GetType("System.Decimal")); tb.Columns.Add(dCol); dCol = new DataColumn("SoLuong", Type.GetType("System.Int16")); tb.Columns.Add(dCol); dCol = new DataColumn("ThanhTien", Type.GetType("System.Decimal"));

-  Ví dụ: tạo một đối tượng DataTable, tạo các đối tượng DataColumn, gán giá trị cho các thuộc tính của column, và bổ sung các DataColumn này vào DataTable.

 dCol.Expression = "SoLuong*DonGia"; tb.Columns.Add(dCol); // Liệt kê danh sách các Column trong DataTable foreach (DataColumn dc in tb.Columns) { Console.WriteLine(dc.ColumnName); Console.WriteLine(dc.DataType.ToString()); }

• Đưa dữ liệu vào table bằng cách tạo một đối tượng DataRow, gán giá trị cho các column của nó, sau đó bổ sung đối tượng DataRow này vào tập hợp Rows của table.
• Ví dụ:
 DataRow row; row = tb.NewRow(); // Tạo mới DataRow row["DonGia"] = 22.95; row["SoLuong"] = 2; row["MaSo"] = 12001; tb.Rows.Add(row); // Bổ sung row vào tập Rows


4.3. DataView
• DataView đóng vai trò như tầng hiển thị dữ liệu lưu trữ trong DataTable. Nó cho phép người sử dụng sắp xếp, lọc và tìm kiếm dữ liệu.
• Vd: Giả sử có 1 dataset là ds chứa dữ liệu của bảng DonHang 

 DataView dv = new DataView(ds.Tables["DonHang"]); // Lọc ra tất cả các hàng có giá từ 10 đến 100 dv.RowFilter = "soluong>=10 and soluong<=100"; //Sắp xếp tăng dần theo số lượng nếu số lượng bằng nhau thì sắp xếp giảm dần theo đơn giá dv.Sort = "soluong, dongia DESC";


4.4. Nạp dữ liệu vào DataSet bằng DataAdapter

Đối tượng DataAdapter có thể dùng để nạp một table hiện có vào một table khác, hoặc tạo mới và nạp dữ liệu cho table từ kết quả của một query.

• Các ví dụ để tạo ra đối tượng DataAdapter:
(1) Tạo từ Connection string và câu truy vấn SELECT:

 String sql = "SELECT * FROM nhanvien"; SqlDataAdapter da = new SqlDataAdapter(sql, connStr);

- (2) Tạo từ đối tượng Connection và câu truy vấn SELECT:

 SqlConnection conn = new SqlConnection(connStr); SqlDataAdapter da = new SqlDataAdapter(sql, conn);

- (3) Gán đối tượng Command cho thuộc tính SelectCommand

 SqlDataAdapter da = new SqlDataAdapter(); SqlConnection conn = new SqlConnection(connStr); da.SelectCommand = new SqlCommand(sql, conn);

-
• Sau khi tạo ra đối tượng DataAdapter, phương thức Fill của nó được thực thi để nạp dữ liệu vào table.
• Ví dụ: một table mới được tạo ra với tên mặc định là “Table”:

 DataSet ds = new DataSet(); // Tạo ra một DataTable, nạp dữ liệu vào, và đưa DataTable vào DataSet int nRecs = da.Fill(ds); // trả về số lượng record được nạp vào DataTable // Nếu muốn đặt tên khác cho DataTable trong DataSet // thì sử dụng code như thế này int nRecs = da.Fill(ds, "nhanvien");

-
4.5. Cập nhật CSDL bằng DataAdapter

• CommandBuilder
– Một đối tượng CommandBuilder sẽ sinh ra các Command cần thiết để thực hiện việc cập nhật nguồn dữ liệu tạo ra bởi DataSet.
– Cách tạo đối tượng CommandBuilder là truyền đối tượng DataAdapter cho phương thức khởi dựng của nó; sau đó, khi phương thức DataAdapter.Update được gọi, các lệnh SQL sẽ được sinh ra và thực thi. – Đoạn code dưới đây minh họa cách thức thay đổi dữ liệu ở một DataTable và cập nhật lên CSDL tương ứng bằng DataAdapter:

 //Giả sử đã có 1 DataSet ds chứa dữ liệu của bảng Khoa DataTable dt = ds.Tables["Khoa"]; // (1) Dùng commandBuilder để sinh ra các Command cần thiết SqlCommandBuilder sb = new SqlCommandBuilder(da); // (2) Thực hiện thay đổi dữ liệu: thêm 1 khoa mới DataRow drow = dt.NewRow(); drow["Makhoa"] = 12; drow["Tenkhoa"] = "abc"; dt.Rows.Add(drow); // (3) Thực hiện thay đổi dữ liệu: xóa 1khoa dt.Rows[4].Delete(); // (4) Thực hiện thay đổi dữ liệu: thay đổi giá trị 1 dòng dữ liệu dt.Rows[5]["Tenkhoa"] = "this must be changed"; // (5) Tiến hành cập nhật lên CSDL int nUpdate = da.Update(ds, "Khoa");

-
4.6. Định nghĩa Relationships giữa các Table trong DataSet

• Một DataRelation là một mối quan hệ parent-child giữa hai đối tượng DataTables. Nó được định nghĩa dựa trên việc so khớp các columns trong 2 DataTable.
• Cú pháp hàm khởi dựng như sau:

 public DataRelation(string relationName, DataColumn parentColumn, DataColumn childColumn)

- • Một DataSet có thuộc tính Relations giúp quản lý tập hợp các DataRelation đã được định nghĩa trong DataSet. Sử dụng phương thức Relations.Add để thêm các DataRelation vào tập hợp Relations

• Ví dụ: thiết lập mối quan hệ giữa hai bảng khoa và docgia để có thể liệt kê danh sách các docgia của mỗi khoa

 string connStr = "Data Source=<tên máy chủ>;InitialCatalog=quanlythuvien; Trusted_Connection=yes"; DataSet ds = new DataSet(); // (1) Fill bảng docgia string sql = "SELECT * FROM docgia"; SqlConnection conn = new SqlConnection(connStr); SqlCommand cmd = new SqlCommand(); SqlDataAdapter da = new SqlDataAdapter(sql, conn); da.Fill(ds, "docgia"); // (2) Fill bảng khoa sql = "SELECT * FROM khoa"; da.SelectCommand.CommandText = sql; da.Fill(ds, "khoa");

-
• Ví dụ: thiết lập mối quan hệ giữa hai bảng khoa và docgia để có thể liệt kê danh sách các docgia của
mỗi khoa

 // (3) Định nghĩa relationship giữa 2 bảng khoa và docgia DataTable parent = ds.Tables["khoa"]; DataTable child = ds.Tables["docgia"]; DataRelation relation = new DataRelation("khoa_docgia", parent.Columns["makhoa"], child.Columns["makhoa"]);

-
• Ví dụ: thiết lập mối quan hệ giữa hai bảng khoa và docgia để có thể liệt kê danh sách các docgia của
mỗi khoa

 // (4) Đưa relationship vào DataSet ds.Relations.Add(relation); // (5) Liệt kê các đọc giả của từng khoa foreach (DataRow r in parent.Rows) { Console.WriteLine(r["tenkhoa"]); // Tên khoa foreach (DataRow rc in r.GetChildRows("khoa_docgia")) { Console.WriteLine(" " + rc["HoTen"]); } }

-

 

5. Sử dụng Data Binding
• Các điều khiển để thiết kế giao diện như TextBox, ListBox, RadioButton, ComBoBox và các điều khiển của ADO.NET như DataSet, DataTable và DataView thường làm việc một cách độc lập nhau, tuy nhiên trong một số tình huống chúng cần kết hợp lại với nhau.
• Vd: để hiển thị tên khoa từ csdl ra TextBox, ta cần tạo ra 1 DataSet chứa dữ liệu của bảng khoa và 1
TextBox, sau đó liên kết dữ liệu trong DataSet vào TextBox. Sự kết hợp giữa hai điều khiển này có thể sử dụng DataBinding.
5.1. Các loại của Binding
• ADO.NET cung cấp 2 loại Binding:
– DataBinding đơn giản (Simple DataBinding): Tại một thời điểm, một giá trị đơn trong DataSet có thể bị buộc vào bất kỳ một điều khiển nào.
• Ví dụ: giả sử đã có 1 DataSet ds chứa dữ liệu của bảng Khoa, cần buộc tên khoa vào TextBox txttenkhoa:
• txttenkhoa.DataBindings.Add(“Text”, ds, “khoa.tenkhoa”);
• Khi đó mọi thay đổi trên DataSet ds sẽ ảnh hưởng đếnTextBox txttenkhoa và ngược lại.
– DataBinding phức tạp (Complex DataBinding): Các dữ liệu trong DataSet bị buộc vào một điều khiển thay vì chỉ một giá trị đơn. Chỉ có DataGidView và ComboBox hỗ trợ chức năng DataBinding phức tạp.

• DataBinding phức tạp:
– Ví dụ: giả sử đã có 1 DataSet ds chứa dữ liệu của bảng Khoa, cần buộc tên khoa vào ComboBox cmbkhoa và buộc toàn bộ dữ liệu của bảng khoa vào DataSet ds:

 //Buộc tenkhoa của bảng khoa trong DataSet ds // vào cmbkhoa cmbkhoa.DataSource = ds; cmbkhoa.DisplayMember = "khoa.tenkhoa"; //Buộc toàn bộ dữ liệu của bảng khoa trong // DataSet ds vào DataGridView dgvkhoa dgvKhoa.DataSource = ds; dgvKhoa.DataMember = "khoa";

-
5.2. Các nguồn dữ liệu của DataBinding

• Nhiều thành phần có thể hoạt động như nguồn dữ liệu của DataBinding. Bất kỳ các thành phần được cài đặt từ giao diện Ilist có thể xem là như nguồn dữ liệu của DataBinding.
• Các ví dụ sau minh họa bằng cách nào để sử dụng DataTable, DataView, DataSet và Mảng như là
nguồn dữ liệu để cài đặt DataBinding đơn giản và phức tạp.
• DataTable: lưu trữ dữ liệu của một bảng trong cơ sở dữ liệu.

 DataTable t = ds.Tables["khoa"]; //DataBinding đơn giản txttenkhoa.DataBindings.Add("Text", t, "tenkhoa"); //DataBinding phức tạp cmbkhoa.DataSource = t; cmbkhoa.DisplayMember = "tenkhoa"; dgvKhoa.DataSource = t; dgvKhoa.DataMember = "khoa";

- • DataView:

 DataView dv = new DataView(ds.Tables["khoa"]); //DataBinding đơn giản txttenkhoa.DataBindings.Add("Text", dv, "tenkhoa"); //DataBinding phức tạp cmbkhoa.DataSource = dv; cmbkhoa.DisplayMember = "tenkhoa"; dgvKhoa.DataSource = dv;

- • Mảng:

 int[] t = new int[4] { 12, 2, 3, 4 }; //DataBinding đơn giản txttenkhoa.DataBindings.Add("Text", t, ""); //DataBinding phức tạp cmbkhoa.DataSource = t;

-
6. Lựa chọn giữa mô hình Kết nối và mô hình Ngắt kết nối

• DataSet là một lựa chọn tốt khi:
– Dữ liệu cần được serialize (tuần tự hóa) và/hoặc gửi đi bằng HTTP.
– Các điều khiển read-only trên Form Win Form được kết buộc (bind) với data source.
– Một điều khiển Win Form như GridView hay DataView được kết buộc với một data source có
khả năng cập nhật được.
– Một ứng dụng desktop cần thêm, xóa, sửa các dòng dữ liệu.
• DataReader là lựa chọn cho những trường hợp:
– Cần quản lý một số lượng lớn các record, lớn đến mức mà bộ nhớ và thời gian để nạp dữ liệu cho
DataSet là phi thực tế.
– Dữ liệu là read-only và được kết buộc với một điều khiển loại danh sách (list control) của WinForm hoặc WebForm.
– CSDL là không ổn định và thay đổi thường xuyên.

Trên đây là [C#][Basic][Chương VIII] DATA PROCESSING WITH ADO.NET (XỬ LÝ DỮ LIỆU VỚI ADO.NET), nếu tìm thấy sai sót hoặc có ý kiến, góp ý gì thì các bạn hãy bình luận phía dưới nha. Cảm ơn các bạn đã ghé thăm blog của mình. Chúc các bạn học tốt!

Chuyên mục: Kiến thức

Related Articles

Trả lời

Email của bạn sẽ không được hiển thị công khai.

Check Also
Close
Back to top button
444 live app 444 live 444 live app 444live kisslive kiss live yy live yylive