Chủ Nhật, 28 tháng 10, 2012

Xử lý Access Database với C#. Tại sao không??

Hiện nay, có rất nhiều hệ quản trị cơ sở dữ liệu mạnh mẽ như Access, SQL Server, Oracle v.v... nhưng trong trong khuôn khổ bài bài viết này mình chỉ đề cập đến Access vì nó phổ biến, gọn nhẹ, dễ sử dụng và đa số các máy tính đều có cài Access.


1. Giới thiệu
Học không gì tốt bằng là học qua ví dụ nên chúng ta cùng tạo một project “Database Access Project”
1a. Giao diện Form chính
Gồm có button:
btnCreateSample : Tạo ra cơ sở dữ liệu mẫu để thao tác
btnLoad : Load Database SolieuTest.mdb
btnInsert : chèn thêm 1 Record vào Database
btnUpdate : Update 1 Record trong Database
btnDelete : Delete 1 Record trong Database
btnClear : Xóa tất cả dữ liệu trong các Textbox
5 Textbox tương ứng với các cột STT, Name, Address, Phone, Email trong Database
1 DataGridView để load dữ liệu Database lên
1b. Access File mẫu
File Access mà ta sử dụng tên là “SolieuTest.mdb” cấu trúc gồm có 1 bảng tên là “BangMau” bao gồm các cột sau:
STT : Number (Primary key nghĩa là mỗi Record chỉ có một STT duy nhất.)
Name, Address, Phone, Email : Text
File này được set Password bởi chức năng Set Database Password của Access. Password = 123456
File “SolieuTest.mdb” này được lưu trong thư mục Debug của Project

2. Using các namespace cần thiết
Đối với mỗi loại Database thì Net cung cấp cho ta một Namespace riêng biệt để thao tác với chúng, để có thể làm việc được với Access Database thì ta cần tham chiếu đến các namespace sau

using System.Data; //Namespace cho các đối tượng Datausing System.Data.OleDb; // Đây là namespace mà ta sẽ sử dụng cho Access 

3. Đối tượng kết nối OleDbConnection.
Rất quan trọng , nó giúp tạo ra một kết nối giữa ứng dụng của mình và Access Database của bạn. Quan trọng nhất là bạn phải tạo được một Connection String đúng đắn.

3a.Connection String : hướng dẫn cho ứng dụng cách kết nối với Access. Chuỗi connection String bao gồm các thành phần sau
Provider = Microsoft.Jet.OLEDB.4.0 // Dùng cho access
Data Source = Path đến file Access của bạn
Jet OLEDB:Database Password = Pass của file access mà bạn đã set bằng chức năng Set Database Password
User Id = admin (đây là mặc định của access)
Để tìm thêm các Connect String phục vụ cho các nhu cầu khác các bạn có thể tham khảo tại đây
http://www.connectionstrings.com/
3b. Tạo và hủy đối tượng Connect
Để thuận tiện, theo mình bạn nên tạo một kết nối có tầm vực cục bộ trong form và 2 thủ tục (1 dùng cho việc tạo kết nối khi cần thiết và 1 cho việc sử dụng xong thì hủy kết nối ngay để giải phóng tài nguyên máy tính). Bạn nên tập làm quen như thế, nếu đã xài xong một đối tượng nào đó thì nên hủy nó đi để giải phóng tài nguyên

public partial class frmMain : Form    {        #region "Biến cục bộ trong Form" //Được khai báo ngay dưới khai báo class frmMain            private OleDbConnection objConnect;            private DataTable objDataTable;        #endregion        #region "Tạo Kết nối và hủy kết nối"            ///





