Ứng dụng sử dụng DataReader để đọc bản ghi này Kiến trúc kết nối Truy vấn CSDL Command 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à Dat
Trang 1Bài 6:
LẬP TRÌNH VỚI CSDL KIẾN TRÚC KẾT NỐI & BUỘC DỮ LIỆU
Trang 2Giới thiệu về ADO.NET
Trang 4THAO TÁC VỚI DỮ
LIỆU BẰNG KIẾN TRÚC KẾT NỐI
Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 4
THAO TÁC VỚI DỮ
LIỆU BẰNG KIẾN TRÚC KẾT NỐI
Trang 6Truy vấn CSDL
Command 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ày
Kiến trúc kết nối
Truy vấn CSDL
Command 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ày
Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối 6
Trang 7Thay đổi CSDL
Command kết nối với CSDL thông qua đối tượng
Connection 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ối
Trang 8Thực thi các câu lệnh sql trên CSDL được kết nối đến
Thực thi các câu lệnh sql trên CSDL được kết nối đến
Thuộc tính Mô tả
Connection Đối tượng Connection được sử dụng để kết nối với
CSDL CommandText Lệnh Sql hoặc tên của stored procedure
CommandType Tên của kiểu liệt kê CommandType sẽ xác định giá trị của
CommandText được biên dịch như thế nào Parameters Chứa một collection các tham số cho lệnh
Trang 9Thực thi các câu lệnh sql trên CSDL được kết nối đến
Thực thi các câu lệnh sql trên CSDL được kết nối đến
Hỗ trợ kiến trúc kết nối
Phương thức khởi tạo
Thuộc tính
new 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ới
CSDL CommandText Lệnh Sql hoặc tên của stored procedure
CommandType Tên của kiểu liệt kê CommandType sẽ xác định giá trị của
CommandText được biên dịch như thế nào Parameters Chứa một collection các tham số cho lệnh
Trang 10về số dòng mà lệnh này thao tác ExecuteScalar() 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ức
Kiểu liệt kê CommandType
Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 10
ExecuteScalar() 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 procedure
TableDirect CommandText chứa tên của bảng
Trang 11Thao tác thêm một bản ghi vào bảng
1 Khai báo các biến
SqlConnection conn;
SqlCommand cmd;
2 Khởi tạo chuỗi kết nối
conn = new SqlConnection(" Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;User ID=sa;Password=sa");
conn.Open();
3 Khai báo câu lệnh truy vấn
String sql = "insert into products values ('B0126','Lap trinh windows',100000,16)";
4 khởi tạo đối tượng Sqlcommand
SqlCommand cmd = new SqlCommand(sql, conn);
5 Thực thi câu lệnh truy vấn
2 Khởi tạo chuỗi kết nối
conn = new SqlConnection(" Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;User ID=sa;Password=sa");
conn.Open();
3 Khai báo câu lệnh truy vấn
String sql = "insert into products values ('B0126','Lap trinh windows',100000,16)";
4 khởi tạo đối tượng Sqlcommand
SqlCommand cmd = new SqlCommand(sql, conn);
5 Thực thi câu lệnh truy vấn
cmd.ExecuteNonQuery();
6 Có thể đóng kết nối
conn.close();
Trang 12Demo thao tác thêm một bản ghi vào bảng
private void btnAddNew_Click(object sender, EventArgs e)
Lập trình với CSDL - ADO.Net & Kiến trúc không kết nối
private void btnAddNew_Click(object sender, EventArgs e)
Trang 13Thao tác sửa bản ghi
1 Khai báo các biến
SqlConnection conn;
SqlCommand cmd;
2 Khởi tạo chuỗi kết nối
conn = new SqlConnection(" Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;User ID=sa;Password=sa");
conn.Open();
3 Khai báo câu lệnh truy vấn
String sql = "Update products set Description='Sach PHP-Nang cao', UnitPrice=56000, OnHandQuantity=20 where ProductCode= 'S126' ";
4 khởi tạo đối tượng Sqlcommand
SqlCommand cmd = new SqlCommand(sql, conn);
5 Thực thi câu lệnh truy vấn
2 Khởi tạo chuỗi kết nối
conn = new SqlConnection(" Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;User ID=sa;Password=sa");
conn.Open();
3 Khai báo câu lệnh truy vấn
String sql = "Update products set Description='Sach PHP-Nang cao', UnitPrice=56000, OnHandQuantity=20 where ProductCode= 'S126' ";
4 khởi tạo đối tượng Sqlcommand
SqlCommand cmd = new SqlCommand(sql, conn);
5 Thực thi câu lệnh truy vấn
cmd.ExecuteNonQuery();
6 Có thể đóng kết nối
conn.close();
Trang 14Thao tác sửa bản ghi
private void btnEdit_Click(object sender, EventArgs e)
{
conn = new SqlConnection("Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;User
ID=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) + " where ProductCode='"+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ối
private void btnEdit_Click(object sender, EventArgs e)
{
conn = new SqlConnection("Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;User
ID=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) + " where ProductCode='"+txtCode.Text+"'" ;
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
//conn.Close();
}
14
Trang 15Thao tác Xóa bản ghi
1 Khai báo các biến
SqlConnection conn;
SqlCommand cmd;
2 Khởi tạo chuỗi kết nối
conn = new SqlConnection(" Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;User ID=sa;Password=sa");
conn.Open();
String sql = "Delete from products where ProductCode= 'S126' ";
4 khởi tạo đối tượng Sqlcommand
SqlCommand cmd = new SqlCommand(sql, conn);
5 Thực thi câu lệnh truy vấn
2 Khởi tạo chuỗi kết nối
conn = new SqlConnection(" Data Source=localhost;Initial Catalog=ProductDB;Persist Security Info=True;User ID=sa;Password=sa");
conn.Open();
String sql = "Delete from products where ProductCode= 'S126' ";
4 khởi tạo đối tượng Sqlcommand
SqlCommand cmd = new SqlCommand(sql, conn);
5 Thực thi câu lệnh truy vấn
cmd.ExecuteNonQuery();
6 Có thể đóng kết nối
conn.close();
Trang 16Sử dụng ExecuteReader() khi muốn lấy dữ liệu từ CSDL
Sử dụng ExecuteNoneQuery() khi thực thi lệnh không
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ừ CSDL
Sử dụng ExecuteNoneQuery() khi thực thi lệnh không
truy vấn lên CSDL
Sử dụng ExecuteScalar() khi thực thi lệnh tích hợp
Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 16
string 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();
Trang 17SqlParameter chứa tham số cho SqlCommand
Phương thức khởi tạo
Thuộc tính
SqlParameter
new SqlParameter() new SqlParameter(tên, giá-trị)
Thuộc tính Mô tả
ParameterName Tên của tham số
Trang 18Tạo tham số
Thêm tham số vào Sql Command
Demo tạo tham số
và thêm tham số và SqlCommand
SqlParameter customerIdParm = new SqlParameter();customerIdParm.ParameterName = "@CustomerId";
Thêm tham số vào Sql Command
Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 18
SqlParameter customerIdParm = new SqlParameter();customerIdParm.ParameterName = "@CustomerId";
Trang 19DataReader đọc tuần tự từng dòng từ luồng dữ liệu
của CSDL
Tăng hiệu suất bởi đọc tuần tự từng dòng nhưng tốn tài
nguyên vì hỗ trợ kiến trúc kết nối
Tăng hiệu suất bởi đọc tuần tự từng dòng nhưng tốn tài
nguyên vì hỗ trợ kiến trúc kết nối
Tạo SqlDataReader
Indexer/Thuộc tính/Phương thức
sqlCommand.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ỉ ra
isClosed Cho biết data reader đã đóng chưa
Read() Lấy giá trị tiếp theo và trả về giá trị Boolean
Trang 20Thứ tự làm việc với SqlDataReader
Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 20
Trang 21Đưa dữ liệu từ DataReader vào Listview
Trang 22Chức năng tìm kiếm theo mã sách
Lậ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 cho
các TextBox
Trang 23BINDINGSOURCE BINDINGSOURCE
Trang 24Đối tượng BindingSource là cầu nối giữa CSDL và các
điều khiển trên form
BindingSource chứa nguồn dữ liệu liên kết với điều
khiển
Cung cấp nhiều phương thức vào thuộc tính để điều
hướng và lọc dữ liệu dễ dàng
Binding Source
Đối tượng BindingSource là cầu nối giữa CSDL và các
điều khiển trên form
BindingSource chứa nguồn dữ liệu liên kết với điều
BindingSource
Trang 25AddNew() Thêm một dòng không có dữ liệu vào nguồn dữ liệu
EndEdit() Lưu thay đổi của dòng hiện tại
CancelEdit() Bỏ qua thay đổi của dòng hiện tại
RemoveCurrent() Xóa dòng hiện tại của nguồn dữ liệu
MoveFirst() Chuyển đến dòng đầu tiên của nguồn dữ liệu
MovePrevious() Chuyển đến dòng trước đó
MoveNext() Chuyển đến dòng tiếp theo
Trang 26Buộc dữ liệu bằng BindingSource
Demo sử dụng BindingSource
conn = new SqlConnection( “chuỗi-kết-nối");
daCustomers = new SqlDataAdapter
( "Select CustomerID, Name, City, State from Customers", conn);
Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 26
conn = new SqlConnection( “chuỗi-kết-nối");
daCustomers = new SqlDataAdapter
( "Select CustomerID, Name, City, State from Customers", conn);
Trang 27Xử lý sự kiện cho button >> (chuyển đến bản ghi cuối
Trang 28Demo sử dụng BindingSource để lọc dữ liệu
private void cmbProductCode_SelectedIndexChanged(object sender, EventArgs e) {
string stateCode = cmbStateCode.SelectedValue.ToString();
if (stateCode != "" && stateCode !="System.Data.DataRowView")
Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 28
private void cmbProductCode_SelectedIndexChanged(object sender, EventArgs e) {
string stateCode = cmbStateCode.SelectedValue.ToString();
if (stateCode != "" && stateCode !="System.Data.DataRowView")
Trang 29FILE CONFIG FILE CONFIG
Trang 30Mỗ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ối
từ file config
Chuỗi kết nối chỉ được lưu một nơi duy nhất trên file
config
File app.config
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ối
Trang 31B1 Tạo file config
Chọn project Add New Item
Chọn mục Application Configuration File
Demo lưu và lấy chuỗi kết nối từ file config
Trang 32B2 Thêm chuỗi kết nối vào file config
Demo lưu và lấy chuỗ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;User ID=sa;Password=123456"
< add name =“ProductDBConnectionString"
connectionString ="Data Source=SAMSUNG-R439;Initial Catalog=ProductDB;User ID=sa;Password=123456"
providerName ="System.Data.SqlClient" />
</connectionStrings>
</configuration>
Trang 33B3 Lấy chuỗi kết nối
Lưu ý: để sửa dụng được lớp ConfigurationManager phải
add thêm assembly này vào
Vào Project Add Reference… chọn
SqlConnection conn = new SqlConnection(connectionString);
[ "ProductDBConnectionString"].ToString();
SqlConnection conn = new SqlConnection(connectionString);
Trang 34xử lý sự kiện với mô
hình 3 tầng
Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 34
Trang 35Demo đọc dữ liệu từ SqlDataReader
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 customer = new Customer();
customer.CustomerID = ( int)custReader[ "CustomerID"]; customer.Name = custReader["Name"].ToString();
customer.Address = custReader["Address"].ToString(); customer.City = custReader["City"].ToString();
Trang 36Sử dụng phương thức ExecuteReader của
SqlCommand để lấy dữ liệu
Sử dụng SqlDataReader để đọc dữ liệu vào form
Sử dụng phương thức ExecuteNoneQuery của
SqlCommand để thêm, sửa, xóa dữ liệu
Demo thao tác với
dữ liệu bằng kiến trúc kết nối
Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 36
Trang 37Demo ứng dụng Customer Maintenance
Trang 38Demo xử lý sự kiện Button GetCustomer
private void btnGetCustomer_Click(object sender, EventArgs e)
new SqlCommand(selectStatement, connection);
selectCommand.Parameters.AddWithValue( "@CustomerID", customerID);
//Đọc dữ liệu và gán cho các trường
connection.Close();
}
Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 38
private void btnGetCustomer_Click(object sender, EventArgs e)
new SqlCommand(selectStatement, connection);
selectCommand.Parameters.AddWithValue( "@CustomerID", customerID);
//Đọc dữ liệu và gán cho các trường
connection.Close();
}
Trang 39Demo xử lý sự kiện trên Accept trên form Add Customer
private 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+"','"+
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+"','"+
Trang 40Ứng dụng được tổ chức theo mô hình 3 tầng như sau:
Tầng hiển thị: Form
Tầng xử lý nghiệp vụ: Customer, State
Tầng CSDL: CustomerDB, MMABookDB, StateDB
Tổ chức ứng dụng
Lập trình với CSDL - Kiến trúc kết nối & buộc dữ liệu 40
Trang 41frmCustomer gọi đến lớp CustomerDB để thao tác với