3.6.1. Chức năng
Có chức năng như một chiếc cầu nối giữa nguồn (tệp) dữliệu và các bảng được cached trong bộ nhớ (đối tượng DataSet.). DataAdapter sửdụng phương thức Fill()đểnhận dữliệu từnguồn dữliệu vào một dataset.
3.6.2. Khai báo đối tượng DataAdapter
Khai báo: SqlDataAdapter BiếnAdapter;
Sửdụng: BiếnAdapter.Fill(<Biến dataset>, “Tên cho bảng”); or BiếnAdapter.Fill(<Biến_DataTable>, “Tên cho bảng”);
3.6.3. Sửdụng đối tượng DataAdapter
3.6.3.1. Sửdụng đối tượng DataAdapter đểtruy vấn dữliệu
Chúng ta muốn lấy dữliệu bảng tbSinhVienở trên chúng ta có thểsửdụng đối tượng DataAdapter như bên dưới.
usingSystem.Data;
usingSystem.Data.SqlClient;
namespaceSampleDatabaseProgramming {
public partial classfrmADONET:Form
{
publicfrmADONET() {
InitializeComponent(); }
//Khai báo các chuỗi kết nối và các đối tượng SqlDataAdaptersqlAdap;
//Truy vấn dữliệu sửdụng đối tượng DataAdapter DataTableTruyVanDuLieu()
DataTabledt=newDataTable();
//
sqlAdap =newSqlDataAdapter("select * from tbSinhVien",@"Data Source=.\SQLEXPRESS;Initial Catalog=CSDL;Integrated Security=True");
sqlAdap.Fill(dt);
//
returndt; }
3.6.3.2. Sửdụng DataAdapter đểcập nhật (inserts, update…) dữliệu
usingSystem.Data;
usingSystem.Data.SqlClient;
namespaceSampleDatabaseProgramming {
public partial classfrmADONET:Form
{
//Khai báo đối tượng SqlDataAdaptersqlAdap;
//Cập nhật dữliệu với DataAdapter DataTableCapNhatDuLieu() {
DataTabledt=newDataTable();
//
sqlAdap =newSqlDataAdapter("Insert into tbSinhVien values('M02',N'Nguyễn Văn Quyết','TK2', '10/10/1988','Hưng Yên')",@"Data Source=.\SQLEXPRESS;Initial Catalog=CSDL;Integrated Security=True");
//
returndt; }
//Gọi phương thức cập nhật dữliệu
private voidfrmADONET_Load(objectsender,EventArgse) { CapNhatDuLieu(); } } } 3.7. Mô hình DataSet 3.7.1. Chức năng
Dataset là một lớpdùng để thao tác với dữ liệu theo mô hình dữ liệu phi kết nối. Nó được coi như là một kho chứa các bảng (table). Người dùng có thể thay đổi dữ liệu trong các bảng này và khi thực sự muốn cập nhật vào Cơ sở dữ liệu thì DataSet sẽthực hiện cập nhật thông qua lớp DataAdapter
Các bảng trong DataSet có thểdo DataAdapter Fill vào hoặc cũng có thểlà các bảng được tạo thành từlớp DataTable. 3.7.2. Khai báo
DataSet BienDataSet=new DataSet(); //Chú ý: Phải có New trước khi sửdụng biến DataSet 3.7.3. Mô hình DataSet
Mối quan hệgiữa DataAdapter và DataSet
Mô hình DataTabble
3.8. Đối tượng Parameter
3.8.1. Chức năng
Sửdụng đối tượng SqlParameter đểtruyền giá trị (lấy từtextbox, có sẵn…) vào cho các tham số ứng với câu lệnh SQL hay
thửthục nội tại (StoredProcedure).
Chú ý: Chỉ sửdụng đối tượng này nếu câu lệnh SQL hay StoredProcedure có tham số. 3.8.2. Sửdụng
Giảsửchúng ta có một StoredProcedure thêm mới một bản ghi vào bảng tbSinhVien có nội dung:
CREATE PROCEDURE ThemMoiBanGhi (
@MaSinhVien nchar(10), @TenSinhVien nvarchar(50), @Lop nchar(10),
@NgaySinh nchar(12), @QueQuan nvarchar(12) )
AS BEGIN
If exists (select MaSinhVien from tbSinhVien where MaSinhVien=@MaSinhVien) print 'Da co sinh vien nay'
else
begin
Insert into tbSinhVien values (@MaSinhVien, @TenSinhVien,@Lop,@NgaySinh,@QueQuan) print 'Da them thanh cong'
end END
GO
Chúng ta sửdụng đối tượng SqlParameternhư dưới:
usingSystem.Data;
usingSystem.Data.SqlClient;
namespaceSampleDatabaseProgramming {
public partial classfrmADONET:Form
{
publicfrmADONET() {
InitializeComponent(); }
//Khai báo các chuỗi kết nối và các đối tượng
SqlConnectionsqlCon;
SqlCommandsqlCom;
SqlParametersqlPa;
//Phương thức kết nối tới CSDL SQL Server private voidKetNoi()
{
sqlCon =newSqlConnection(strConnect);
if(sqlCon.State ==ConnectionState.Closed) {
sqlCon.Open(); }
}
//Phương thức đóng kết nối tới CSDL private voidNgatKetNoi()
{
if(sqlCon.State ==ConnectionState.Open) {
sqlCon.Close(); }
}
//Phương thức ThucThiởdạng tổng quát: cảcâu lệnh SQL và Stored Procedure //Thực thi nhiều lần và các Store hay câu lệnh SQL có tham số
//Khai báo đối tượng Parameter /// <summary>
///Phương thức thực thi câu lệnh SQL hay StoredProcedure /// </summary>
/// <param name="cmdType">Thực thi dạng câu lệnh SQL hay StoredProcedure</param> /// <param name="strName">Tên câu lệnh SQL hay tên StoredProcedure</param> /// <param name="MangTen">Tên các tham sốtruyền vào StoredProcedure</param>
/// <param name="MangGiaTri">Giá trịtruyền vào cho các biến trong StoredProcedure</param> /// <param name="MangType">Kiểu dữliệu của biến</param>
public voidThucThi(CommandTypecmdType,stringstrName,string[] MangTen,object[] MangGiaTri,DbType[] MangType) {
KetNoi();
//
sqlCom =newSqlCommand(); sqlCom.CommandType = cmdType; sqlCom.CommandText = strName; sqlCom.Connection = sqlCon;
//Khai báo và gán các đối tượng Parameter for(inti = 0; i < MangTen.Length; i++) {
sqlPa =newSqlParameter();
sqlPa.ParameterName = MangTen[i]; sqlPa.Value = MangGiaTri[i]; sqlPa.DbType = MangType[i]; sqlCom.Parameters.Add(sqlPa); } //Thực thi câu lệnh sqlCom.ExecuteNonQuery(); NgatKetNoi(); } //Gọi thực thi Stored
private voidfrmADONET_Load(objectsender,EventArgse) {
string[] MangTen = {"MaSinhVien","TenSinhVien","Lop","NgaySinh","QueQuan"};
string[] MangGT = {"M01","Nguyễn Văn A","TK6","10/10/1988","Hưng Yên"};
DbType[] MangType={DbType.String,DbType.String,DbType.String,DbType.String,DbType.String};
//ThucThi(CommandType.StoredProcedure, "ThemMoiBanGhi", MangTen, MangGT, MangType);
//End
}
}
3.9. Ràng buộc dữliệu với các điều khiển3.9.1. Mục đích 3.9.1. Mục đích
Gắn kết các điều khiển (Textbox…) vào các trường dữliệu trong CSDL
3.9.2. Sửdụng
Trong C#: đểgắn kết dữliệu với các điều khiển chúng ta thường sửdụng đối tượng BindingManagerBase (xem ví dụminh họa
đikèm)
3.10. Sửdụng DataView trong sắp xếp và tìm kiếm dữliệu3.11. LINQ 3.11. LINQ
CHƯƠNG 4: CRYSTAL REPORT
4.1. Thiết kếbáo cáo với Crystal Report
Bước 1: Tạo 1 Project Visual C#.NET bình thường
Bước 2: Để thiết kế Report bạn thêm vào dự án vừa tạo ở bước 1 một Item Report bằng cách:
▼
▼
Report được chia làm 5 khu vực (Section):
Section 1 (Report Header): Những thiết kế trên phần này chỉ
xuất hiện trên trang đầu tiên của báo cáo (Report) (nếu báo cáo có nhiều trang).
Section 2 (Page Header): Những thiết kếtrên phần này sẽ xuất hiện trên tất cảcác của báo cáo (nếu báo cáo có nhiều trang). Section 3 (Detail): Khu vực này hiển thịnội dung bảng CSDL. Section 4 (Report Footer) và Section 5(Page Footer) có ý nghĩa
tương tự như Section 1 và 2.
▼
Chú ý: Tùy thuộc CSDL là gì (SQL Server, Access, Excel…) mà chúng ta chọn Driver cho thích hợp (trong trường hợp này tôi chọn kết nối đến SQL Server)
▼
Chọn tên Server từ Combobox Server (ở đây tên server của tôi là: VIETHQTK1 hoặc bạn có thể gõ vào đó là localhost…). Sau đó bạn chọn CSDL mà muốn hiển thị ra Report ở Combobox Database (ở đây tôi chọn
CSDL Northwind)
Chọn các bảng dữ liệu cần hiển thị dữ liệu ra Report bên khung bên trái
sau đó nhấn nút >. Khi đó danh sách các bảng bạn chọn sẽ hiển thị ra bên tay phải bạn (ở đây tôi muốn hiển thịbảng CSDL Customers).
Bước 4: Thiết kếReport
Đế thiết kế reports Visual Studio cung cấp một số điều khiển (trong hộp thoại Toolbox), các điều khiển này cũng có các thuộc tính như trong các ứng dụng Window Form.Ở đây ta chú ý đến 2 điều khiển
- Text Object: Hiển thi chuỗi Text (như một Label)
- Line Object: Dùng kẻ các đường thẳng.
Trước hết chúng ta thiết kế cho 2 phần Section 1 (Report Header)
(thường hiển thịCỘNG HÒA XÃ HỘI CHỦNGHĨA……..)và Section 2 (Page Header) (thường hiển thị tiêu đề báo cáo). Ở đây: 2 phần này tôi dùng điều khiển Text Objectđểthiết kế.
Tiếp đến chúng ta thiết kế để dữ liệu từ CSDL hiển thị ra Report. Chúng
ta làm theo các bước sau:
Bạn kéo lần lượt các trường trong bảng CSDL Customers ở trong khung Field Explorer bên tay trái vào khu vực Section 3 (Details) ta sẽ được như hình
Để xem các kết quả thiết kế của bạn bạn có thể chọn Tab Main Report
→ Quá trình thiết kếReport hoàn tất bây giờ đến bước hiển thịReport ra Form
4.2. Nạp và hiển thị Report trong chương trình
Bước 5: Hiển thịReport ra form
Đểhiến thịReport nên Form, VS hỗtrợ điều khiển CystalReportViewr trong Tab Reporting.
Bạn hãy kéođiều khiển đó vào form sau đó đặt thuộc tính ReportSource
cho điều khiển đó là Reports chúng ta vừa thiết kế → Giờthì bạn hãy chạy form và xem kết quảxem nào!
4.3. Thiết kế Report động4.3.1. Mục đích 4.3.1. Mục đích
Truyền dữ liệu từ form (dữ liệu được nhập vào từ textbox, dữ liệu từ
biến…) sang report nhằm thiết kế các report động. 4.3.2. Sửdụng
Yêu cầu: Truyền dữ liệu từ textbox có tên txtTenSinhVien (txtTenSinhVien nằm trên form frmDynamicReport) sang một report có tên reDynamicReport.
Cách làm:
Bước 1: Thiết kế report có nội dung như sau (hoàn toàn tương tự như bước 4ởtrên).
Trên Report có một TextObject có tên txtTenSinhvien dùng để đón nhận kết quảtruyền từform sang.
Bước 2: Thiết kế form có giao diện như sau (frmDynamicReport).
frmDynamicReport được chia làm hai phần sửdụng SplitContainer.
Phần thứ nhất (Panel 1) chứa một textbox có tên txtTenSinhVien để
truyền dữliệu sang TextObject (txtTenSinhVien) trên Report. Button
Phần thứ 2 (Panel 2) chứa điều khiển crystalReportViewer1để hiển thịreport thiết kế ở bước 1.
Bước 3: Truyền dữliệu từTextbox sang Report
usingCrystalDecisions.CrystalReports; usingCrystalDecisions.CrystalReports.Engine;
usingCrystalDecisions.CrystalReports.Engine.Migration; namespaceCrystalReport2008
{
public partial classfrmDynamicReport:Form
{
private voidbtOK_Click(objectsender,EventArgse) {
crDynamicReportrpt =newcrDynamicReport();
//Truyền dữliệu ((TextObject)rpt.ReportDefinition.ReportObjects["txtTenSinhVien"]).Text = txtTenSinhVien.Text; //Refresh data crystalReportViewer1.ReportSource = rpt; crystalReportViewer1.RefreshReport(); } } }