Lỗi khi hiển thị dữ liệu trong visual 2008

Lập trình Cơ sở dữ liệu là một phần rất quan trọng trong lập trình ứng dụng, nó là trung gian kết nối giữa người sử dụng với cơ sở dữ liệu. Với công nghệ ADO.NET chúng ta có một chuẩn thống nhất để lập trình thao tác với các nguồn cơ sở dữ liệu khác nhau như Access, MySQL, SQL Server, Oracle… cũng như lập trình ứng dụng với dạng WinForm và WebForm. Trong bài này chúng ta sẽ đi vào một bài tập cụ thể để tìm hiểu các đối tượng quan trọng trong ADO.NET để lập trình với CSDL như: Connection, Command, DataReader, DataAdapter, DataSet để kết nối đến hệ quản trị CSDL SQL Server.


Nội dung

Nội dung


Yêu cầu bài toán

Lập trình quản lý cơ sở dữ liệu QLBanHang có các bảng:

tblMatHang( MaSP nchar(5), TenSP nvarchar(30), NgaySX Date, NgayHH Date, DonVi nvarchar(10), DonGia float , GhiChu nvarchar(200))

tblNhaCC(MaNhaCC nchar(5), TenNhaCC nvarchar(50), DiaChi nvarchar(200), MaSoThue nvarchar(15), TaiKhoan nvarchar(15), DienThoai nvarchar(11))

tblHangNhap(MaSP nchar(5), MaNhaCC nchar(5), SoLuong int, DonGia float, SoHD nvarchar(10), NgayGH Date)

Hãy xây dựng giao diện và các chức năng Thêm mới, Sửa, Xoá, Tìm kiếm của các bảng trên tương tự như sau. \>Xem hướng dẫn tạo Database trong VisualStudio


Tổng quan Các đối tượng trong ADO.NET

1. Các .Net Data Provider trong ADO.Net

Sử dụng NameSpace System.Data để lập trình với ADO.NET Các .Net Data Provider được sử dụng để kết nối tới cơ sở dữ liệu, thực thi các câu lệnh truy vấn (SQL) và lấy dữ liệu. Dữ liệu trả về có thể được xử lý trực tiếp, đặt trong đối tượng DataSet, được kết hợp với dữ liệu từ nhiều nguồn hoặc gửi dữ liệu giữa các tầng (tiers) trong mô hình lập trình nhiều tầng (N-Tier). Trong .Net Framework có các .Net Data Provider mặc định sau:

  • .NET Data Provider cho SQL Server: sử dụng namespace System.Data.SqlClient
  • .NET Data Provider cho OLE DB: sử dụng namespace System.Data.OleDb
  • .NET Data Provider cho ODBC: sử dụng namespace System.Data.Odbc
  • .NET Data Provider cho Oracle: sử dụng namespace System.Data.OracleClient
  • EntityClient Provider: cung cấp truy cập dữ liệu cho các ứng dụng dạng Entity Data Model (EDM), sử dụng namespace System.Data.EntityClient
  • .NET Data Provider cho SQL Server Compact 4.0: cung cấp truy cập dữ liệu cho Microsoft SQL Server Compact 4.0, sử dụng namespace System.Data.SqlServerCe

2. Các đối tượng trong .Net Data Provider

  • Connection: thiết lập kết nối tới nguồn dữ liệu
  • Command: thực thi các câu lệnh truy vấn với nguồn dữ liệu từ một Connection
  • DataReader: cung cấp một luồng (stream) dữ liệu chỉ đọc từ nguồn dữ liệu
  • DataAdapter: đặt dữ liệu vào DataSet và cập nhật dữ liệu từ DataSet về nguồn dữ liệu

3. Các phương thức và thuộc tính quan trọng

a. Connection
  • Thuộc tính ConnectionString: truyền vào chuỗi kết nối tới nguồn dữ liệu
  • Phương thức Open: mở kết nối
  • Phương thức Close: đóng kết nối
b. Command
  • Thuộc tính CommandText: truyền vào câu lệnh SQL hoặc tên Stored procedure
  • Thuộc tính CommandType: kiểu câu lệnh SQL là StoredProcedure, TableDirect hay Text
  • Thuộc tính Connection: truyền vào đối tượng Connection
  • Phương thức ExecuteReader: thực thi với câu lệnh SQL Select và trả về luồng dữ liệu qua đối tượng DataReader
  • Phương thức ExecuteScalar: thực thi câu lệnh SQL Select và trả về một giá trị ở hàng đầu tiên và cột đầu tiên. Thích hợp với câu lệnh Select dạng thống kê như Count, Sum, AVG …
  • Phương thức ExecuteNonQuery: thực thi câu lệnh SQL như Insert, Update, Delete … và không trả về kết quả
  • Phương thức ExecuteXMLReader: thực thi câu lệnh truy vấn với các câu lệnh cho XML
c. DataReader
  • Phương thức Read: đọc các hàng dữ liệu
d. DataAdapter
  • Phương thức Fill: đổ dữ liệu từ nguồn dữ liệu vào DataSet
  • Phương thức Update: cập nhật dữ liệu từ DataSet tới nguồn dữ liệu

Lỗi khi hiển thị dữ liệu trong visual 2008

Cách thực thi đối tượng DataAdapter


Thực hiện câu lệnh Select, hiển thị dữ liệu lên DataGrid

