Bài tập Lập trình Windows

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

pdf125 trang | Chia sẻ: phuongt97 | Lượt xem: 357 | Lượt tải: 0download
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:

  • pdfbai_tap_lap_trinh_windows.pdf