Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winform - Giáo trình FPT

3,446 views

Published on

Thao tác sử dụng kiến trúc kết nối
SqlCommand
SqlDataReader
BindingSource
Điều hướng dữ liệu
Lọc dữ liệu
File config

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,446
On SlideShare
0
From Embeds
0
Number of Embeds
184
Actions
Shares
0
Downloads
469
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winform - Giáo trình FPT

  1. 1. Bài 6:LẬP TRÌNH VỚI CSDLKIẾN TRÚC KẾT NỐI & BUỘC DỮ LIỆU
  2. 2. Giới thiệu về ADO.NETCác thành phần của ADO.NETDataProviderDataSetCác loại DataProviderSql Data ProviderSqlConnectionSqlDataAdapterHệ thống bài cũGiới thiệu về ADO.NETCác thành phần của ADO.NETDataProviderDataSetCác loại DataProviderSql Data ProviderSqlConnectionSqlDataAdapterLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 2
  3. 3. Mục tiêu bài họcThao tác sử dụng kiến trúc kết nốiSqlCommandSqlDataReaderBindingSourceĐiều hướng dữ liệuLọc dữ liệuFile configThao tác sử dụng kiến trúc kết nốiSqlCommandSqlDataReaderBindingSourceĐiều hướng dữ liệuLọc dữ liệuFile configLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 3
  4. 4. THAO TÁC VỚI DỮLIỆU BẰNG KIẾNTRÚC KẾT NỐILập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 4THAO TÁC VỚI DỮLIỆU BẰNG KIẾNTRÚC KẾT NỐI
  5. 5. Kiến trúc kết nốiỨng dụng kết nối với CSDL và giữ kết nối cho đến khiđược đóngƯu điểm: Đọc dữ liệu nhanh chóng vì kết nối trực tiếp vớiCSDLNhược điểm: Ứng dụng vẫn kết nối với CSDL ngay cả khikhông thực hiện thao tác nào với CSDL  lãng phí tàinguyên  Server quá tảiKiến trúc kết nốiKiến trúc kết nốiỨng dụng kết nối với CSDL và giữ kết nối cho đến khiđược đóngƯu điểm: Đọc dữ liệu nhanh chóng vì kết nối trực tiếp vớiCSDLNhược điểm: Ứng dụng vẫn kết nối với CSDL ngay cả khikhông thực hiện thao tác nào với CSDL  lãng phí tàinguyên  Server quá tảiLập trình với CSDL - ADO.Net & Kiến trúc không kết nối 5
  6. 6. Truy vấn CSDLCommand kết nối với CSDL thông qua Connection, sau đóCommand thực thi lệnh select và trả về kết quả làDataReader chứa các bản ghi.Ứng dụng sử dụng DataReader để đọc bản ghi nàyKiến trúc kết nốiTruy vấn CSDLCommand kết nối với CSDL thông qua Connection, sau đóCommand thực thi lệnh select và trả về kết quả làDataReader chứa các bản ghi.Ứng dụng sử dụng DataReader để đọc bản ghi nàyLập trình với CSDL - ADO.Net & Kiến trúc không kết nối 6
  7. 7. Thay đổi CSDLCommand kết nối với CSDL thông qua đối tượngConnection và thực thi các lệnh SQL trực tiếp trên CSDL(lệnh insert, delete…)Kiến trúc kết nốiLập trình với CSDL - ADO.Net & Kiến trúc không kết nối 7
  8. 8. Thực thi các câu lệnh sql trên CSDL được kết nối đếnHỗ trợ kiến trúc kết nốiPhương thức khởi tạoThuộc tínhSqlCommandnew SqlCommand()new SqlCommand(lệnh-sql)New SqlCommand(lệnh-sql, Connection)Thực thi các câu lệnh sql trên CSDL được kết nối đếnHỗ trợ kiến trúc kết nốiPhương thức khởi tạoThuộc tínhLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 8new SqlCommand()new SqlCommand(lệnh-sql)New SqlCommand(lệnh-sql, Connection)Thuộc tính Mô tảConnection Đối tượng Connection được sử dụng để kết nối vớiCSDLCommandText Lệnh Sql hoặc tên của stored procedureCommandType Tên của kiểu liệt kê CommandType sẽ xác định giá trị củaCommandText được biên dịch như thế nàoParameters Chứa một collection các tham số cho lệnh
  9. 9. Thực thi các câu lệnh sql trên CSDL được kết nối đếnHỗ trợ kiến trúc kết nốiPhương thức khởi tạoThuộc tínhSqlCommandnew SqlCommand()new SqlCommand(lệnh-sql)New SqlCommand(lệnh-sql, Connection)Thực thi các câu lệnh sql trên CSDL được kết nối đếnHỗ trợ kiến trúc kết nốiPhương thức khởi tạoThuộc tínhLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 9new SqlCommand()new SqlCommand(lệnh-sql)New SqlCommand(lệnh-sql, Connection)Thuộc tính Mô tảConnection Đối tượng Connection được sử dụng để kết nối vớiCSDLCommandText Lệnh Sql hoặc tên của stored procedureCommandType Tên của kiểu liệt kê CommandType sẽ xác định giá trị củaCommandText được biên dịch như thế nàoParameters Chứa một collection các tham số cho lệnh
  10. 10. Phương thứcKiểu liệt kê CommandTypeSqlCommandPhương thức Mô tảExecuteReader() Thực thi truy vấn trong CommandText và trả về kết quảlà SqlDataReaderExecuteNoneQuery() Thực thi lệnh sql được chỉ ra trong CommandText và trảvề số dòng mà lệnh này thao tácExecuteScalar() Thực thi truy vấn được chỉ ra trong CommandText và trảvề cột đầu tiên của dòng đầu tiên của tập kết quảPhương thứcKiểu liệt kê CommandTypeLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 10ExecuteScalar() Thực thi truy vấn được chỉ ra trong CommandText và trảvề cột đầu tiên của dòng đầu tiên của tập kết quảThành viên Mô tảText CommandText chứa lệnh sql (mặc định)StoredProcedure CommandText chứa tên của stored procedureTableDirect CommandText chứa tên của bảng
  11. 11. Thao tác thêm một bản ghi vào bảng1 Khai báo các biếnSqlConnection conn;SqlCommand cmd;2. Khởi tạo chuỗi kết nốiconn = new SqlConnection("Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;UserID=sa;Password=sa");conn.Open();3. Khai báo câu lệnh truy vấnString sql = "insert into products values (B0126,Lap trinh windows,100000,16)";4. khởi tạo đối tượng SqlcommandSqlCommand cmd = new SqlCommand(sql, conn);5. Thực thi câu lệnh truy vấncmd.ExecuteNonQuery();6. Có thể đóng kết nốiconn.close();Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối1 Khai báo các biếnSqlConnection conn;SqlCommand cmd;2. Khởi tạo chuỗi kết nốiconn = new SqlConnection("Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;UserID=sa;Password=sa");conn.Open();3. Khai báo câu lệnh truy vấnString sql = "insert into products values (B0126,Lap trinh windows,100000,16)";4. khởi tạo đối tượng SqlcommandSqlCommand cmd = new SqlCommand(sql, conn);5. Thực thi câu lệnh truy vấncmd.ExecuteNonQuery();6. Có thể đóng kết nốiconn.close();11
  12. 12. Demo thao tác thêm một bản ghi vào bảngprivate void btnAddNew_Click(object sender, EventArgs e){conn = new SqlConnection("Data Source=localhost;Initial Catalog=ProductDB;Persist SecurityInfo=True;User ID=sa;Password=sa");conn.Open();String sql = "insert into products values (" + txtCode.Text + "," + txtTitle.Text + "," +System.Convert.ToInt32(txtPrice.Text) + "," + System.Convert.ToInt32(txtQuantity.Text) + ")";SqlCommand cmd = new SqlCommand(sql, conn);cmd.ExecuteNonQuery();}Lập trình với CSDL - ADO.Net & Kiến trúc không kết nốiprivate void btnAddNew_Click(object sender, EventArgs e){conn = new SqlConnection("Data Source=localhost;Initial Catalog=ProductDB;Persist SecurityInfo=True;User ID=sa;Password=sa");conn.Open();String sql = "insert into products values (" + txtCode.Text + "," + txtTitle.Text + "," +System.Convert.ToInt32(txtPrice.Text) + "," + System.Convert.ToInt32(txtQuantity.Text) + ")";SqlCommand cmd = new SqlCommand(sql, conn);cmd.ExecuteNonQuery();}12
  13. 13. Thao tác sửa bản ghi1 Khai báo các biếnSqlConnection conn;SqlCommand cmd;2. Khởi tạo chuỗi kết nốiconn = new SqlConnection("Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;UserID=sa;Password=sa");conn.Open();3. Khai báo câu lệnh truy vấnString sql = "Update products set Description=Sach PHP-Nang cao, UnitPrice=56000,OnHandQuantity=20 where ProductCode= S126 ";4. khởi tạo đối tượng SqlcommandSqlCommand cmd = new SqlCommand(sql, conn);5. Thực thi câu lệnh truy vấncmd.ExecuteNonQuery();6. Có thể đóng kết nốiconn.close();Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối1 Khai báo các biếnSqlConnection conn;SqlCommand cmd;2. Khởi tạo chuỗi kết nốiconn = new SqlConnection("Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;UserID=sa;Password=sa");conn.Open();3. Khai báo câu lệnh truy vấnString sql = "Update products set Description=Sach PHP-Nang cao, UnitPrice=56000,OnHandQuantity=20 where ProductCode= S126 ";4. khởi tạo đối tượng SqlcommandSqlCommand cmd = new SqlCommand(sql, conn);5. Thực thi câu lệnh truy vấncmd.ExecuteNonQuery();6. Có thể đóng kết nốiconn.close();13
  14. 14. Thao tác sửa bản ghiprivate void btnEdit_Click(object sender, EventArgs e){conn = new SqlConnection("Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;UserID=sa;Password=sa");conn.Open();String sql = "update products set Description=" + txtTitle.Text + ", UnitPrice=" +System.Convert.ToInt32(txtPrice.Text) + ", OnHandQuantity=" + System.Convert.ToInt32(txtQuantity.Text) + " whereProductCode="+txtCode.Text+"" ;SqlCommand cmd = new SqlCommand(sql, conn);cmd.ExecuteNonQuery();//conn.Close();}Lập trình với CSDL - ADO.Net & Kiến trúc không kết nốiprivate void btnEdit_Click(object sender, EventArgs e){conn = new SqlConnection("Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;UserID=sa;Password=sa");conn.Open();String sql = "update products set Description=" + txtTitle.Text + ", UnitPrice=" +System.Convert.ToInt32(txtPrice.Text) + ", OnHandQuantity=" + System.Convert.ToInt32(txtQuantity.Text) + " whereProductCode="+txtCode.Text+"" ;SqlCommand cmd = new SqlCommand(sql, conn);cmd.ExecuteNonQuery();//conn.Close();}14
  15. 15. Thao tác Xóa bản ghi1 Khai báo các biếnSqlConnection conn;SqlCommand cmd;2. Khởi tạo chuỗi kết nốiconn = new SqlConnection("Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;UserID=sa;Password=sa");conn.Open();3. Khai báo câu lệnh truy vấn // Xóa sách có Mã là S126String sql = "Delete from products where ProductCode= S126 ";4. khởi tạo đối tượng SqlcommandSqlCommand cmd = new SqlCommand(sql, conn);5. Thực thi câu lệnh truy vấncmd.ExecuteNonQuery();6. Có thể đóng kết nốiconn.close();Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối1 Khai báo các biếnSqlConnection conn;SqlCommand cmd;2. Khởi tạo chuỗi kết nốiconn = new SqlConnection("Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;UserID=sa;Password=sa");conn.Open();3. Khai báo câu lệnh truy vấn // Xóa sách có Mã là S126String sql = "Delete from products where ProductCode= S126 ";4. khởi tạo đối tượng SqlcommandSqlCommand cmd = new SqlCommand(sql, conn);5. Thực thi câu lệnh truy vấncmd.ExecuteNonQuery();6. Có thể đóng kết nốiconn.close();15
  16. 16. Sử dụng ExecuteReader() khi muốn lấy dữ liệu từ CSDLSử dụng ExecuteNoneQuery() khi thực thi lệnh khôngtruy vấn lên CSDLSử dụng ExecuteScalar() khi thực thi lệnh tích hợpDemo sử dụng SqlCommandstring selectStatement = ("SELECT * FROM Customers ");SqlCommand selectCommand =new SqlCommand(selectStatement, connection);SqlDataReader custReader= selectCommand.ExecuteReader();string deleteStatement = ("DELETE * FROM Customers ");SqlCommand deleteCommand =new SqlCommand(deleteStatement, connection);SqlDataReader custReader= deleteCommand.ExecuteNoneQuery();Sử dụng ExecuteReader() khi muốn lấy dữ liệu từ CSDLSử dụng ExecuteNoneQuery() khi thực thi lệnh khôngtruy vấn lên CSDLSử dụng ExecuteScalar() khi thực thi lệnh tích hợpLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 16string deleteStatement = ("DELETE * FROM Customers ");SqlCommand deleteCommand =new SqlCommand(deleteStatement, connection);SqlDataReader custReader= deleteCommand.ExecuteNoneQuery();string sumStatement = ("SELECT SUM(InvoiceTotal) FROM Invoices");SqlCommand sumCommand =new SqlCommand(sumStatement, connection);int sum= (int)sumCommand.ExecuteScalar();
  17. 17. SqlParameter chứa tham số cho SqlCommandPhương thức khởi tạoThuộc tínhSqlParameternew SqlParameter()new SqlParameter(tên, giá-trị)Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 17Thuộc tính Mô tảParameterName Tên của tham sốValue Giá trị của tham số
  18. 18. Tạo tham sốThêm tham số vào Sql CommandDemo tạo tham sốvà thêm tham số và SqlCommandSqlParameter customerIdParm = new SqlParameter();customerIdParm.ParameterName = "@CustomerId";customerIdParm.Value = customerId;// hoặcSqlParameter customerIdParm2 = new SqlParameter("@CustomerId", customerID);Tạo tham sốThêm tham số vào Sql CommandLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 18SqlParameter customerIdParm = new SqlParameter();customerIdParm.ParameterName = "@CustomerId";customerIdParm.Value = customerId;// hoặcSqlParameter customerIdParm2 = new SqlParameter("@CustomerId", customerID);selectCommand.Parameters.Add(custemerIdParm);
  19. 19. DataReader đọc tuần tự từng dòng từ luồng dữ liệucủa CSDLTăng hiệu suất bởi đọc tuần tự từng dòng nhưng tốn tàinguyên vì hỗ trợ kiến trúc kết nốiTạo SqlDataReaderIndexer/Thuộc tính/Phương thứcSqlDataReadersqlCommand.ExecuteReader()DataReader đọc tuần tự từng dòng từ luồng dữ liệucủa CSDLTăng hiệu suất bởi đọc tuần tự từng dòng nhưng tốn tàinguyên vì hỗ trợ kiến trúc kết nốiTạo SqlDataReaderIndexer/Thuộc tính/Phương thứcLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 19sqlCommand.ExecuteReader()Indexer/Thuộc tính/Phương thức Mô tả[tên-cột] Lấy giá trị của cột có tên được chỉ ra[index] Lấy giá trị của cột tại vị trí được chỉ raisClosed Cho biết data reader đã đóng chưaClose() Đóng data readerRead() Lấy giá trị tiếp theo và trả về giá trị Booleancho biết đã kết thúc data reader hay chưa
  20. 20. Thứ tự làm việc với SqlDataReaderLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 20
  21. 21. Đưa dữ liệu từ DataReader vào ListviewLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 21
  22. 22. Chức năng tìm kiếm theo mã sáchLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 22Sau khi tìm thấy dữ liệu được gán chocác TextBox
  23. 23. BINDINGSOURCELập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 23BINDINGSOURCE
  24. 24. Đối tượng BindingSource là cầu nối giữa CSDL và cácđiều khiển trên formBindingSource chứa nguồn dữ liệu liên kết với điềukhiểnCung cấp nhiều phương thức vào thuộc tính để điềuhướng và lọc dữ liệu dễ dàngBinding SourceĐối tượng BindingSource là cầu nối giữa CSDL và cácđiều khiển trên formBindingSource chứa nguồn dữ liệu liên kết với điềukhiểnCung cấp nhiều phương thức vào thuộc tính để điềuhướng và lọc dữ liệu dễ dàngLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 24Điều khiểntrên formBindingSource
  25. 25. Thuộc tínhPhương thứcBinding SourceThuộc tính Mô tảPosition Vị trí dòng hiện tại của nguồn dữ liệuCount Số dòng trong nguồn dữ liệuFilter Thiết lập bộ lọcPhương thức Mô tảLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 25Phương thức Mô tảAddNew() Thêm một dòng không có dữ liệu vào nguồn dữ liệuEndEdit() Lưu thay đổi của dòng hiện tạiCancelEdit() Bỏ qua thay đổi của dòng hiện tạiRemoveCurrent() Xóa dòng hiện tại của nguồn dữ liệuMoveFirst() Chuyển đến dòng đầu tiên của nguồn dữ liệuMovePrevious() Chuyển đến dòng trước đóMoveNext() Chuyển đến dòng tiếp theo
  26. 26. Buộc dữ liệu bằng BindingSourceDemo sử dụng BindingSourceconn = new SqlConnection(“chuỗi-kết-nối");daCustomers = new SqlDataAdapter("Select CustomerID, Name, City, State from Customers", conn);ds = new DataSet();daCustomers.Fill(ds, "customers");bs = new BindingSource();bs.DataSource = ds.Tables["customers"];dgvCusotmers.DataSource = bs;Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 26conn = new SqlConnection(“chuỗi-kết-nối");daCustomers = new SqlDataAdapter("Select CustomerID, Name, City, State from Customers", conn);ds = new DataSet();daCustomers.Fill(ds, "customers");bs = new BindingSource();bs.DataSource = ds.Tables["customers"];dgvCusotmers.DataSource = bs;
  27. 27. Xử lý sự kiện cho button >> (chuyển đến bản ghi cuốicùng)Demo sử dụng BindingSourceprivate void btnLast_Click(object sender, EventArgs e){bs.MoveLast();}Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 27
  28. 28. Demo sử dụngBindingSource để lọc dữ liệuprivate void cmbProductCode_SelectedIndexChanged(object sender, EventArgs e){string stateCode = cmbStateCode.SelectedValue.ToString();if (stateCode != "" && stateCode !="System.Data.DataRowView"){bs.Filter = "Bang = " + stateCode + "";}dgvCustomers.DataSource = bs;}Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 28private void cmbProductCode_SelectedIndexChanged(object sender, EventArgs e){string stateCode = cmbStateCode.SelectedValue.ToString();if (stateCode != "" && stateCode !="System.Data.DataRowView"){bs.Filter = "Bang = " + stateCode + "";}dgvCustomers.DataSource = bs;}Chỉ hiển thị khách hàngở bang được chọn trênComboBox
  29. 29. FILE CONFIGLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 29FILE CONFIG
  30. 30. Mỗi lần kết nối lại phải gõ vào chuỗi kết nối Khi thay đổi CSDL phải sửa nhiều lầnĐể thống nhất, Visual Sutudio cho phép lưu chuỗi kết nốivào file config và cung cấp các lớp để đọc chuỗi kết nốitừ file config Chuỗi kết nối chỉ được lưu một nơi duy nhất trên fileconfigFile app.configMỗi lần kết nối lại phải gõ vào chuỗi kết nối Khi thay đổi CSDL phải sửa nhiều lầnĐể thống nhất, Visual Sutudio cho phép lưu chuỗi kết nốivào file config và cung cấp các lớp để đọc chuỗi kết nốitừ file config Chuỗi kết nối chỉ được lưu một nơi duy nhất trên fileconfigLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 30
  31. 31. B1. Tạo file configChọn project  Add  New ItemChọn mục Application Configuration FileDemo lưu và lấychuỗi kết nối từ file configLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 31
  32. 32. B2. Thêm chuỗi kết nối vào file configDemo lưu và lấychuỗi kết nối từ file config<?xml version="1.0" encoding="utf-8" ?><configuration><connectionStrings><add name=“ProductDBConnectionString"connectionString="Data Source=SAMSUNG-R439;Initial Catalog=ProductDB;UserID=sa;Password=123456"providerName="System.Data.SqlClient" /></connectionStrings></configuration>Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 32<?xml version="1.0" encoding="utf-8" ?><configuration><connectionStrings><add name=“ProductDBConnectionString"connectionString="Data Source=SAMSUNG-R439;Initial Catalog=ProductDB;UserID=sa;Password=123456"providerName="System.Data.SqlClient" /></connectionStrings></configuration>
  33. 33. B3. Lấy chuỗi kết nốiLưu ý: để sửa dụng được lớp ConfigurationManager phảiadd thêm assembly này vàoVào Project  Add Reference…  chọnSystem.ConfigurationDemo lưu và lấychuỗi kết nối từ file configstring connectionString = ConfigurationManager.ConnectionStrings["ProductDBConnectionString"].ToString();SqlConnection conn = new SqlConnection(connectionString);Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 33string connectionString = ConfigurationManager.ConnectionStrings["ProductDBConnectionString"].ToString();SqlConnection conn = new SqlConnection(connectionString);
  34. 34. xử lý sự kiện với môhình 3 tầngLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 34
  35. 35. Demo đọc dữ liệu từ SqlDataReaderconnection.Open();SqlDataReader custReader =selectCommand.ExecuteReader(CommandBehavior.SingleRow);if (custReader.Read()){Customer customer = new Customer();customer.CustomerID = (int)custReader["CustomerID"];customer.Name = custReader["Name"].ToString();customer.Address = custReader["Address"].ToString();customer.City = custReader["City"].ToString();customer.State = custReader["State"].ToString();customer.ZipCode = custReader["ZipCode"].ToString();return customer;}connection.Close();Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 35connection.Open();SqlDataReader custReader =selectCommand.ExecuteReader(CommandBehavior.SingleRow);if (custReader.Read()){Customer customer = new Customer();customer.CustomerID = (int)custReader["CustomerID"];customer.Name = custReader["Name"].ToString();customer.Address = custReader["Address"].ToString();customer.City = custReader["City"].ToString();customer.State = custReader["State"].ToString();customer.ZipCode = custReader["ZipCode"].ToString();return customer;}connection.Close();Đóng và mở Connection khi thao tác với Command để thực thi lệnh Sql
  36. 36. Sử dụng phương thức ExecuteReader củaSqlCommand để lấy dữ liệuSử dụng SqlDataReader để đọc dữ liệu vào formSử dụng phương thức ExecuteNoneQuery củaSqlCommand để thêm, sửa, xóa dữ liệuDemo thao tác vớidữ liệu bằng kiến trúc kết nốiLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 36
  37. 37. Demo ứng dụng Customer MaintenanceLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 37
  38. 38. Demo xử lý sự kiện Button GetCustomerprivate void btnGetCustomer_Click(object sender, EventArgs e){int customerID = Convert.ToInt32(txtCustomerID.Text);//Tạo kết nốiSqlConnection connection = new SqlConnection ("chuỗi-kết-nối");//Tạo commandstring selectStatement= "SELECT CustomerID, Name, Address, City, State, ZipCode "+ "FROM Customers WHERE CustomerID = @CustomerID";SqlCommand selectCommand =new SqlCommand(selectStatement, connection);selectCommand.Parameters.AddWithValue("@CustomerID", customerID);//Đọc dữ liệu và gán cho các trườngconnection.Open();SqlDataReader custReader = selectCommand.ExecuteReader();if (custReader.Read()){txtName.Text = custReader["Name"].ToString();…}connection.Close();}Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 38private void btnGetCustomer_Click(object sender, EventArgs e){int customerID = Convert.ToInt32(txtCustomerID.Text);//Tạo kết nốiSqlConnection connection = new SqlConnection ("chuỗi-kết-nối");//Tạo commandstring selectStatement= "SELECT CustomerID, Name, Address, City, State, ZipCode "+ "FROM Customers WHERE CustomerID = @CustomerID";SqlCommand selectCommand =new SqlCommand(selectStatement, connection);selectCommand.Parameters.AddWithValue("@CustomerID", customerID);//Đọc dữ liệu và gán cho các trườngconnection.Open();SqlDataReader custReader = selectCommand.ExecuteReader();if (custReader.Read()){txtName.Text = custReader["Name"].ToString();…}connection.Close();}
  39. 39. Demo xử lý sự kiện trênAccept trên form Add Customerprivate void btnAccept_Click(object sender, EventArgs e){string name = txtName.Text;string address = txtAddress.Text;string city = txtCity.Text;string state = cboStates.SelectedValue.ToString();string zipCode = txtZipCode.Text;SqlConnection connection = MMABooksDB.GetConnection();string insertStatement ="INSERT Customers " +"(Name, Address, City, State, ZipCode) " +"VALUES ("+name+","+ address+","+city+","+state+","+zipCode+")";SqlCommand insertCommand =new SqlCommand(insertStatement, connection);connection.Open();insertCommand.ExecuteNonQuery();connection.Close();Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 39private void btnAccept_Click(object sender, EventArgs e){string name = txtName.Text;string address = txtAddress.Text;string city = txtCity.Text;string state = cboStates.SelectedValue.ToString();string zipCode = txtZipCode.Text;SqlConnection connection = MMABooksDB.GetConnection();string insertStatement ="INSERT Customers " +"(Name, Address, City, State, ZipCode) " +"VALUES ("+name+","+ address+","+city+","+state+","+zipCode+")";SqlCommand insertCommand =new SqlCommand(insertStatement, connection);connection.Open();insertCommand.ExecuteNonQuery();connection.Close();
  40. 40. Ứng dụng được tổ chức theo mô hình 3 tầng như sau:Tầng hiển thị: FormTầng xử lý nghiệp vụ: Customer, StateTầng CSDL: CustomerDB, MMABookDB, StateDBTổ chức ứng dụngLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 40
  41. 41. frmCustomer gọi đến lớp CustomerDB để thao tác vớiCSDLDữ liệu được truyền giữa CustomerDB và frmCustomerthông qua lớp CustomerDemo viết xử lý sự kiệnGetCustomer với mô hình 3 tầngfrmCustomerLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 41frmCustomerCustomerCustomerDB MMABookDB
  42. 42. Demo viết mã cho lớp Customerpublic class Customer{public Customer() { }public int CustomerID { get; set; }public string Name { get; set; }public string Address { get; set; }public string City { get; set; }public string State { get; set; }public string ZipCode { get; set; }}Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 42public class Customer{public Customer() { }public int CustomerID { get; set; }public string Name { get; set; }public string Address { get; set; }public string City { get; set; }public string State { get; set; }public string ZipCode { get; set; }}
  43. 43. Demo viết mã cho lớp MMABooksDBpublic static class MMABooksDB{public static SqlConnection GetConnection(){string connectionString = "chuỗi kết nối";SqlConnection connection = new SqlConnection(connectionString);connection.Open();return connection;}}Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 43public static class MMABooksDB{public static SqlConnection GetConnection(){string connectionString = "chuỗi kết nối";SqlConnection connection = new SqlConnection(connectionString);connection.Open();return connection;}}
  44. 44. Demo viết phương thứcGetCustomer của lớp CustomerDBpublic static Customer GetCustomer(int customerID){SqlConnection connection = MMABooksDB.GetConnection();string selectStatement= "SELECT CustomerID, Name, Address, City, State, ZipCode "+ "FROM Customers "+ "WHERE CustomerID = @CustomerID";SqlCommand selectCommand =new SqlCommand(selectStatement, connection);selectCommand.Parameters.AddWithValue("@CustomerID", customerID);connection.Open();SqlDataReader custReader =selectCommand.ExecuteReader(CommandBehavior.SingleRow);Customer customer = new Customer();customer.CustomerID = Convert.ToInt32(custReader["CustomerID"].ToString());customer.Name = custReader["Name"].ToString();…connection.Close();return customer;} Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 44public static Customer GetCustomer(int customerID){SqlConnection connection = MMABooksDB.GetConnection();string selectStatement= "SELECT CustomerID, Name, Address, City, State, ZipCode "+ "FROM Customers "+ "WHERE CustomerID = @CustomerID";SqlCommand selectCommand =new SqlCommand(selectStatement, connection);selectCommand.Parameters.AddWithValue("@CustomerID", customerID);connection.Open();SqlDataReader custReader =selectCommand.ExecuteReader(CommandBehavior.SingleRow);Customer customer = new Customer();customer.CustomerID = Convert.ToInt32(custReader["CustomerID"].ToString());customer.Name = custReader["Name"].ToString();…connection.Close();return customer;}
  45. 45. Xử lý sự kiện choButton GetCustomer trên formprivate void btnGetCustomer_Click(object sender, EventArgs e){if (Validator.IsPresent(txtCustomerID) &&Validator.IsInt32(txtCustomerID)){int customerID = Convert.ToInt32(txtCustomerID.Text);this.GetCustomer(customerID);if (customer == null){MessageBox.Show("No customer found with this ID. " +"Please try again.", "Customer Not Found");this.ClearControls();}elsethis.DisplayCustomer();}}Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 45private void btnGetCustomer_Click(object sender, EventArgs e){if (Validator.IsPresent(txtCustomerID) &&Validator.IsInt32(txtCustomerID)){int customerID = Convert.ToInt32(txtCustomerID.Text);this.GetCustomer(customerID);if (customer == null){MessageBox.Show("No customer found with this ID. " +"Please try again.", "Customer Not Found");this.ClearControls();}elsethis.DisplayCustomer();}}
  46. 46. Các đối tượng SqlConnection, SqlCommand,SqlDataReader thao tác với CSDL SQL server bằngkiến trúc kết nối. Trong đó SqlConnection kết nối vớiCSDL; SqlCommand lấy, thêm, sửa, xóa dữ liệu vàSqlDataReader đọc dữ liệuĐiều khiển buộc là điều khiển liên kết với dữ liệu trênCSDLThuộc tính DataSource của điều khiển buộc chỉ ranguồn dữ liệu cho điều khiển (thường là bảng trêndataset)Tổng kết bài họcCác đối tượng SqlConnection, SqlCommand,SqlDataReader thao tác với CSDL SQL server bằngkiến trúc kết nối. Trong đó SqlConnection kết nối vớiCSDL; SqlCommand lấy, thêm, sửa, xóa dữ liệu vàSqlDataReader đọc dữ liệuĐiều khiển buộc là điều khiển liên kết với dữ liệu trênCSDLThuộc tính DataSource của điều khiển buộc chỉ ranguồn dữ liệu cho điều khiển (thường là bảng trêndataset)Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 46
  47. 47. BindingSource là cầu nối giữa CSDL và các điều khiểntrên formBindingSource chứa nguồn dữ liệu liên kết với điềukhiểnBindingSource cung cấp nhiều phương thức vào thuộctính để điều hướng và lọc dữ liệu dễ dàngĐể dễ dàng phát triển ứng dụng và bảo trì, ứng dụngkết nối với CSDL được tổ chức thành mô hình 3 tầngTổng kết bài họcBindingSource là cầu nối giữa CSDL và các điều khiểntrên formBindingSource chứa nguồn dữ liệu liên kết với điềukhiểnBindingSource cung cấp nhiều phương thức vào thuộctính để điều hướng và lọc dữ liệu dễ dàngĐể dễ dàng phát triển ứng dụng và bảo trì, ứng dụngkết nối với CSDL được tổ chức thành mô hình 3 tầngLập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 47

×