\>>Xem hướng dẫn phần thiết kế giao diện

Để lập trình với CSDL, bạn cần biết các câu lệnh cơ bản để thao tác với CSDL như SELECT, INSERT, UPDATE, DELETE. Phần này chúng ta sẽ lập trình để hiển thị dữ liệu lên DataGridView

Cú pháp câu lệnh Select

SELECT danh_sách_các_cột FROM tên_bảng WHERE danh_sách_các_điều_kiện

Các bước

Bước 1:Khai báo .Net Data Provider cho SQL Server

using System.Data.SqlClient; Bước 2: Tạo đối tượng Connection, khởi gán chuỗi kết nối, mở kết nối

//Tạo đối tượng Connection SqlConnection con = new SqlConnection(); //Truyền vào chuỗi kết nối tới cơ sở dữ liệu //Sử dụng Application.StartupPath để lấy đường dẫn tới thư mục chứa file chạy chương trình con.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath + @"\QLBanHang.mdf;Integrated Security=True;User Instance=True"; con.Open(); // mở kết nối Bước 3: Khai báo đối tượng DataAdapter để Fill dữ liệu vào DataSet

//Lấy toàn bộ dữ liệu từ bảng tblMatHang String sql = "Select * from tblMatHang"; //tạo đối tượng DataSet DataSet ds = new DataSet(); //Khởi tạo đối tượng DataAdapter và cung cấp vào câu lệnh SQL và đối tượng Connection SqlDataAdapter dap = new SqlDataAdapter(sql,con); //Dùng phương thức Fill của DataAdapter để đổ dữ liệu từ DataSource tới DataSet dap.Fill(ds); Bước 4: Gắn dữ liệu lên DataGrid

//Gắn dữ liệu từ DataSet lên DataGridView dgvKetQua.DataSource = ds.Tables[0]; dgvKetQua.Refresh(); \>>Xem hướng dẫn phần hiển thị dữ liệu lên DataGridView


Thực hiện các câu lệnh Insert, Update, Delete dữ liệu

Cú pháp câu lệnh Insert

INSERT INTO tên_bảng(danh_sách_các_cột) VALUES (danh_sách_các_giá_trị)

Các bước

Bước 1: Khởi tạo đối tượng Connection giống Bước 2: Khởi tạo đối tượng Command và thực thi câu lệnh Insert

//Tạo câu lệnh truy vấn Insert lấy dữ liệu từ các Control trên Form thiết kế sql = "INSERT INTO tblMatHang(MaSP,TenSP,NgaySX,NgayHH,DonVi,DonGia,GhiChu)VALUES ("; sql += "N'" + txtMaSP.Text + "',N'" + txtTenSP.Text + "','" + dtpNgaySX.Value.Date + "','" + dtpNgayHH.Value.Date + "',N'" + txtDonVi.Text + "',N'" + txtDonGia.Text + "',N'" + txtGhiChu.Text + "')"; //Thực thi câu lệnh SQL sử dụng đối tượng Command SqlCommand cmd = new SqlCommand(sql, con); cmd.ExecuteNonQuery(); Muốn lưu được dữ liệu tiếng việt cần thêm ký tự N đặt trước dữ liệu, giống như câu lệnh truy vấn ở trên

Cú pháp câu lệnh Update

UPDATE tên_bảng SET

tên_cột_1 = giá_trị_1,  
tên_cột_2 = giá_trị_2,  
...,  
tên_cột_n = giá_trị_n  
[WHERE điều_kiện];

Các bước

thực hiện tương tự như , chỉ khác câu lệnh SQL Update.

Cú pháp câu lệnh Delete

DELETE FROM tên_bảng [WHERE điều_kiện];

Các bước

thực hiện tương tự như , chỉ khác câu lệnh SQL Delete.


Sử dụng các Stored Procedure

Thay vì viết câu lệnh SQL trực tiếp trong Code chương trình, chúng ta có thể khai thác các Stored Procedure để tái sử dụng và tăng hiệu năng sử dụng Stored Procedure. Xem thêm bài về .

Các bước

Bước 1: Tạo Stored Procedure trong SQL Server, giả sử đặt tên là InsertMatHang

CREATE PROCEDURE InsertMatHang @MaSP nachr(5), @TenSP nvarchar(30), @NgaySX Date,

    @NgaySX Date,  
    @DonVi nvarchar(10),  
    @DonGia float,  
@GhiChu nvarchar(200) AS INSERT INTO tblMatHang(MaSP,TenSP,NgaySX,NgayHH,DonVi,DonGia,GhiChu) VALUES(@MaSP,@TenSP,@NgaySX,@NgayHH,@DonVi,@DonGia,@GhiChu) Bước 2: Viết code C# thực thi Stored Procedure

using System.Data.SqlClient; 0


Lưu thông tin cấu hình trong file config

Như phần trên bạn thấy khi khởi tạo chuỗi kết nối cho đối tượng Connection chúng ta đang đặt code cứng (hard code), sẽ không mềm dẻo khi bạn đi triển khai ứng dụng cho khách hàng. Bạn có thể lưu trữ chuỗi kết nối trong file config của ứng dụng (file có tên app.config, một dạng file xml lưu trữ toàn bộ cấu hình ứng dụng). Khi đi triển khai ứng dung, chúng ta chỉ cần mở file app.config là có thể cấu hình cho ứng dụng mà không cần phải biên dịch lại code.