• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

[C#] Access Database với C#.

Các bài viết hướng dẫn về Visual Basic .NET và C#

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

[C#] Access Database với C#.

Gửi bàigửi bởi anhtuyenbk » T.Tư 26/03/2008 8:32 pm

Tên bài viết: Xử lý Access Database với C#. Tại sao không?
Tác giả: Nguyễn Anh Tuyên
Cấp độ bài viết: Nâng cao
Tóm tắt: Hướng dẫn thao tác C# với Access


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.
Bài viết này là quá trình tích lũy những kinh nghiệm trong 3 tuần học hỏi của mình nên không thể tránh khỏi sai sót, nếu các bạn thấy chỗ nào sai sót cứ việc góp ý mình sẽ chỉnh lại. :D :D

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

Hình ả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

Mã: Chọn hết

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

Mã: Chọn hết

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"            /// <summary>            /// Tạo một Connection            /// </summary>            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            }            /// <summary>            /// Hủy kết nối            /// </summary>            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>. :))
Database Access Project.rar
Project mẫu đề tham khảo
(63.46 KiB) Đã tải 13087 lần

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

Mã: Chọn hết

private void btnLoad_Click(object sender, EventArgs e)

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

Mã: Chọn hết

"Select * from DanhsachSV"
Sửa lần cuối bởi anhtuyenbk vào ngày T.Ba 13/10/2009 6:39 pm với 8 lần sửa.


Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

Re: [C#] - HOT - Xử lý Access Database với C#. Tại sao không??

Gửi bàigửi bởi anhtuyenbk » T.Tư 26/03/2008 8:32 pm

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

Mã: Chọn hết

  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

Mã: Chọn hết

  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

Mã: Chọn hết

  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

Mã: Chọn hết

  1. /// <summary>
  2.             /// Truy xuát dữ liệu thông qua câu lệnh trực tiếp và DataReader
  3.             /// </summary>
  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ố

Mã: Chọn hết

  1. /// <summary>
  2.             /// Truy xuất dữ liệu thông qua đối tượng Adapter, DataTable và Command
  3.             /// </summary>
  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

Mã: Chọn hết

  1. private void btnLoad_Click(object sender, EventArgs e)
  2.         {
  3.             DGAccess.DataSource = null;
  4.             subSelectByDataAdapter();
  5.             subBindingData();
  6.         }
  7.  
Sửa lần cuối bởi anhtuyenbk vào ngày T.Tư 26/03/2008 8:50 pm với 1 lần sửa.
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

Re: [C#] - HOT - Xử lý Access Database với C#. Tại sao không??

Gửi bàigửi bởi anhtuyenbk » T.Năm 27/03/2008 9:44 am

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

Mã: Chọn hết

  1. /// <summary>
  2.             /// Binding dữ liệu với Textbox
  3.             /// </summary>
  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

Mã: Chọn hết

  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ố

Mã: Chọn hết

  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.

Mã: Chọn hết

  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.

Mã: Chọn hết

  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

Mã: Chọn hết

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

7d. Viết code cho button Insert

Mã: Chọn hết

  1. private void Insert_Click(object sender, EventArgs e)
  2.         {
  3.             subInsertByAdapter();
  4.             btnLoad_Click(null, null);
  5.         }
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

Re: [C#] - HOT - Xử lý Access Database với C#. Tại sao không??

Gửi bàigửi bởi anhtuyenbk » T.Năm 27/03/2008 9:48 am

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

Mã: Chọn hết

  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ố

Mã: Chọn hết

  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.

Mã: Chọn hết

  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.                     //Update dữ liệu vào DataTable                
  9.                     //Chọn ra dòng cần chỉnh sửa dữ liệu
  10.                     DataRow[] objRow =  objDataTable.Select("STT = " + Convert.ToInt32(txtSTT.Text)) ;
  11.                     objRow[0]["Name"] = txtName.Text;
  12.                     objRow[0]["Address"] = txtAddress.Text;
  13.                     objRow[0]["Phone"] = txtPhone.Text;
  14.                     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

Mã: Chọn hết

  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

Mã: Chọn hết

  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

Mã: Chọn hết

  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ố

Mã: Chọn hết

  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

Mã: Chọn hết

  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

Mã: Chọn hết

  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

Mã: Chọn hết

  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

Mã: Chọn hết

  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

Mã: Chọn hết

  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
Bài viết của mình đến đây xem là hết. Hy vọng nó giúp được nhiều cho các bạn. :) :)

Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

danvac
Thành viên chính thức
Thành viên chính thức
Bài viết: 13
Ngày tham gia: T.Sáu 28/03/2008 10:48 am
Has thanked: 1 time
Been thanked: 3 time
Liên hệ:

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

Gửi bàigửi bởi danvac » T.Bảy 05/04/2008 10:25 pm

bài viết rất hay phù hợp với newbie bọn mình nếu bạn có bài xử dụng c# và CSDL sql Server thì hay biết mấy mình đang cần học
^_^
Home
www.truongton.110mb.com

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

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

Gửi bàigửi bởi anhtuyenbk » T.Bảy 05/04/2008 10:38 pm

Không khác nhiều lắm đâu, chỉ khác phần kết nối là chính còn mấy cái khác thì hao hao.
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

quachnguyen
Thành viên danh dự
Thành viên danh dự
Bài viết: 18
Ngày tham gia: T.Sáu 30/03/2007 7:04 pm
Đến từ: http://vi-vn.com
Liên hệ:

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

Gửi bàigửi bởi quachnguyen » CN 06/04/2008 12:53 pm

Access, SQL Server, Oracle là hệ quản trị cơ sở dử liệu, không phải là cơ sở dử liệu.

Relational database management system (RDBMS).
http://code2code.info/

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

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

Gửi bàigửi bởi anhtuyenbk » CN 06/04/2008 3:53 pm

Bắt bẻ ghê quá, cái đó thì mình biết nhưng lười đánh máy. :) :)
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

Hình đại diện của người dùng
darkan
Thành viên chính thức
Thành viên chính thức
Bài viết: 32
Ngày tham gia: T.Hai 21/04/2008 6:46 pm

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

Gửi bàigửi bởi darkan » T.Hai 21/04/2008 11:38 pm

Hệ quản trị cơ sở dữ liệu là DBMS hok có phải RDBMS :P
RDBMS là hệ quản trị cơ sở dữ liệu quan hệ,có một số DBMS hok có phải là RDBMS như FOCUS hay TurboImage.
Các DBMS ko phải là RBDMS thường được sử dụng với mục đích riêng nên ko có phổ biến được như RDBMS :D.

akai9871
Bài viết: 1
Ngày tham gia: T.Bảy 10/05/2008 12:46 am

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

Gửi bàigửi bởi akai9871 » T.Bảy 10/05/2008 12:48 am

Ban Tuyen co the cho minh cai dia chi YM dc ko ? MInh can biet lam ket Access gap lam ? YM minh la Only_love_love2003@yahoo.com

Hình đại diện của người dùng
lopcan
Bài viết: 4
Ngày tham gia: T.Năm 27/03/2008 2:12 pm

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

Gửi bàigửi bởi lopcan » T.Bảy 17/05/2008 9:12 am

em down file đính kèm về thì ko thấy có file CSDL bác ạ

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

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

Gửi bàigửi bởi anhtuyenbk » T.Bảy 17/05/2008 9:13 am

Bạn tìm trong thư mục debug xem.
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

phandung
Bài viết: 5
Ngày tham gia: T.Năm 05/06/2008 11:19 am

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

Gửi bàigửi bởi phandung » T.Năm 05/06/2008 1:39 pm

Anh oi!
A CO THE COPY DUM EM NGUYEN BAI NAY DUOC KHONG?
E CHEP SOURCE MA NO BAO LOI QUA TROI.
A giup em voi, e can lam.
DIA CHI EMAIL CUA EM: phandung0212@yahoo.com

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

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

Gửi bàigửi bởi anhtuyenbk » T.Năm 05/06/2008 3:03 pm

phandung đã viết:Anh oi!
A CO THE COPY DUM EM NGUYEN BAI NAY DUOC KHONG?
E CHEP SOURCE MA NO BAO LOI QUA TROI.
A giup em voi, e can lam.
DIA CHI EMAIL CUA EM: phandung0212@yahoo.com

1. Bạn viết bài ko có dấu.
2. Sourcecode đã có trong bài rồi, bạn kiếm kỹ lại xem.
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

phandung
Bài viết: 5
Ngày tham gia: T.Năm 05/06/2008 11:19 am

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

Gửi bàigửi bởi phandung » T.Sáu 06/06/2008 11:02 am

Nhưng làm giống như trong bài nhưng nó báo lỗi ở : partial
Trong các cách thì mình chỉ chọn 1 cách là được phải không?Như là các cách: select dữ liệu, binding dữ liệu ...
Em có gửi file đính kèm, anh xem và sửa giùm em.
Em cảm ơn nhiều ạ.
Tập tin đính kèm
WindowsApplication2.rar
(52.26 KiB) Đã tải 1310 lần

phandung
Bài viết: 5
Ngày tham gia: T.Năm 05/06/2008 11:19 am

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

Gửi bàigửi bởi phandung » T.Tư 25/06/2008 10:51 am

sao không ai giúp em vay trời.
Mấy anh làm ơn sửa giúp em lỗi đó với.

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

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

Gửi bàigửi bởi anhtuyenbk » T.Tư 25/06/2008 11:14 am

phandung đã viết:sao không ai giúp em vay trời.
Mấy anh làm ơn sửa giúp em lỗi đó với.

Giờ mình bận lắm, bạn tải cái project mấu ở bài viết đầu tiên vê mà xem.
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

phandung
Bài viết: 5
Ngày tham gia: T.Năm 05/06/2008 11:19 am

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

Gửi bàigửi bởi phandung » T.Tư 25/06/2008 3:11 pm

Nhưng project mẫu anh viết trên visual.net 2005 ha?
vì em cài visual.net 2003 thì mở file nó báo lỗi version cũ.
Anh ơi!
A co chương trình nào viết về lương hoặc chấm công viết bằng c# không?
em cảm ơn anh.
Chuc anh thành công trong công việc

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

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

Gửi bàigửi bởi anhtuyenbk » T.Tư 25/06/2008 3:17 pm

Cái này viết bằng C#2005.
Project bạn hòi mình ko có nhưng trong box Mã nguồn cũng có vài project C# bạn vào thử xem.
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

Hình đại diện của người dùng
manhtung
Thành viên tích cực
Thành viên tích cực
Bài viết: 109
Ngày tham gia: T.Bảy 12/04/2008 2:16 pm
Đến từ: huế
Liên hệ:

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

Gửi bàigửi bởi manhtung » T.Bảy 02/08/2008 10:37 am

đây có phải là viết theo dll không bạn
More Simple More Good -- cÀNG đƠN gIẢN cÀNG tỐT


Quay về “[.NET] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.2 khách