CHƯƠNG 1: KIẾN TRÚC CỦA .NET
1.1. Môi trường thực thi ngôn ngữ chung – CLR
Như đã đề cập thì CLR thực hiện quản lý bộ nhớ, quản lý thực thi tiểu
trình, thực thi mã nguồn, xác nhận mã nguồn an toàn, biên bịch và các dịch vụ
hệ thống khác. Những đặc tính trên là nền tảng cơ bản cho những mã nguồn
được quản lý chạy trên CLR.
Do chú trọng đến bảo mật, những thành phần được quản lý được
cấp những mức độ quyền hạn khác nhau, phụ thuộc vào nhiều yếu tố nguyên
thủy của chúng như: liên quan đến Internet, hệ thống mạng trong nhà máy, hay
một máy tính cục bộ. Điều này có nghĩa rằng, một thành phần được quản lý có
thể có hay không có quyền thực hiện một thao tác truy cập tập tin, thao tác truy
cập registry, hay các chức năng nhạy cảm khác
125 trang |
Chia sẻ: phuongt97 | Lượt xem: 473 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Bài tập Lập trình Windows, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
le SinhVien.xml ở trên và hiển thị thông
tin (tên, năm sinh) của từng sinh viên (MessageBox). Ở đây chúng ta sử dụng
đối tượng XmlTextReader. Việc sử dụng đối tượng XmlReader là hoàn toàn
tương tự.
Project 2
- 82 -
string strSinhVien = "";
string strTenNode = "";
//
XmlTextReader read = new XmlTextReader("SinhVien.xml");
//
while (read.Read())
{
switch (read.NodeType)
{
case XmlNodeType.Element:
strTenNode = read.Name;
break;
case XmlNodeType.Text:
switch (strTenNode)
{
case "Ten":
strSinhVien += read.Value;
strSinhVien += ",";//Hai thông tin ngăn cách nhau bởi dấu ,
break;
case "NamSinh":
strSinhVien += read.Value;
MessageBox.Show(strSinhVien);//In từng bản ghi
strSinhVien = "";
break;
}
break;
}
}
Khi chạy đoạn code này (qua sự kiện click của node button) thì sẽ hiển thị ra hai MessageBox
Project 2
- 83 -
2.7. Thao tác với Registry
2.7.1. Giới thiệu về Registry
Registry là một cơ sở dữ liệu dùng để lưu trữ thông số kỹ thuật của
Windows. Nó ghi nhận tất cả các thông tin khi bạn thay đổi, chỉnh sửa trong
Menu Settings, Control Panel....
Trong Win95 & 98, Registry được ghi trong 2 file: user.dat và system.dat
trong thư mục Windows. Trong Windows Me, Registry được lưu trong file
Classes.dat trong thư mục Windows. Trong Win2K Registry được lưu trong thư
mục "Windows\System32\Config".
Registry có thể chỉnh sửa trực tiếp, làm thay đổi các thông số thông qua
trình chỉnh sữa Registry Editor. Chạy Registry Editor bằng cách gõ regedit vào
cửa sổ Run (Start run regedit)
Registry lưu tất cả các thông tin về phần cứng, phần mềm, những lựa chọn
của người dùng....kiểm soát được nội dung của Registry là yêu cầu tất yếu để
bạn sử dụng PC một cách khoa học, hiểu sâu hơn về môi trường làm vịệc của
Windows.
Muốn tiến xa hơn trong kỹ thuật lập trình trên nền Windows, cách bảo
mật, cracking, hacking bạn cần phải có hiểu biết nhất định về Registry.
2.7.2. Cấu trúc Registry của Windows
Project 2
- 84 -
Registry có cấu trúc cây, giống cấu trúc thư mục. Thông thường có sáu
nhánh chính. Mỗi nhánh được giao hiệm vụ lưu giữ những thông tin riêng biệt.
Trong các nhánh chính có rất nhiều nhánh con. Những nhánh con này cũng được
lưu giữ nhưng thông tin riêng biệt.
HKEY_CLASSES_ROOT: Lưu những thông tin dùng chung cho
toàn bộ hệ thống.
HKEY_CURRENT_USER: Lưu những thông tin cho người dùng
đang Logon
HKEY_LOCAL_MACHINE: Lưu những thông tin về hệ thống, phần
cứng, phần mềm.
HKEY_USERS: Lưu những thông tin của tất cả các User, mỗi user là
một nhánh với tên là số ID của user đó
HKEY_CURRENT_CONFIG: Lưu thông tin về phần cứng hiện tại
đang dùng.
HKEY_DYN_DATA: Đây cũng là một phần của nhánh
HKEY_LOCAL_MACHINE
Registry sử dụng một số kiểu dữ liệu sau:
REG_BINARY: Kiểu nhị phân
REG_DWORD: Kiểu Double Word
REG_EXPAND_SZ: Kiểu chuỗi mở rộng đặc biệt. VD:
"%SystemRoot%"
REG_MULTI_SZ: Kiểu chuỗi đặc biệt
REG_SZ: Kiểu chuỗi chuẩn
2.7.3. Thao tác với Registry trong C#
Trong C# để thao tác với registry: đọc, ghi thì chúng ta sử dụng đối tượng
RegistryKey (phải khai bó namespace using Microsoft.Win32 trước khi sử dụng
đối tượng này)
Project 2
- 85 -
Minh họa cho việc thao tác với registry ở đây chúng ta có 3 ví dụ:
2.7.3.1. Tạo Key
//Khai báo Key và Set thuộc tính
const string Path = @"Software\Microsoft\Windows\CurrentVersion\Run";
RegistryKey key = Registry.CurrentUser.OpenSubKey(Path,true);
key.SetValue("UTEHY", Application.ExecutablePath);
2.7.3.2. Lấy giá trị một key
const string Path = @"Software\Microsoft\Windows\CurrentVersion\Run";
RegistryKey key = Registry.CurrentUser.OpenSubKey(Path, true);
string s = (string)key.GetValue("UTEHY ");
MessageBox.Show(s);//UTEHY được tạo ở mục 1.7.3.1
2.7.3.3. Xóa một Key
const string Path = @"Software\Microsoft\Windows\CurrentVersion\Run";
RegistryKey key = Registry.CurrentUser.OpenSubKey(Path,true);
key.DeleteValue("UTEHY"); //UTEHY được tạp ở mục 1.7.3.1
Project 2
- 86 -
CHƯƠNG 3: LẬP TRÌNH CƠ SỞ DỮ LIỆU
3.1. Giới thiệu ADO.NET
Vị trí của ADO.NET trong kiến trúc của .net Framework
ADO.NET là một tập các lớp nằm trong bộ thư viện lớp cơ sở của .NET
Framework, cho phép các ứng dụng Windows (như C#, VB.NET) hay ứng dụng
web (như ASP.NET) thao tác dễ dàng với các nguồn dữ liệu.
Mục tiêu chính của ADO.NET là:
Cung cấp các lớp để thao tác CSDL trong cả hai môi trường là phi kết
nối (Disconected data) và kết nối (Connected data).
Tích hợp chặt chẽ với XML (Extensible Markup Language)
Tương tác với nhiều nguồn dữ liệu thông qua mô tả dữ liệu chung.
Tối ưu truy cập nguồn dữ liệu (OleDb & SQL server).
Làm việc trên môi trường Internet (môi trường phi kết nối –
Disconnected eviroment).
Các lớp của ADO.NET được đặt trong Namespace là System.Data.
ADO.NET bao gồm 2 Provider (2 bộ thư viện) (thường dùng) để thao tác với
các CSDL là:
OleDb Provider (nằm trong System.Data.OleDb) dùng để truy xuất
đến bất kỳ CSDL nào có hỗ trợ OleDb.
Project 2
- 87 -
SQL Provider (nằm trong System.Data.SQLClient) chuyên dùng để
truy xuất đến CSDL SQL Server.
3.2. Các mô hình thao tác với CSDL
ADO.NET có 5 thành phần chính.
Connection
Command
DataReader
DataAdapter
DataSet
ADO.NET cho phép làm việc với cơ sở dữ liệu ở cả hai chế độ, chế độ
Kết nối (Connected) và phi kết nối (Disconnected).
Trong chế độ Connected thì mỗi khi thao tác (như sửa, xóa, thêm) thì
đều đòi hỏi ứng dụng phải kết nối và thao tác trực tiếp với cơ sở dữ
liệu (CSDL). Ba đối tượng Connection, Command và DataReader:
cho phép làm việc ở chế độ Connected
Còn trong chế độ Disconnected thì vẫn có thể thêm, sửa, xóa dữ liệu
trên đối tượng cục bộ, không nhất thiết phải kết nối ngay đến CSDL.
Các đối tượng DataAdapter, Connection, Command và Dataset làm
việc ở chế độ Disconnected
Kiến trúc của ADO.NET
Project 2
- 88 -
3.3. Kết nối đến nguồn dữ liệu bằng đối tượng Connection
3.3.1. Chức năng
Đối tượng Connection có nhiệm vụ thực hiện kết nối đến Cơ sở dữ liệu để các đối tượng như Command thao tác với CSDL
thông qua Connection này.
Đối tượng Connection có hai phương thức hay dùng là Open() để mở kết nối tới CSDL và Close() để đóng kết nối tới
CSDL.
3.3.2. Khai báo
Chúng ta có một số cách khai báo đối tượng Connection như sau:
using System;
using System.Data;
using System.Data.SqlClient;
namespace WindowsFormsInCSharp
{
public partial class frmADONET : Form
{
Project 2
- 89 -
public frmADONET()
{
InitializeComponent();
}
//Khai báo chuỗi kết nối tới CSDL (Server là .\SQLEXPRESS, Tên cơ sở dữ liệu là CSDL)
static string strConnect = @"Data Source=.\SQLEXPRESS;Initial Catalog=CSDL;Integrated Security=True";
//Khai báo đối tượng Connection (SqlConnection)
SqlConnection sqlCon;//Cách 1
SqlConnection sqlCon2 = new SqlConnection();//Cách 2
SqlConnection sqlCon3 = new SqlConnection(strConnect);//Cách 3
}
}
Project 2
- 90 -
3.3.3. Kết nối tới Cơ sở dữ liệu- Mở kết nối tới CSDL
Sử dụng phương thức Open() của đối tượng Connection để mở kết nối tới CSDL (trong ConnectionString - chuỗi kết nối
tới CSDL).
Sau khi gọi phương thức Open(), có thể xem đã kết nối thanh công hay không thông qua thuộc tính State của Connection:
if (sqlCon.State == ConnectionState.Open) MessageBox.Show("Đã kết nối thành công tới CSDL");- Đóng kết nối
Sử dụng phương thức Close() của đối tượng Connection để đóng kết nối tới CSDL.
Chú ý: Chúng ta thường viết một phương thức để mở kết nối tới CSDL và một phương thức để đóng kết nối tới CSDL như sau:
using System.Data;
using System.Data.SqlClient;
namespace WindowsFormsInCSharp
{
public partial class frmADONET : Form
{
Project 2
- 91 -
public frmADONET()
{
InitializeComponent();
}
//Khai báo chuỗi kết nối tới CSDL
static string strConnect = @"Data Source=.\SQLEXPRESS;Initial Catalog=CSDL;Integrated Security=True";
//Khai báo đối tượng Connection (SqlConnection)
SqlConnection sqlCon;//sử dụng cách 1
//Phương thức kết nối tới CSDL (thường gọi trong sự kiện Load của Form)
void KetNoi()
{
sqlCon = new SqlConnection(strConnect);
//Kết nối tới nguồn CSDL
if (sqlCon.State == ConnectionState.Closed)
Project 2
- 92 -
sqlCon.Open();
//Kiểm tra kết nối có thành công hay không có thể làm như sau:
if (sqlCon.State == ConnectionState.Open)
MessageBox.Show("Kết nối thành công!");
}
//Ngắt kết nối (thường gọi trong sự kiện FormClosing của Form)
void NgatKetNoi()
{
sqlCon.Close();
}
//Gọi phương thức Mở kết nối
private void frmADONET_Load(object sender, EventArgs e)
{
KetNoi();
Project 2
- 93 -
}
//Gọi phương thức ngắt kết nối
private void frmADONET_FormClosing(object sender, FormClosingEventArgs e)
{
NgatKetNoi();
}
3.4. Thực thi câu lệnh SQL bằng đối tượng Command
3.4.1. Chức năng
Dùng để thực thi các câu lệnh SQL thao tác với CSDL như : Insert, Update, Select, Delete
Trước khi thực thi câu lệnh SQL bằng đối tượng Command thì bắt buộc phải mở kết nối tới CSDL (gọi phương thức
KetNoi() ở trên).
3.4.2. Khai báo
Chúng ta có một số cách khai báo đối tượng Command như sau:
Project 2
- 94 -
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
namespace WindowsFormsInCSharp
{
public partial class frmADONET : Form
{
public frmADONET()
{
InitializeComponent();
}
//Khai báo đối tượng Command (sqlCommand)
SqlCommand sqlCom;
Project 2
- 95 -
SqlCommand sqlCom2 = new SqlCommand();
}
}
3.4.3. Các phương thức thường của đối tượng Command
Đối tượng Command có một số phương thức sau:
ExecuteScalar(): Thực hiện câu lệnh mà kết quả trả về chỉ có 1 ô (Ví dụ câu lệnh Select Count(*)).
ExecuteReader(): Thực hiện câu lệnh Select và trả về một DataReader
ExecuteNonQuery(): Thực hiện câu lệnh OLEDB nhưng không trả về kết quả (Delete, Update, Insert ).
ExecuteXMLReader(): Tạo một bộ đọc từ file XML. Phương thức này không có trong OleDbCommand, chỉ có trong
SqlCommand.
3.4.4. Sử dụng đối tượng Command
Giả sử chúng ta có một cơ sở sữ liệu SQL có tên: CSDL. Cơ sở dữ liệu đó bao gồm một bảng: tbSinhVien(MaSinhVien,
TenSinhVien, Lop, NgaySinh, QueQuan) để lưu trữ thông tin về một số sinh viên
Giả sử chúng ta có một form có tên frmADONET. Trên form đó có chứa một số điều khiển sau:
DataGridView: dgSinhVien để hiển thị dữ liệu trong bảng tbSinhVien.
Các Textbox: txtMaSinhVien, txtTenSinhVien, txtLop, txtNgaySinh, txtQueQuan dùng để nhập dữ liệu
Project 2
- 96 -
Các nút button: btMoi, btThem, btSua, btXoa minh họa sử dụng đối tượng Command để thao tác với CSDL (Insert, Update,
Delete)
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
namespace WindowsFormsInCSharp
Project 2
- 97 -
{
public partial class frmADONET : Form
{
public frmADONET()
{
InitializeComponent();
}
//Khai báo chuỗi kết nối tới CSDL
static string strConnect = @"Data Source=.\SQLEXPRESS;Initial Catalog=CSDL;Integrated Security=True";
//Khai báo đối tượng Connection (SqlConnection) và SqlCommand
SqlConnection sqlCon;//sử dụng cách 1
SqlCommand sqlCom;
SqlCommand sqlCom2 = new SqlCommand();
//Phương thức kết nối tới CSDL
void KetNoi()
{
sqlCon = new SqlConnection(strConnect);
//Kết nối tới nguồn CSDL
Project 2
- 98 -
if (sqlCon.State == ConnectionState.Closed)
sqlCon.Open();
}
//Ngắt kết nối (thường gọi trong sự kiện FormClosing của Form)
void NgatKetNoi()
{
sqlCon.Close();
}
///
/// Phương thức thực thi câu lệnh SQL (Insert, Update, Delete)
///
/// Chuỗi string mô tả Câu lệnh SQL: Insert, Update, Delete
void ThucThi(string strSQL)
{
//Bước 1: Kết nối tới CSLD (Gọi phương thức KetNoi)
KetNoi();
//Bước 2: Khởi tạo và gọi phương thức của đối tượng Command
Project 2
- 99 -
sqlCom = new SqlCommand(strSQL, sqlCon);
sqlCom.ExecuteNonQuery();
//Bước 3: Ngắt kết nối
NgatKetNoi();
}
//Mới
private void btMoi_Click(object sender, EventArgs e)
{
foreach (Control ctr in this.splitContainer1.Panel2.Controls)
{
if ((ctr is TextBox) || (ctr is MaskedTextBox))
{
ctr.Text = "";
}
}
}
//Thêm bản ghi mới vào bảng tbSinhVien
private void btThem_Click(object sender, EventArgs e)
Project 2
- 100 -
{
string strThem = "Insert into tbSinhVien values('"+ txtMaSinhVien.Text
+"','"+txtTenSinhVien.Text+"','"+txtLop.Text+"','"+mkNgaySinh.Text+"','"+txtQueQuan.Text+"')";
ThucThi(strThem);
}
//Sửa bản ghi
private void btSua_Click(object sender, EventArgs e)
{
string strSua = "update tbSinhVien set TenSinhVien='" + txtTenSinhVien.Text + "',Lop='" + txtLop.Text + "',NgaySinh='" +
mkNgaySinh.Text + "',QueQuan='" + txtQueQuan.Text + "' where MaSinhVien='"+txtMaSinhVien.Text+"' ";
ThucThi(strSua);
}
//Xóa bản ghi
private void btXoa_Click(object sender, EventArgs e)
{
string strXoa = "delete from tbSinhVien where MaSinhVien='"+ txtMaSinhVien.Text +"' ";
ThucThi(strXoa);
}
//End
Project 2
- 101 -
}
3.5. Truy vấn và nhận về dữ liệu với DataReader
3.5.1. Chức năng.
Dùng để đón nhận kết quả (dữ liệu) trả về từ phương thức ExecuteReader của đối tượng Command. Tuy nhiên dữ liệu là
Readonly và chỉ đọc theo chiều tiến
3.5.2. Khai báo
Khai báo: SqlDataReader Biến_DataReader;//Không có New
Lấy kết quả từ Command
= .ExecuteReader();
3.5.3. Sử dụng đối tượng DataReader
Giả sử chúng ta muốn hiển thi tên của tất cả sinh viên tring bảng tbSinhVien(MaSinhVien, TenSinhVien, Lop, NgaySinh,
QueQuan), chúng ta sử dụng đối tượng SqlDataReader như sau.
Project 2
- 102 -
using System.Data;
using System.Data.SqlClient;
namespace SampleDatabaseProgramming
{
public partial class frmADONET : Form
{
public frmADONET()
{
InitializeComponent();
}
//Khai báo các chuỗi kết nối và các đối tượng
string strConnect = @"Data Source=.\SQLEXPRESS;Initial Catalog=CSDL;Integrated Security=True";
SqlConnection sqlCon;
SqlCommand sqlCom;
SqlDataReader sqlRd;
SqlParameter sqlPa;
//Phương thức kết nối tới CSDL SQL Server
private void KetNoi()
{
sqlCon = new SqlConnection(strConnect);
if (sqlCon.State == ConnectionState.Closed)
{
sqlCon.Open();
}
}
//Phương thức đóng kết nối tới CSDL
private void NgatKetNoi()
{
Project 2
- 103 -
if (sqlCon.State == ConnectionState.Open)
{
sqlCon.Close();
}
}
//Phương thức đọc dữ liệu
public void DocDuLieu()
{
KetNoi();
//kết nối tới CSDL
sqlCom = new SqlCommand("select TenSinhVien from tbSinhVien", sqlCon);
sqlRd = sqlCom.ExecuteReader();
//
while (sqlRd.Read())
{
MessageBox.Show(sqlRd["TenSinhVien"].ToString());//Hoặc sqlRd["TenSinhVien"].ToString()
}
//Ngắt kết nối
NgatKetNoi();
}
//Gọi phương thức đọc dữ liệu
private void frmADONET_Load(object sender, EventArgs e)
{
DocDuLieu();
}
}
}
Project 2
- 104 -
3.6. Cập nhật và truy vấn dữ liệu với đối tượng DataAdapter
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;
Biến Adapter có các phương thức khởi dựng sau:
Project 2
- 105 -
Sử dụng: BiếnAdapter.Fill(, “Tên cho bảng”); or BiếnAdapter.Fill(, “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.
using System.Data;
using System.Data.SqlClient;
namespace SampleDatabaseProgramming
{
public partial class frmADONET : Form
{
public frmADONET()
{
InitializeComponent();
}
//Khai báo các chuỗi kết nối và các đối tượng
SqlDataAdapter sqlAdap;
//Truy vấn dữ liệu sử dụng đối tượng DataAdapter
DataTable TruyVanDuLieu()
{
Project 2
- 106 -
DataTable dt=new DataTable();
//
sqlAdap = new SqlDataAdapter("select * from tbSinhVien", @"Data Source=.\SQLEXPRESS;Initial Catalog=CSDL;Integrated
Security=True");
sqlAdap.Fill(dt);
//
return dt;
}
3.6.3.2. Sử dụng DataAdapter để cập nhật (inserts, update) dữ liệu
using System.Data;
using System.Data.SqlClient;
namespace SampleDatabaseProgramming
{
public partial class frmADONET : Form
{
//Khai báo đối tượng
SqlDataAdapter sqlAdap;
//Cập nhật dữ liệu với DataAdapter
DataTable CapNhatDuLieu()
{
DataTable dt=new DataTable();
//
sqlAdap = new SqlDataAdapter("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");
sqlAdap.Fill(dt);
Project 2
- 107 -
//
return dt;
}
//Gọi phương thức cập nhật dữ liệu
private void frmADONET_Load(object sender, EventArgs e)
{
CapNhatDuLieu();
}
}
}
3.7. Mô hình DataSet
3.7.1. Chức năng
Dataset là một lớp dù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
Project 2
- 108 -
Mối quan hệ giữa DataAdapter và DataSet
Mối quan hệ giữa DataSet và DataTable
Project 2
- 109 -
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),
Project 2
- 110 -
@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 SqlParameter như dưới:
using System.Data;
using System.Data.SqlClient;
namespace SampleDatabaseProgramming
{
public partial class frmADONET : Form
{
public frmADONET()
{
InitializeComponent();
}
//Khai báo các chuỗi kết nối và các đối tượng
string strConnect = @"Data Source=.\SQLEXPRESS;Initial Catalog=CSDL;Integrated Security=True";
Project 2
- 111 -
SqlConnection sqlCon;
SqlCommand sqlCom;
SqlParameter sqlPa;
//Phương thức kết nối tới CSDL SQL Server
private void KetNoi()
{
sqlCon = new SqlConnection(strConnect);
if (sqlCon.State == ConnectionState.Closed)
{
sqlCon.Open();
}
}
//Phương thức đóng kết nối tới CSDL
private void NgatKetNoi()
{
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
///
/// Phương thức thực thi câu lệnh SQL hay StoredProcedure
///
/// Thực thi dạng câu lệnh SQL hay StoredProcedure
/// Tên câu lệnh SQL hay tên StoredProcedure
/// Tên các tham số truyền vào StoredProcedure
Project 2
- 112 -
/// Giá trị truyền vào cho các biến trong StoredProcedure
/// Kiểu dữ liệu của biến
public void ThucThi(CommandType cmdType, string strName, string[] MangTen, object[] MangGiaTri, DbType[] MangType)
{
KetNoi();
//
sqlCom = new SqlCommand();
sqlCom.CommandType = cmdType;
sqlCom.CommandText = strName;
sqlCom.Connection = sqlCon;
//Khai báo và gán các đối tượng Parameter
for (int i = 0; i < MangTen.Length; i++)
{
sqlPa = new SqlParameter();
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 void frmADONET_Load(object sender, EventArgs e)
{
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);
}
Project 2
- 113 -
//End
}
}
3.9. Ràng buộc dữ liệu với các điều khiển
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
đi kèm)
3.10. Sử dụng DataView trong sắp xếp và tìm kiếm dữ liệu
3.11. LINQ
Project 2
- 114 -
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:
Project 2
- 115 -
▼
▼
▼
Project 2
- 116 -
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.
Bước 3: Kết nối đến nguồn CSDL
Project 2
- 117 -
▼
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)
▼
▼
Project 2
- 118 -
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)
▼
Project 2
- 119 -
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ế.
Project 2
- 120 -
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
dưới đây.
Project 2
- 121 -
Để xem các kết quả thiết kế của bạn bạn có thể chọn Tab Main Report
Preview để xem kết quả như dưới đây.
Để quay trở lại thiết kế các bạn chọn Tab Main Report
Project 2
- 122 -
→ 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!
Project 2
- 123 -
4.3. Thiết kế Report động
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
OK để minh họa cho việc truyền dữ liệu.
Project 2
- 124 -
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
using CrystalDecisions.CrystalReports;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.CrystalReports.Engine.Migration;
namespace CrystalReport2008
{
public partial class frmDynamic
Các file đính kèm theo tài liệu này:
- bai_tap_lap_trinh_windows.pdf