Tài liệu tự học C++, thực hành C++
Trang 1Hue-Aptech | Tr ầ n V ă n Long – Email: tvlongsp@gmail.com Trang 1
CH ƯƠ NG 5 – ADO.NET
T ừ ứ ng d ụ ng, ta có th ể k ế t n ố i và thao tác v ớ i c ơ s ở d ữ li ệ u b ằ ng 2 ph ươ ng pháp sau:
1 K ế t n ố i th ườ ng xuyên
2 K ế t n ố i không th ườ ng xuyên
Ph ầ n 1 K ế t n ố i th ườ ng xuyên
1 Các bước thực hiện
B ướ c 1: Sử d ụ ng Connection để k ế t n ố i đế n c ơ s ở d ữ li ệ u
B ướ c 2: Thiế t l ậ p câu l ệ nh th ự c thi: Insert, Select, Update, Delete
B ướ c 3: Thự c hi ệ n l ệ nh
• M ở k ế t n ố i
• Th ự c thi câu l ệ nh, x ử lý d ữ li ệ u tr ả v ề
• Đ óng k ế t n ố i
2 Ví dụ mẫu
Thi ế t k ế giao di ệ n g ồ m các ph ầ n nh ư hình sau:
- Khi Load form các d ữ li ệ u t ừ b ả ng Customers trong CSDL Northwind c ủ a SQL Server
2000 s ẽ đượ c hi ể n th ị trên ListView và DataGridView
- Khi ch ọ n 1 dòng trên ListView ho ặ c DataGridView, d ữ li ệ u c ủ a dòng t ươ ng ứ ng s ẽ hi ể n th ị
trên các TextBox
- Khi click vào nút Insert, d ữ li ệ u trong các Textbox đượ c thêm vào c ơ s ở d ữ li ệ u
- Khi click vào nút Update, record đượ c ch ọ n s ẽ đượ c ch ỉ nh s ử a và c ậ p nh ậ t vào CSDL
- Khi click nút Delete, record đượ c ch ọ n s ẽ b ị xóa kh ỏ i CSDL
Trang 2Hue-Aptech | Tr ầ n V ă n Long – Email: tvlongsp@gmail.com Trang 2
Ví d ụ 1: đọ c d ữ li ệ u t ừ b ả ng Customers trong CSDL Northwind c ủ a SQL Server 2000 và
hi ể n th ị lên ListView và DataGridView
// 1 Thiết lập kết nối
string strConn = "server=.; Database = Northwind; uid=sa; pwd=;";
SqlConnection cnNorth = new SqlConnection(strConn);
// 2 Thiết lập câu lệnh
string sqlSelect = "select CustomerID, CompanyName, Address, City from
Customers";
SqlCommand cmdNorth = new SqlCommand(sqlSelect, cnNorth);
cmdNorth.Connection.Open();
// 3 Thực hiện lệnh
SqlDataReader reader = cmdNorth.ExecuteReader();
// Lấy dữ liệu để hiển thị, xử lý qua đối tượng Reader
// Xem ví dụ 1.1 hoặc ví dụ 1.2
// …
// Đóng kết nối
cmdNorth.Connection.Close();
Ví d ụ 1.1: Đ o n ch ươ ng trình sau mô t ả vi ệ c đọ c d ữ li ệ u t ừ đố i t ượ ng reader và hi ể n th ị lên ListView
CustomerInfo cm; // Xem ví dụ 1.3
while (reader.Read())
{
cm = new CustomerInfo();
cm.CustId = reader.GetString(0);
cm.ContactName = reader.GetString(1);
if (reader.IsDBNull(2)) cm.CustAddress = "";
else cm.CustAddress =reader.GetString(2);
if (reader.IsDBNull(3)) cm.City = "";
else cm.City =reader.GetString(3);
ListViewItem lvItem = new ListViewItem(cm.CustId);
lvItem.SubItems.Add(cm.ContactName);
lvItem.SubItems.Add(cm.CustAddress);
lvItem.SubItems.Add(cm.City);
lvItem.Tag = cm;
lsvCustomer.Items.Add(lvItem);
}
Ví d ụ 1.2: Đ o n ch ươ ng trình sau mô t ả vi ệ c đọ c d ữ li ệ u t ừ đố i t ượ ng reader và hi ể n th ị lên DataGridView
ArrayList list = new ArrayList ();
CustomerInfo cm; // Xem ví dụ 1.3
while (reader.Read())
{
cm = new CustomerInfo();
cm.CustId = reader.GetString(0);
cm.ContactName = reader.GetString(1);
if (reader.IsDBNull(2)) cm.CustAddress = "";
else cm.CustAddress =reader.GetString(2);
if (reader.IsDBNull(3)) cm.City = "";
else cm.City =reader.GetString(3);
list.Add(cm);
Trang 3Hue-Aptech | Tr ầ n V ă n Long – Email: tvlongsp@gmail.com Trang 3
}
dataGridView1.DataSource = list;
Ví d ụ 1.3: CustomerInfo là l ớ p mô t ả các thông tin v ề đố i t ượ ng Customer CustomerInfo
đượ c vi ế t nh ư sau:
public class CustomerInfo
{
string custId;
string contactName;
string custAddress;
string city;
public CustomerInfo() { }
public CustomerInfo(string custId, string contactName, string custAddress, string city)
{ this.custId = custId;
this.contactName = contactName;
this.custAddress = custAddress;
this.city = city;
} public string CustId {
get {return custId;}
set {custId = value;}
} public string ContactName {
get {return contactName;}
set {contactName = value;}
} public string CustAddress {
get {return custAddress;}
set {custAddress = value;}
} public string City {
get {return city;}
set {city = value;}
} }
Ví d ụ 2: L ấ y d ữ li ệ u t ừ các Textbox: txtID, txtName, txt Ả ddress và txtCity để l ư u vào Database
và c ậ p nh ậ t m ớ i d ữ li ệ u hi ể n th ị trên form
private void cmdInsert_Click(object sender, System.EventArgs e)
{
// 1 Kết nối
string strConn = "server=(local); Database = Northwind; uid=sa; pwd=;";
SqlConnection cnNorth = new SqlConnection(strConn);
// 2 Thiết đặt câu lệnh thực thi
string sqlInsert= "insert into Customers(CustomerID, " +
"CompanyName, Address, City) values(@CustomerID, @CompanyName, "+
"@Address, @City)";
SqlCommand cmdNorth = new SqlCommand(sqlInsert, cnNorth);
cmdNorth.Parameters.Add("@CustomerID", SqlDbType.NChar);
cmdNorth.Parameters.Add("@CompanyName", SqlDbType.NChar);
cmdNorth.Parameters.Add("@Address", SqlDbType.NChar);
cmdNorth.Parameters.Add("@City", SqlDbType.NChar);
cmdNorth.Parameters[0].Value = txtID.Text;
cmdNorth.Parameters[1].Value = txtName.Text;
cmdNorth.Parameters[2].Value = txtAddress.Text;
Trang 4Hue-Aptech | Tr ầ n V ă n Long – Email: tvlongsp@gmail.com Trang 4
cmdNorth.Parameters[3].Value = txtCity.Text;
// 3 Thực thi lệnh
cmdNorth.Connection.Open();
int kq = cmdNorth.ExecuteNonQuery();
if (kq > 0)
{
MessageBox.Show("Dữ liệu đã cập nhật!");
// Gọi lại hàm Load dữ liệu ở Ví dụ 1
}
else
{
MessageBox.Show("Có lỗi xãy ra!");
}
cmdNorth.Connection.Close();
}
Ví d ụ 3: Ch ọ n 1 dòng trên ListView d ữ li ệ u t ươ ng ứ ng s ẽ hi ể n th ị trên các TextBox
private void lsvCustomer_SelectedIndexChanged(object sender,
System.EventArgs e)
{
if (lsvCustomer.SelectedItems.Count == 0)
return;
CustomerInfo cm = lvCustomer.SelectedItems[0].Tag as CustomerInfo;
txtID.Text = cm.CustId;
txtName.Text = cm.ContactName;
txtAddress.Text = cm.CustAddress;
txtCity.Text = cm.City;
}
Ví d ụ 4: L ư u d ữ li ệ u sau khi đ ã hi ệ u ch ỉ nh trên TextBox vào CSDL
private void cmdUpdate_Click(object sender, System.EventArgs e)
{
if (lsvCustomer.SelectedItems.Count == 0)
return;
// Lấy thông tin về đối tượng đang được chọn
CustomerInfo old = lsvCustomer.SelectedItems[0].Tag as CustomerInfo;
// Lấy thông tin sau khi đã chỉnh sửa
CustomerInfo cm = new CustomerInfo(txtID.Text, txtName.Text,
txtAddress.Text, txtCity.Text);
// 1 Đối tượng kết nối
string strConn = "server=(local); Database = Northwind; uid=sa; pwd=;"
SqlConnection cnNorth = new SqlConnection(strConn);
// 2 Câu lệnh thực thi
string sqlUpdate ="update Customers set CustomerID = "+
"@CustomerID, CompanyName = @CompanyName, Address = @Address, "+
"City = @City where CustomerID = @OrigCustomerID";
SqlCommand cmdNorth = new SqlCommand(sqlUpdate, cnNorth);
cmdNorth.Parameters.Add("@CustomerID", SqlDbType.NChar);
cmdNorth.Parameters.Add("@CompanyName", SqlDbType.NChar);
cmdNorth.Parameters.Add("@Address", SqlDbType.NChar);
cmdNorth.Parameters.Add("@City", SqlDbType.NChar);
cmdNorth.Parameters.Add("@OrigCustomerID", SqlDbType.NChar);
cmdNorth.Parameters[0].Value = cm.CustId;
cmdNorth.Parameters[1].Value = cm.ContactName;
cmdNorth.Parameters[2].Value = cm.CustAddress;
cmdNorth.Parameters[3].Value = cm.City;
cmdNorth.Parameters[4].Value = old.CustId;
// 3 Thực thi lệnh
cmdNorth.Connection.Open();
int kq = cmdNorth.ExecuteNonQuery();
if (kq > 0)
{
MessageBox.Show("Cập nhật thành công!");
//Gọi lại phương thức Load dữ liệu ở Ví dụ 1
}
else
Trang 5Hue-Aptech | Tr ầ n V ă n Long – Email: tvlongsp@gmail.com Trang 5
MessageBox.Show("Lỗi!");
cmdNorth.Connection.Close();
}
Ví d ụ 5: Xóa dòng đượ c ch ọ n
private void cmdDelete_Click(object sender, System.EventArgs e)
{
if (lsvCustomer.SelectedItems.Count == 0)
return;
// Lấy thông tin về đối tượng đang được chọn
CustomerInfo cm = lsvCustomer.SelectedItems[0].Tag as CustomerInfo;
// 1 Đối tượng kết nối
string strConn = "server=(local); Database = Northwind; uid=sa; pwd=;"
SqlConnection cnNorth = new SqlConnection(strConn);
// 2 Câu lệnh thực thi
string sqlUpdate ="Delete from Customers where CustomerID=@CustomerID";
SqlCommand cmdNorth = new SqlCommand(sqlUpdate, cnNorth);
cmdNorth.Parameters.Add("@CustomerID", SqlDbType.NChar);
cmdNorth.Parameters[0].Value = cm.CustId;
// 3 Thực thi lệnh
cmdNorth.Connection.Open();
int kq = cmdNorth.ExecuteNonQuery();
if (kq > 0)
{
MessageBox.Show("Cập nhật thành công!");
//Gọi lại phương thức Load dữ liệu ở Ví dụ 1
}
else
MessageBox.Show("Lỗi!");
cmdNorth.Connection.Close();
}
3 Bài tập
Bài 1: Thi ế t k ế CSDL và Xây d ự ng ứ ng d ụ ng qu ả n lý thông tin khách hàng v ớ i các yêu c ầ u sau:
- Form Đă ng nh ậ p: để đă ng nh ậ p tr ướ c khi s ử d ụ ng ứ ng d ụ ng
- Ki ể m tra d ữ li ệ u r ỗ ng tr ướ c khi th ự c
hi ệ n vi ệ c x ử lý đă ng nh ậ p
- N ế u đă ng nh ậ p thành công thì cho phép
s ử d ụ ng ph ầ n Qu ả n lý
- Form Qu ả n lý: có giao di ệ n nh ư hình bên d ướ i, form này để xem, thêm, s ử a, xóa thông tin
c ủ a khách hàng Các thông tin c ầ n qu ả n lý bao g ồ m: mã s ố , h ọ tên, ngày sinh, đị a ch ỉ ,
đ i ệ n tho ạ i, email, hình ả nh
o Thông tin khách hàng s ẽ hi ể n th ị ngay khi vào form Qu ả n lý
o Thêm m ớ i: thêm m ớ i 1 khách hàng vào CSDL
o C ậ p nh ậ t: Ch ỉ nh s ử a thông tin 1 khách hàng trong CSDL
o Xóa: Xóa thông tin m ộ t khách hàng
Trang 6Hue-Aptech | Tr ầ n V ă n Long – Email: tvlongsp@gmail.com Trang 6
Ph ầ n 2 K ế t n ố i không th ườ ng xuyên (Disconnected Architecture)
1 Các bước thực hiện
B ướ c 1: Sử d ụ ng Connection để k ế t n ố i đế n c ơ s ở d ữ li ệ u
B ướ c 2: Tạ o đố i t ượ ng DataSet
B ướ c 3: Tạ o đố i t ượ ng DataAdapter và các câu l ệ nh th ự c thi trên d ữ li ệ u
B ướ c 4: Đổ d ữ li ệ u vào DataSet
B ướ c 5: Tươ ng tác, x ử lý d ữ li ệ u trên DataSet
B ướ c 6: Lư u vào CSDL
2 Ví dụ mẫu
Trang 7Hue-Aptech | Tr ầ n V ă n Long – Email: tvlongsp@gmail.com Trang 7
{
private DataSet ds;
private SqlConnection objConn;
private SqlDataAdapter objDa;
private string STRCONN = "Server=.;Database=BMS;uid=sa;pwd=;" ;
public Form1()
{
InitializeComponent();
}
private void loadData()
{
objConn = new SqlConnection (STRCONN);
ds = new DataSet ();
objDa = new SqlDataAdapter ( "SELECT * FROM Books" , objConn);
//T ạ o các câu l ệ nh Insert, Update, Delete t ự độ ng
SqlCommandBuilder cmb = new SqlCommandBuilder (objDa);
objDa.Fill(ds, "Books" );
//Do du lieu len DataGridView
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "Books" ;
//Bind du lieu len TextBox
txtID.DataBindings.Add( "Text" , ds, "Books.BookID" );
txtTypeID.DataBindings.Add( "Text" , ds, "Books.TypeID" );
txtTitle.DataBindings.Add( "Text" , ds, "Books.Title" );
txtPublisher.DataBindings.Add( "Text" , ds, "Books.Publisher" );
txtAuthor.DataBindings.Add( "Text" , ds, "Books.Author" );
txtPrice.DataBindings.Add( "Text" , ds, "Books.Price" ); }
private void Form1_Load( object sender, EventArgs e)
{
loadData();
}
private void cmdDelete_Click( object sender, EventArgs e)
{
int i = ( int ) this BindingContext[ds, "Books" ].Position;
ds.Tables[0].Rows[i].Delete();
objDa.Update(ds, "Books" );
}
{
txtID.Enabled = true ;
txtTypeID.Enabled = true ;
txtTitle.Enabled = true ;
txtAuthor.Enabled = true ;
txtPublisher.Enabled = true ;
txtPrice.Enabled = true ;
this BindingContext[ds, "Books" ].AddNew();
}
private void cmdUpdate_Click( object sender, EventArgs e)
{
//txtID.Enabled = true;
txtTypeID.Enabled = true ;
Trang 8Hue-Aptech | Tr ầ n V ă n Long – Email: tvlongsp@gmail.com Trang 8
txtTitle.Enabled = true ;
txtAuthor.Enabled = true ;
txtPublisher.Enabled = true ;
txtPrice.Enabled = true ;
}
private void cmdSave_Click( object sender, EventArgs e)
{
objDa.Update(ds, "Books" );
}
}
3 Một số đoạn code mẫu
// Get current Rowposition
CurrencyManager cm = (CurrencyManager)this.BindingContext[ds,"Books"];
long rowPosition = (long)cm.Position;
cboTypeID.DataSource = ds;
cboTypeID.DisplayMember = "Books.TypeName";
cboTypeID.ValueMember = "Books.TypeID";
// Position to prev Record in Customer
private void btnPrev_Click(object sender, System.EventArgs e)
{
if (this.BindingContext[ds,"Books"].Position > 0)
{
this.BindingContext[ds,"Books"].Position ;
}
}
// Position to next Record in Customer
private void btnNext_Click(object sender, System.EventArgs e)
{
CurrencyManager cm = (CurrencyManager)this.BindingContext[ds,"Books"];
if (cm.Position < cm.Count - 1)
{
cm.Position++;
}
}
4 Bài tập
S ử d ụ ng Disconnected Architecture để làm l ạ i bài t ậ p ở Ph ầ n 1