            /// Tạo một Connection            ///             private void subCreateConnect()            {                String varChuoiConnect = "Provider = Microsoft.Jet.OLEDB.4.0 ;" +                             "Data Source =" + Application.StartupPath + @"\Solieutest.mdb;" +                            "Jet OLEDB:Database Password = 123456;"+                            "User ID = admin";                objConnect = new OleDbConnection(varChuoiConnect);//Tạo đối tượng Connect                objConnect.Open(); //Mở kết nối            }            ///             /// Hủy kết nối            ///             private void subDestroyConnect()            {                objConnect.Close(); //Đóng kết nối                objConnect.Dispose();//Giải phóng tài nguyên                objConnect = null; //Hủy đối tượng            }        #endregion 
Các bạn thấy trong đoạn code trên có nhiều điểm đặc biết không.
#region "Biến cục bộ trong Form"
#endregion
Có nhiệm vụ bao gộp đoạn code mình lại thôi nhăm phân chia khu vực có các đoạn code thực hiện những chức năng liên quan với nhau để dễ xử lý
Application.StartupPath là đường dẫn của thư mục đang chưa file Exe ứng dụng của bạn.
@"\Solieutest.mdb” : trong đây quan trọng là chữ @ (nó đứng trước chuỗi) nó cho trình dịch biết rằng cần phải giữ nguyên giá trị chuỗi như vậy. Nếu không có chữ @ thì VS sẽ báo lỗi bởi vì dấu \ là một ký tự đặc biệt trong C#.
Nếu bạn ko xài ký tự @ thì phải viết như sau <\\Solieutest.mdb>.

Trong project này do mình sơ suất nên có một nhầm lần, do đó các bạn cần lưu ý sửa lại để có thể chạy được
Trong thủ tục xủ lý Button click

private void btnLoad_Click(object sender, EventArgs e)

Các bạn sửa câu SQL lại thành như sau

"Select * from DanhsachSV"

4. Đối tượng OleDbCommand
Đây là đối tượng vô cùng quan trọng có nhiệm vụ cho ứng dụng biết cần phải làm gì (thêm, sửa xóa) với Access Database. Nó gồm có các thuộc tính quan trọng sau:
- Connection : đối tượng Connect mà command sẽ sử dụng
- CommandType : phân loại nhiệm vụ mà Command sẽ thực thi, nó có 3 loại : Text, StoredProcedure, TableDirect.
- CommandText : nhiệm vụ mà command sẽ thực thi. CommandType và CommandText có liên hệ mật thiết với nhau
4a. Tìm hiểu CommandType và CommandText:
- CommandType.Text : lúc này CommandText sẽ là một câu lệnh SQL.
Ví dụ : "Select * From BangMau where STT=@STT and Name=@Name"
- CommandType.StoredProcedure : lúc này CommandText là tên của 1 query (trong Access) hay là 1 StoredProcedure (trong SQL Server).
- CommandType.TableDirect : lúc này CommandText là tên 1 Table.
4b. Xây dựng một đối tượng Command để truy xuất dữ liệu trong Database.
4b1. Command sử dụng câu lệnh SQL trực tiếp
1.  //Truy vấn dữ liệu
2.                  String varSelect = "Select * from BangMau";//Lệnh SQL
3.                  OleDbCommand objCommand = new OleDbCommand(varSelect, objConnect);

4b2. Command sử dụng lệnh SQL có truyền tham số
Đối với câu lệnh này bạn có thể sử dụng một trong 2 kiểu lệnh SQL sau

1.  //Đặt tên cho các tham số trong SQL
2.   objCommand.CommandText = "Select * From BangMau where STT=@STT and Name=@Name";
3.   //Sử dụng dấu ? cho các tham số SQL
4.   objCommand.CommandText = "Select * From BangMau where STT=? and Name=?";
5.   
Truyền tham số cho command cho cả 2 cách viết ở trên, nhưng lưu ý rằng vị trí của cac tham số được truyền vào phải đúng theo thứ tự trong câu lệnh SQL nghĩa là STT trước, sau đó mới tới Name.
objCommand.Parameters.Add("@STT", OleDbType.Integer).Value = 10;
objCommand.Parameters.Add("@Name", OleDbType.VarChar).Value = "Name10";
Ở đây các bạn chú ý OleDbType.Integer và OleDbType.VarChar, đây là các kiểu dữ liệu của các tham số này
4b3.Command gọi một Query được xây dựng sãn trong file Access
Ví dụ trong File access của bạn đã xây dựng sẵn một Query như sau
Tên : QuerySelect
SELECT *
FROM BangMau
WHERE STT>[@STT];
Bây giờ bạn muốn gọi nó ra

1.  OleDbCommand objCommand = new OleDbCommand();
2.          objCommand.Connection = objConnect;
3.        objCommand.CommandType = CommandType.StoredProcedure;
4.        objCommand.CommandText = "QuerySelect"; //Tên của Query
5.        //Truyền tham số
6.        objCommand.Parameters.Add("@STT", OleDbType.Integer).Value = 5;

5. Đọc dữ liệu trong File Access
Sau khi bạn đã tạo được một command hoàn chỉnh, các bạn có thể thực thi nó ngay bằng lệnh objCommand.ExecuteReader(), nó sẽ trả về một DataReader.
5a. Đọc dữ liệu thông qua DataReader
Nếu chỉ cần đọc dữ liệu thì ta nên sử dụng DataReader vì nó gọn nhẹ, nhanh, dễ sử dụng.
Ở đây mình ví dụ sử dụng command với SQL trực tiếp, các bạn hãy tự mình ap dụng các loại command còn lại hoặc tham khảo trong project

1.  ///





2.              /// Truy xuát dữ liệu thông qua câu lệnh trực tiếp và DataReader
3.              ///

4.              private void subSelectBySQLTructiepQuaDataReader()
5.              {
6.                  //Tạo kết nối tới file Access
7.                  subCreateConnect();
8.                  //Truy vấn dữ liệu
9.                  String varSelect = "Select * from BangMau";//Lệnh SQL
10.                OleDbCommand objCommand = new OleDbCommand(varSelect, objConnect);
11.                //Tạo DataReader nhận dữ liệu trả về
12.                OleDbDataReader objReader = objCommand.ExecuteReader();
13.                //Tạo đối tượng DataTable và Load DataReader vào
14.                objDataTable = new DataTable("abc");
15.                objDataTable.Load(objReader);
16.                //Gán dữ liệu vào Datagrid
17.                DGAccess.DataSource = objDataTable;
18.                subDestroyConnect();
19.            }
20. 

Ở đoạn code này các bạn chú ý tới dòng sau
objDataTable = new DataTable("abc");
DataTable là một đối tượng dại diện cho một bảng và nó cũng có dòng và cột. Câu lệnh trên có ý nghĩa là tạo ra một đối tượng objDataTable và đặt tên nó là “abc”.
5b. Đọc dữ liệu thông qua đối tượng DataAdapter
Đối tượng Adapter giống như một guồng máy vậy, nó có nhiệm vụ thực thi các command và trả về dữ liệu mà ta sẽ nhận được thông qua các đối tượng như DataTable hay DataSet. Ở đây chúng ta chỉ xét đến đối tượng DataTable
Ở đây sẽ sử dụng ví dụ Command có sử dụng Truyền tham số

1.  ///





2.              /// Truy xuất dữ liệu thông qua đối tượng Adapter, DataTable và Command
3.              ///

4.              private void subSelectByDataAdapter()
5.              {
6.                  //Tạo kết nối tới file Access
7.                  subCreateConnect();
8.                  //Tao Command
9.                  OleDbCommand objCommand = new OleDbCommand();
10.                objCommand.Connection = objConnect;
11.                objCommand.CommandType = CommandType.Text;
12.                objCommand.CommandText = "Select * From BangMau where STT>@STT";
13.                objCommand.Parameters.Add("@STT", OleDbType.Integer).Value = 0;
14.                //Tạo đối tượng Adapter
15.                OleDbDataAdapter objAdapter = new OleDbDataAdapter();
16.                objAdapter.SelectCommand = objCommand;//Nạp command cho DataAdapter
17.                //Tạo DataTable nhận dữ liệu trả về
18.                objDataTable = new DataTable("abc");
19.                objAdapter.Fill(objDataTable); //Điền dữ liệu trả về vào Table
20.                //Gán dữ liệu vào Datagrid
21.                DGAccess.DataSource = objDataTable;
22.                //Hủy các đối tượng
23.                objCommand.Dispose();
24.                objCommand = null;
25.                objDataTable.Dispose();
26.                objDataTable = null;
27.                objAdapter.Dispose();
28.                objAdapter = null;
29.                subDestroyConnect();
30.            }
31. 

Ở đây các bạn chú rằng ta sử dụng objAdapter.Fill(objDataTable); để fill giá trị nhận được từ selectcommand vào objDataTable.
5c. Viết code cho button Load Database


1.  private void btnLoad_Click(object sender, EventArgs e)
2.          {
3.              DGAccess.DataSource = null;
4.              subSelectByDataAdapter();
5.              subBindingData();
6.          }
7.   

6. DataBinding
Mình tạm dịch là cầu nối dữ liệu. Ví dụ sau đây là ta binding Datagrid với các textbox, nghĩa là khi ta click vào một dòng trên Datagrid thì dữ liệu trên dòng đó sẽ hiển thị lên các Textbox

1.  ///





2.              /// Binding dữ liệu với Textbox
3.              ///

4.              private void subBindingData()
5.              {
6.                  txtSTT.DataBindings.Add("Text", DGAccess.DataSource, "STT");
7.                  txtName.DataBindings.Add("Text", DGAccess.DataSource, "Name");
8.                  txtAddress.DataBindings.Add("Text", DGAccess.DataSource, "Address");
9.                  txtPhone.DataBindings.Add("Text", DGAccess.DataSource, "Phone");
10.                txtEmail.DataBindings.Add("Text", DGAccess.DataSource, "Email");
11.            }
12. 

Các bạn chú ý rằng “Text” ở đay nghĩa là ta sẽ lấy dữ liệu trong cột nào đó. Cụ thể là ta sẽ lấy dữ liệu ở các cột STT, Name, Address,Phone, Email và gán cho các Textbox tương ứng.
DGAccess.DataSource là dữ liệu nguồn mà ta có được khi sử dụng các phương thức đọc dữ liệu ở trên

7. Insert 1 Record vào trong dữ liệu gốc
Một câu lệnh SQL Insert có dạng như sau :
Insert Into BangMau Values(‘01’, ‘Nguyen Van A’, ‘Dia chi’, ‘So dien thoai’, ‘Dia chi Email’).
Có thể dùng dấu ngoặc kép “” thay thế cho ‘’.
Các dữ liệu được chèn vào phải theo đúng thứ tự cột trong file access
Điều ta cần làm bây giờ là truyền câu lệnh trên vào đối tượng command.
7a. Insert Command sử dụng SQL trực tiếp

1.  //Tạo đối tượng Command
2.                  OleDbCommand objCommand = new OleDbCommand();
3.                  objCommand.Connection = objConnect;
4.                  objCommand.CommandType = CommandType.Text;
5.                  objCommand.CommandText = "Insert into BangMau values(" +
6.                                          "'" + txtSTT.Text + "'" + "," +
7.                                          "'" + txtName.Text + "'" + "," +
8.                                          "'" + txtAddress.Text + "'" + "," +
9.                                          "'" + txtPhone.Text + "'" + "," +
10.                                        "'" + txtEmail.Text + "'" + ")";
11.                objCommand.ExecuteNonQuery();

Ở đây các bạn cần chú ý rằng khi ta đã có một command hoàn chỉnh thì ta sé dùng objCommand.ExecuteNonQuery() để thực thi command đó. ExecuteNonQuery() được sử dụng cho các command Insert, Update, Delete
7b. Insert Command sử dụng SQL có truyền tham số

1.  //Tạo đối tượng Command
2.                  OleDbCommand objCommand = new OleDbCommand();
3.                  objCommand.Connection = objConnect;
4.                  objCommand.CommandType = CommandType.Text;
5.                  objCommand.CommandText = "Insert into BangMau values(?,?,?,?,?)";
6.                  objCommand.Parameters.Add("@STT", OleDbType.Integer).Value = Convert.ToInt32(txtSTT.Text);
7.                  objCommand.Parameters.Add("@Name", OleDbType.VarChar).Value = txtName.Text;
8.                  objCommand.Parameters.Add("@Address", OleDbType.VarChar).Value = txtAddress.Text;
9.                  objCommand.Parameters.Add("@Phone", OleDbType.VarChar).Value = txtPhone.Text;
10.                objCommand.Parameters.Add("@Email", OleDbType.VarChar).Value = txtEmail.Text;
11.          objCommand.ExecuteNonQuery();

7c. Insert Command thông qua đối tượng DataAdapter và DataTable
Các bạn nên nhớ rằng sự thay đổi của DataTable không hề làm thay đổi của dữ liệu gốc.
Muốn làm thay đổi dữ liệu gốc ta phải viết các command Insert, Update, Delete rồi tới kết nối tới dữ liệu gốc đó, sau đó ta sẽ cập nhật sự thay đổi của DataTable lên dữ liệu gốc.

Ví dụ : Bây giờ nếu ta muốn Insert thêm một record vào dữ liệu gốc, ta phải thêm một record vào DataTable.

1.  //Tạo kết nối tới file Access
2.                  subCreateConnect();
3.                  //Nạp dữ liệu vào DataTable
4.                  objDataTable = new DataTable("Abc");
5.                  //Tạo đối tượng Adapter và Fill vào DataTable
6.                  OleDbDataAdapter objAdapter = new OleDbDataAdapter("select * from bangmau",objConnect) ;
7.                  objAdapter.Fill(objDataTable);
8.                  //Insert dữ liệu vào DataTable
9.                  DataRow objRow = objDataTable.NewRow();
10.                objRow["STT"] = Convert.ToInt32(txtSTT.Text);
11.                objRow["Name"] = txtName.Text;
12.                objRow["Address"] = txtAddress.Text;
13.                objRow["Phone"] = txtPhone.Text;
14.                objRow["Email"] = txtEmail.Text;
15.          objDataTable.Rows.Add(objRow);

Sau khi đã thêm được 1 dòng vào DataTable rồi, bây giờ ta viết câu lệnh Insert rồi connect với file Access để chèn Record này vào dữ liệu gốc, dữ liệu được truyền cho các tham số trong command này là lấy từ Record mới được chèn vào DataTable.

1.  //Tạo đối tượng Command
2.                  OleDbCommand objCommand = new OleDbCommand();
3.                  objCommand.Connection = objConnect;
4.                  objCommand.CommandType = CommandType.Text;
5.                  objCommand.CommandText = "Insert into BangMau values(@STT,@Name,@Address,@Phone,@Email)";
6.              //Truyền giá trị cho các tham số lấy từ các cột của  DataTable
7.                  objCommand.Parameters.Add("@STT", OleDbType.Integer, 20, "STT");
8.                  objCommand.Parameters.Add("@Name", OleDbType.VarChar,20,"Name");
9.                  objCommand.Parameters.Add("@Address", OleDbType.VarChar,20,"Address");
10.                objCommand.Parameters.Add("@Phone", OleDbType.VarChar,20,"Phone");
11.                objCommand.Parameters.Add("@Email", OleDbType.VarChar,20,"Email");

Sau khi tạo được đối tượng command Insert ta gán nó vào cho dataAdapter và gọi thủ tục Update để thi hành lệnh Insert

1.  //Insert dữ liệu vào nguồn
2.                  objAdapter.InsertCommand = objCommand;
3.                  objAdapter.Update(objDataTable);

7d. Viết code cho button Insert

1.  private void Insert_Click(object sender, EventArgs e)
2.          {
3.              subInsertByAdapter();
4.              btnLoad_Click(null, null);
5.          }

8. Update một Record trong Dữ liệu gốc
Câu lệnh SQL Update có cấu trúc như sau:
Update BangMau Set Name =’adfsdf’, Address=’dfdf’, Phone=’456464’, Email =’sdfsd@sdfs.com’ where STT=’01’
8a. Update Command sử dụng SQL trực tiếp

1.  //Tạo đối tượng command
2.                  OleDbCommand objCommand = new OleDbCommand();
3.                  objCommand.Connection = objConnect;
4.                  objCommand.CommandType = CommandType.Text;
5.                  objCommand.CommandText = "Update Bangmau Set " +
6.                                          "Name = " + "'" + txtName.Text + "'" + "," +
7.                                          "Address = " + "'" + txtAddress.Text + "'" + "," +
8.                                          "Phone = " + "'" + txtPhone.Text + "'" + "," +
9.                                          "Email = " + "'" + txtEmail.Text + "'" +
10.                                        "Where STT = " + Convert.ToInt32(txtSTT.Text);
11.               objCommand.ExecuteNonQuery();

8b.Update Command sử dụng SQL có truyền tham số

1.  //Tạo đối tượng command
2.                  OleDbCommand objCommand = new OleDbCommand();
3.                  objCommand.Connection = objConnect;
4.                  objCommand.CommandType = CommandType.Text;
5.                  objCommand.CommandText = "Update Bangmau " +
6.                                           "Set Name=@Name, Address=@Address, Phone=@Phone, Email=@Email " +
7.                                           "Where STT=@STT";
8.                  objCommand.Parameters.Add("@Name", OleDbType.VarChar).Value = txtName.Text;
9.                  objCommand.Parameters.Add("@Address", OleDbType.VarChar).Value = txtAddress.Text;
10.                objCommand.Parameters.Add("@Phone", OleDbType.VarChar).Value = txtPhone.Text;
11.                objCommand.Parameters.Add("@Email", OleDbType.VarChar).Value = txtEmail.Text;
12.                objCommand.Parameters.Add("@STT", OleDbType.Integer).Value = Convert.ToInt32(txtSTT.Text);
13.                objCommand.ExecuteNonQuery();

8c. Update dữ liệu thông qua DataAdapter
Như ta đã nói ở trên muốn làm thay đổi dữ liệu gốc thông qua đối tượng Adapter thì ta phải làm thay đổi dữ liệu trong đối tượng DataTable sau đó mối Update sự thay đổi này lên Dữ liệu gốc bằng Command Update.
Bây giờ muốn sửa đổi một record trong Datatable ta phải lọc được Record đó ra bằng Function Select của đối tượng DataTable.

//Tạo kết nối tới file Access
1.                      subCreateConnect();
2.                      //Nạp dữ liệu vào DataTable
3.                      objDataTable = new DataTable("Abc");
4.                      //Tạo đối tượng Adapter và Fill vào DataTable
5.                      OleDbDataAdapter objAdapter = new OleDbDataAdapter("select * from bangmau",objConnect) ;
6.                      objAdapter.Fill(objDataTable);
7.                      //Update dữ liệu vào DataTable                
8.                      //Chọn ra dòng cần chỉnh sửa dữ liệu
9.                      DataRow[] objRow =  objDataTable.Select("STT = " + Convert.ToInt32(txtSTT.Text)) ;
10.                    objRow[0]["Name"] = txtName.Text;
11.                    objRow[0]["Address"] = txtAddress.Text;
12.                    objRow[0]["Phone"] = txtPhone.Text;
13.                    objRow[0]["Email"] = txtEmail.Text;

Ở đoạn code trên chúng ta thấy rằng tham số truyền vào function Select cũng giống như trong SQL vậy, nó có dạng STT=’01’
objDataTable.Select("STT = " + Convert.ToInt32(txtSTT.Text))
Giá trị trả về của function Select là một Mảng DataRow. DataRow[] objRow
Nhưng ở đầu bài viết ta đã có nói STT ở đây là Primary key, do đó thì ta dùng điều kiện STT với Select thì giá trị trả về chỉ bao gồm một dòng duy nhất và đó là Dòng đâu tiên objRow[0] trong Mảng.
Sau khi đã chỉnh sửa dòng trên thì nhiệm vụ của ta chỉ là viết command Update, rồi Update sự thay đổi đó lên dữ liệu gốc thông qua Adapter


1.  //Tạo đối tượng Command
2.                      OleDbCommand objCommand = new OleDbCommand();
3.                      objCommand.Connection = objConnect;
4.                      objCommand.CommandType = CommandType.Text;
5.                      objCommand.CommandText = "Update Bangmau " +
6.                                               "Set Name=@Name, Address=@Address, Phone=@Phone, Email=@Email " +
7.                                               "Where STT=@STT";
8.                      objCommand.Parameters.Add("@Name", OleDbType.VarChar,20,"Name");
9.                      objCommand.Parameters.Add("@Address", OleDbType.VarChar,20,"Address");
10.                    objCommand.Parameters.Add("@Phone", OleDbType.VarChar,20,"Phone");
11.                    objCommand.Parameters.Add("@Email", OleDbType.VarChar,20,"Email");
12.                    objCommand.Parameters.Add("@STT", OleDbType.Integer, 20, "STT");
13.                    //Update dữ liệu nguồn
14.                    objAdapter.UpdateCommand = objCommand;
15.          objAdapter.Update(objDataTable);

8d. Viết code cho button Update


1.  private void btnUpdate_Click(object sender, EventArgs e)
2.          {
3.              subUpdateCommandHasParameter();
4.              btnLoad_Click(null, null);    
5.          }

9. Delete 1 Record trong Dữ liệu gốc
Câu lệnh SQL Delete có cấu trúc như sau và nó có lẽ lệnh đơn giản nhất
Delete From BangMau Where STT =1
Để xóa hết tất cả Dữ liệu trong bảng ta dùng SQL sau
Delete From BangMau
Bây giờ ta sẽ chuyển nó thanh đối tượng Command;
9a. Delete Command dùng SQL trực tiếp


1.  //Tạo command
2.                  OleDbCommand objcommand = new OleDbCommand();
3.                  objcommand.Connection=objConnect;
4.                  objcommand.CommandType = CommandType.Text;
5.                  objcommand.CommandText = "Delete From BangMau Where STT = " + Convert.ToInt32(txtSTT.Text)  ;
6.                  objcommand.ExecuteNonQuery();

9b. Delete Command dùng SQL có truyền tham số

1.  //Tạo command
2.                  OleDbCommand objcommand = new OleDbCommand();
3.                  objcommand.Connection = objConnect;
4.                  objcommand.CommandType = CommandType.Text;
5.                  objcommand.CommandText = "Delete From BangMau Where STT = ?";
6.                  objcommand.Parameters.Add("STT", OleDbType.Integer).Value = Convert.ToInt32(txtSTT.Text);
7.                  objcommand.ExecuteNonQuery();

9c. Delete thông qua DataAdapter
Cũng tương tự như Insert, Update ta phải lọc ra Record cần xóa trong DataTable và xóa nó. Sau đó update sự thay đổi đó lên dữ liệu gốc


1.  //Delete Record cần delete trong datatable
2.      //Lọc ra dòng cần xóa
3.                  DataRow[] objRow = objDataTable.Select("STT=" + Convert.ToInt32(txtSTT.Text));
4.                  objRow[0].Delete(); //Xóa dòng cần xóa
5.                  //Tạo command
6.                  OleDbCommand objcommand = new OleDbCommand();
7.                  objcommand.Connection = objConnect;
8.                  objcommand.CommandType = CommandType.Text;
9.                  objcommand.CommandText = "Delete From BangMau Where STT = @STT";
10.                objcommand.Parameters.Add("@STT", OleDbType.Integer,5,"STT");
11.                //Delete dữ liệu của nguồn
12.                objAdapter.DeleteCommand = objcommand;
13.          objAdapter.Update(objDataTable);

9d. Viết code cho button Delete

1.  private void btnDelete_Click(object sender, EventArgs e)
2.          {
3.              subDeleteCommandByAdapterCommandBuilder();
4.              btnLoad_Click(null, null);    
5.          }


10. Đối tượng DataAdapter và OleDbCommandBuilder
Từ đầu bài viết đến giờ các bạn có thấy rằng khi ta sử dụng đối tượng DataAdapter với DataTable thì việc viết các command thật là rắc rối, phức tạp và dễ sai không. Có lẽ BillGates cũng hiểu được điều này nên đã tạo ra lớp OleDBCommandBuilder để giúp ta xây dựng tự động các command Insert, Update, Delete.
Cách sử dụng OleDBCommandBuilder thì vô cùng đơn giản, OleDbCommandBuilder được sử dụng ngay sau lệnh Fill của DataAdapter. Và Nó sẽ tự động xây dùng các command Insert, Update, Delete cho ta.
10a. Insert

1.  //Tạo đối tượng Adapter và Fill vào DataTable
2.                  OleDbDataAdapter objAdapter = new OleDbDataAdapter("select * from bangmau", objConnect);
3.                  objAdapter.Fill(objDataTable);
4.                  //Tạo command cho Adapter
5.                  new OleDbCommandBuilder(objAdapter);
6.                  //Insert dữ liệu vào DataTable
7.                  DataRow objRow = objDataTable.NewRow();
8.                  objRow["STT"] = Convert.ToInt32(txtSTT.Text);
9.                  objRow["Name"] = txtName.Text;
10.                objRow["Address"] = txtAddress.Text;
11.                objRow["Phone"] = txtPhone.Text;
12.                objRow["Email"] = txtEmail.Text;
13.                objDataTable.Rows.Add(objRow);
14.                //Insert dữ liệu vào nguồn
15.                objAdapter.Update(objDataTable);

10b. Update


1.  //Tạo đối tượng Adapter và Fill vào DataTable
2.                  OleDbDataAdapter objAdapter = new OleDbDataAdapter("select * from bangmau", objConnect);
3.                  objAdapter.Fill(objDataTable);
4.                  //Xây dựng Command cho Adapter
5.                  new OleDbCommandBuilder(objAdapter);
6.                  //Update dữ liệu vào DataTable                
7.                  DataRow[] objRow = objDataTable.Select("STT = " + Convert.ToInt32(txtSTT.Text));
8.                  objRow[0]["Name"] = txtName.Text;
9.                  objRow[0]["Address"] = txtAddress.Text;
10.                objRow[0]["Phone"] = txtPhone.Text;
11.                objRow[0]["Email"] = txtEmail.Text;
12.                //Update dữ liệu nguồn
13.                objAdapter.Update(objDataTable);

10c. Delete

1.  //Tạo Adpater
2.                  OleDbDataAdapter objAdapter = new OleDbDataAdapter("select * from bangmau",objConnect);
3.                  objDataTable = new DataTable();
4.                  objAdapter.Fill(objDataTable);
5.                  //Xây dựng commandBuilder
6.                  new OleDbCommandBuilder(objAdapter);
7.                  //Delete Record cần delete trong datatable
8.                  DataRow[] objRow = objDataTable.Select("STT=" + Convert.ToInt32(txtSTT.Text));
9.                  objRow[0].Delete();
10.                //Delete dữ liệu nguồn
11.          objAdapter.Update(objDataTable);

Bạn thấy không đoạn code đã được đơn giản hóa đi rất nhiều. :D


3 nhận xét: