ĐẠI HỌC HUẾ ĐẠI HỌC KHOA HỌC KHOA CÔNG NGHỆ THƠNG TIN GIÁO TRÌNH C# VÀ ỨNG DỤNG NGUYỄN HỒNG HÀ – NGUYỄN VĂN TRUNG HUẾ - 2008 Giáo trình Visual Studio NET CHƯƠNG TỔNG QUAN VỀ NET FRAMEWORK 1.1 Tổng quan kiến trúc NET Framework NET Framework thiết kế mơi trường tích hợp để đơn giản hóa việc phát triển thực thi ứng dụng Internet, desktop dạng Windows Forms, chí thiết bị di động (với Compact Framework) Các mục tiêu mà NET framework hướng đến là: - Cung cấp môi trường hướng đối tượng quán cho nhiều loại ứng dụng - Cung cấp môi trường giảm tối thiểu xung đột phiên (“DLL Hell” – Địa ngục DLL) làm điêu đứng lập trình viên Windows (COM), đơn giản hóa q trình triển khai/cài đặt - Cung cấp môi trường linh động, dựa chuẩn chứng nhận để chứa hệ điều hành C# phần mơi trường thực thi NET, CLI (Common Language Infrastructure – Hạ tầng ngôn ngữ chung) chuẩn hóa ECMA - Để cung cấp mơi trường quản lý được, mã dễ dàng xác thực để thực thi an toàn Kiến trúc NET Framework thiết kế thành phần: CLR (Common Language Runtime – Khối thức thi ngôn ngữ chung) FCL (Framework Class Library – Thư viện lớp khung) hình Hình 1.1 – Kiến trúc NET Framework Giáo trình Visual Studio NET CLR, phần cài đặt CLI Microsoft, làm nhiệm vụ quản lý thực thi mã lệnh tất tác vụ liên quan đến nó: biên dịch, quản lý nhớ, bảo mật, quản lý tuyến đoạn, thực thi an toàn kiểu Mã lệnh thực thi CLR gọi mã quản lý (managed code), phân biệt với mã không quản lý (unmanaged code), mã lệnh không cài đặt yêu cầu để thực thi CLR – chẳng hạn COM thành phần dựa Windows API FCL thư viện kiểu liệu tái sử dụng (gồm class, structure, …) dành cho ứng dụng thực thi NET Tất ngôn ngữ hỗ trợ NET Framework sử dụng thư viện lớp dùng chung 1.2 Môi trường thực thi ngôn ngữ chung CLR (Common Language Runtime) CLR (Common Languge Runtime – Môi trường thực thi ngôn ngữ chung) quản lý tồn vịng đời ứng dụng: nạp lớp có liên quan, quản lý thực thi lớp, đảm bảo quản lý nhớ cách tự động Ngoài ra, CLR cịn hỗ trợ tích hợp ngơn ngữ phép mã lệnh sinh ngôn ngữ khác tương tác với cách liền mạch 1.2.1 Biên dịch mã lệnh NET Trình biên dịch tương thích với CLR sinh mã thực thi cho môi trường thực thi mã thực thi cho CPU cụ thể Mã thực thi biết đến qua tên gọi CIL (Common Intermediate Language – Ngôn ngữ trung gian chung), hay MSIL (Microsoft Intermediate Language – Ngơn ngữ trung gian Microsoft); ngơn ngữ kiểu assembler đóng gói file EXE DLL Các file thuộc dạng file thực thi thơng thường, chúng cần trình biên dịch JIT (Just-inTime) mơi trường thực thi để chuyển đối IL chứa sang dạng mã lệnh cụ thể máy ứng dụng thực thực thi Quá trình biên dịch, thực thi chương trình NET framework tóm tắt sau: - Chương trình nguồn trước hết biên dịch đóng gói thành khối gọi assembly Khối chứa mã lệnh ngôn ngữ trung gian metadata mô tả thông tin cần thiết cho hoạt động khối - Mỗi có yêu cầu thực thi assembly nói trên, CLR chuyển đối mã lệnh ngôn ngữ trung gian assembly thành mã lệnh tương thích với CPU cụ thể trước Giáo trình Visual Studio NET thực thi Hình 1.2 – Chức CLR Như vậy, lập trình viên sử dụng ngơn ngữ để phát triển ứng dụng NET framework, miễn ngơn ngữ có hỗ trợ NET framework Điều đặc biệt là, sử dụng chung hệ thống kiểu liệu, nên tính liên thơng ngơn ngữ NET framework cao 1.2.2 Hệ thống kiểu liệu chung CTS (Common Type System) CTS cung cấp tập sở kiểu liệu cho ngơn ngữ hoạt động NET platform Ngồi ra, đặc tả cách khai báo tạo kiểu liệu tùy biến, cách quản lý vòng đời thể kiểu liệu Hình mô tả cách tổ chức CTS NET Giáo trình Visual Studio NET Hình 1.3 – Các kiểu liệu sở CTS Mọi kiểu liệu NET kế thừa từ kiểu liệu System.Object Các kiểu liệu chia làm hai loại: kiểu tham chiếu kiểu giá trị Kiểu liệu tham chiếu xử lý vùng nhớ đặc biệt gọi heap thông qua trỏ Kiểu liệu giá trị tham chiếu trực tiếp stack chương trình 1.2.3 Assemblies Tất mã quản lý thực thi NET phải chứa assembly Một assembly xem file EXE DLL Một asembly chứa tập hợp gồm hay nhiều file chứa phần mã lệnh tài nguyên (như ảnh liệu XML) Một assembly tạo trình biên dịch tương thích với NET chuyển file chứa mã nguồn thành file DLL EXE Như minh họa hình 1.4, assembly chứa manifest, metadata, ngơn ngữ trung gian sinh trình biên dịch cụ thể Manifest: Mỗi assembly phải có file chứa manifest Manifest tập hợp bảng chứa metadata liệt kê tên tất file assembly, tham chiếu đến assembly bên ngồi, thơng tin tên, phiên để định danh assembly Một số assembly cịn có chữ ký điện tử (unique digital signature) Khi assembly nạp, nhiệm vụ CLR mở file chứa manifest để định danh thành viên có assembly Metadata: Ngồi bảng manifest vừa định nghĩa, trình biên dịch C# cịn sinh bảng định nghĩa bảng tham chiếu Bảng định nghĩa cung cấp ghi đầy đủ Giáo trình Visual Studio NET kiểu chứa IL Ví dụ, có bảng định nghĩa kiểu, phương thức, trường liệu, tham số, thuộc tính Bảng tham chiếu chứa thông tin tất tham chiếu kiểu assembly khác Trình biên dịch JIT phụ thuộc vào bảng để chuyển IL sang mã máy IL: Vai trò IL đề cập trước Trước CLS sử dụng IL, phải đóng gói vào assembly dạng DLL EXE Assembly dạng EXE phải có điểm nhập (entry point) để thực thi Ngược lại, Assembly dạng DLL, thiết kế để hoạt động thư viện mã lệnh nắm giữ định nghĩa kiểu Hình 1.4 – Assembly gồm file Assembly không cách logic để đóng gói mã thực thi Nó quy định mơ hình chủ yếu NET để triển khai mã lệnh, quản lý phiên bản, bảo mật - Tất mã quản lý, cho dù chương trình đơn, điều khiển, hay thư viện DLL chứa kiểu liệu tái sử dụng, đóng gói vào assembly Đây khối triển khai hệ thống Khi ứng dụng bắt đầu, assembly yêu cầu cho việc khởi tạo cần diện Các assembly khác nạp có yêu cầu Các nhà phát triển phân ứng dụng thành assembly dựa theo mức độ thường xuyên sử dụng - Trong giới NET, assembly quy định biên giới phiên Trường Version Number manifest áp dụng cho tất kiểu tài nguyên assembly Vì vậy, file tạo nên assembly xem đơn vị đơn có phiên - Một assembly thiết lập biên giới bảo mật để định quyền hạn truy xuất Giáo trình Visual Studio NET C# sử dụng bổ từ truy cập để điều khiển cách mà kiểu thành phần kiểu assembly truy xuất Hai số sử dụng assembly, public – cho phép truy xuất tùy ý từ assembly ; internal – giới hạn truy xuất đến kiểu thành viên bên assembly Như đề cập trên, assembly chứa nhiều file Những file không giới hạn module mã lệnh mà file tài nguyên file hình ảnh văn Một cách sử dụng tính chất thực tế tạo ứng dụng đa ngơn ngữ, ứng dụng sử dụng chung module logic, phần giao diện tài nguyên khác triển khai riêng thành file độc lập Khơng có giới hạn số lượng file assembly Hình 1.5 minh họa bố cục assembly chứa nhiều file Hình 1.5 - Assembly chứa nhiều file Trong minh họa assembly chứa nhiều file, manifest assembly chứa thông tin để định danh file sử dụng assembly Mặc dù hầu hết assembly chứa file Sau thuận lợi assembly chứa nhiều file: - Có thể tổ hợp module tạo từ nhiều ngơn ngữ lập trình khác - Các module mã lệnh phân để tối ưu cách mà mã lệnh nạp vào CLR Các mã lệnh có liên quan sử dụng thường xuyên nên đặt vào module; mã lệnh sử dụng đặt vào module khác CLR không nạp module chưa thực cần thiết Giáo trình Visual Studio NET - Các file tài nguyên đặt vào module riêng nó, qua cho phép nhiều ứng dụng chia sẻ tài nguyên dùng chung 1.2.4 Private Assembly Shared Assembly Các assembly triển khai theo hai dạng: private assembly global assembly Private assembly assembly đặt thư mục ứng dụng thư mục Q trình cài đặt cập nhật private assembly đơn giản chép assembly vào thư mục cần thiết, không cần thiết lập thông tin registry Đơi khi, dùng thêm file cấu hình ứng dụng ghi đè số thiết lập manifest ứng dụng Shared assembly assembly cài đặt vào vị trí tồn cục, gọi Global Assembly Cache (GAC), nơi truy xuất từ nhiều ứng dụng Điểm quan trọng GAC cho phép nhiều phiên assembly thực thi Để hỗ trợ điều này, NET khắc phục vấn đề xung đột tên cách sử dụng thuộc tính để định danh assembly, bao gồm: Assembly Name (tên assembly), Culture Identity (định danh văn hóa), Version (phiên bản), Public Key Token (dấu hiệu mã khóa cơng khai) Các shared assembly thường đặt thư mục assembly thư mục hệ thống hệ điều hành (WINNT Windows 2000, WINDOWS Windows XP) Như mơ tả hình 1.6, assembly liệt kê theo định dạng đặc biệt để hiển thị thuộc tính chúng (.NET Framework bao gồm file DLL để mở rộng Windows Explorer cho phép hiển thị nội dung GAC) - Assembly Name: gọi tên thường gọi, tên file assembly không chứa phần mở rộng - Version: Mỗi assembly có số hiệu phiên để dùng cho tất file assembly Nó chứa số theo định dạng: Thông thường số cập nhật cho lần thay đổi mang tính phá vỡ tính tương thích ngược Một số hiệu phiên gán cho assembly cách đính thuộc tính AssemblyVersion phần mã nguồn assembly - Culture Setting: Nội dung assembly kết hợp với văn hóa hay ngơn ngữ cụ thể Thiết lập định mã hai ký tự kiểu “en” cho English, “vi” cho Vietnam, gán với thuộc tính Giáo trình Visual Studio NET AssemblyCulture đặt mã nguồn assembly [ assembl y: Assembl yCul t ur e ( " f r - CA" ) ] - Public Key Token: Để đảm bảo shared assembly đáng tin cậy, NET yêu cầu người tạo assembly phải đánh dấu định danh mạnh Quá trình gọi ký, yêu cầu sử dụng cặp khóa cơng khai/riêng tư Khi trình biên dịch xây dựng assembly, sử dụng khóa riêng tư để sinh định danh mạnh Token sinh byte cuối phép băm (hashing) khóa cơng khai Token đặt manifest assembly client có tham chiếu đến shared assembly sử dụng để định danh assembly trình thực thi Một assembly gán cặp khóa cơng khai/riêng gọi assembly định danh mạnh Mọi assembly phải có định danh mạnh Giáo trình Visual Studio NET Hình 1.6 – Thư mục Global Assembly hệ thống Windows XP 1.2.5 Tiền biên dịch Assembly Sau assembly nạp vào CLR, IL phải biên dịch sang thành mã máy trước thực thực thi .NET Framework có cung cập cơng cụ gọi Ngen (Native Image Generator), dùng để biên dịch assembly thành “native image” lưu native image cache – vùng dành riêng GAC Mỗi CLR nạp assembly, kiểm tra cache xem có native image tương ứng chưa; có nạp mã biên dịch không cần biên dịch thêm lần Đây tính mà khai thác hợp lý tận dụng để cải thiện hiệu 1.2.6 Kiểm chứng mã lệnh (Code Verification) Như phần trình biên dịch JIT, CLR thực hai loại kiểm chứng: kiểm Giáo trình Visual Studio NET 10 {sql[0] = "select masach,nhande,tacgia,nxb,soluong from sach where nhande like @maloai or tacgia like @maloai"; sql[1] = "%" + ma + "%"; } return sql; } protected void Page_Load(object sender, EventArgs e) { string[] ma = new string[2] { "",""}; ma= GetSql(); if (ma[0] != "" && ma[0] != null) { string cnstr = WebConfigurationManager.ConnectionStrings["thuvien"].ConnectionString; DuaDulieuVaoDieuKhien dl = new DuaDulieuVaoDieuKhien(cnstr); dl.CommandText = ma[0]; dl.ParameterCollection = new string[1] { "@maloai" }; dl.ValueCollection = new string[1] { ma[1] }; dl.KhoiTao(); //Hiển thị tối đa dòng GridView, số trang hiển thị 10 dl.NapDuLieuVaoGridView(this.GridView1, 5, 10, PagerButtons.Numeric); //tạo liên kết cột số (nhan đề), truyến tham số với tên masach, giá trị tham số cột // thứ (masach) sang trang MuonSach.aspx dl.TaoLienKetTrongGridView(GridView1, "~/MuonSach.aspx?masach=", 1, 0, "Kích vào tên sách để mượn"); Giáo trình Visual Studio NET 175 //nếu người dùng chọn tên loại left.ascx if (Request.QueryString.Get("tenloai") != null) Literal1.Text = " Danh sách sách loại: " + Request.QueryString.Get("tenloai") + ""; else Literal1.Text = " Cac sach tim thay "; } else {Literal1.Text = " SINH VIÊN HÃY CHỌN LOẠI SÁCH HOẶC TÌM KIẾM SÁCH ĐỂ MƯỢN"; } } + Trên kiện PageIndexChanging ta xác định trang thứ cần hiển thị protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) { GridView1.PageIndex = e.NewPageIndex ; } 5.3.4 Xây dựng các trang WEB Theo yêu cầu ví dụ ta cần xây dựng trang WEB sau: DangNhap.asp: cho phép độc giả đăng nhập tài khoản Default.aspx (trang chủ): để độc giả chọn tìm sách để mượn Muonsach.aspx: Người dùng mượn sách ThongTinDocGia.aspx: Hiển thị tất thông tin độc giả DoiMatKhau.aspx: Độc giả thay đổi mật Tạo trang WEB: Web site | Add New Item| Gõ tên trang | Add Giáo trình Visual Studio NET 176 5.3.4.1 Tạo trang DangNhap.asp + Chọn Standard Tool Box: Tạo Literal để hiển thị thông báo đăng nhập không thành công, Tạo label để hiển thị Mã độc giả Mật Tạo TextBox để gõ mã độc giả (TxtMaDocGia) gõ mật (TxtMatKhau).Trên TxtMatKhau đặt thuộc tính: Text Mode: Pasword Tạo Button Đăng Nhập (Button1) + Trên kiện Page_Load ta tạo biến kt thuộc lớp Session để kiểm tra xem độc giả đăng nhập hay chưa Biến thuộc lớp Session quản lý phiên làm việc độc giả protected void Page_Load(object sender, EventArgs e) { Giáo trình Visual Studio NET 177 Session["kt"] = null; } + Trên kiện Click nút Đăng Nhập (Button1) ta kiểm tra xem độc giả đăng nhập hay khơng đăng nhập mở trang Default.aspx, kiện ta sử dụng phương thức KiemDangNhap lớp Docgia protected void Button1_Click(object sender, EventArgs e) { Docgia dg = new Docgia(); if (dg.KiemDangNhap(TxtMaDocGia.Text,TxtMatKhau.Text)==1) { Session["kt"] = 1; Session["UserName"] = TxtMaDocGia.Text; Response.Redirect("~/Default.aspx"); } else { Literal1.Text = " Sai Ma doc gia hoac Mat Khau "; } } + Kích chuột phải lên DangNhap.aspx cửa sổ Solution Explored | Set As Start Page: để chọn trang DangNhap làm trang chạy mặc định 5.3.4.2 Tạo trang Default.asp (trang chủ) + Chọn HTML ToolBox: Tạo Table: dịng, cột, trộn dịng đầu thành (bơi đên đầu | Kích chuột phải | Merge Cells) : + Chọn thư mục UC cửa sổ Solution Explored: Kéo Top.ascx TopMenu.ascx vào dòng Kéo Left.ascx vào (1) Kéo LietKeSach.ascx vào (2) Giáo trình Visual Studio NET 178 Kéo Right.ascx vào (3) ta giao diện sau: + Nhấn F5 để chạy thử 5.3.4.3 Tạo trang Muonsach.asp + Chọn HTML ToolBox: Tạo Table: dòng, cột: + Chọn thư mục UC cửa sổ Solution Explored: Giáo trình Visual Studio NET 179 Kéo Top.ascx TopMenu.ascx vào dòng + Tại dòng thứ bảng: Chọn Standard ToolBox tạo Label, TextBox, Literal Button giống hình + Trên kiện Page_Load ta kiểm tra xem độc giả đăng nhập chưa, đăng nhập cho mượn sách, chưa phải đăng nhập protected void Page_Load(object sender, EventArgs e) { if (Session["kt"] == null)// Độc giả chưa đăng nhập { Response.Redirect("~/DangNhap.aspx"); } else { //txtma chứa mã độc giả mã độc giả đăng nhập txtma.Text = Session["UserName"].ToString(); KiemtraMaDocGia(); // Hiển thị tên độc giả tên khoa TxtNgayMuon.Text = DateTime.Now.ToShortDateString(); //Khi độc giả chọn tên sách cần mượn, ta lấy mã sách từ //LietKesach.ascx truyền sang string ma = Request.QueryString.Get("masach"); if (ma != null && ma != "") { TxtMasach.Text = ma; KiemTrasach(); // Hiển thị tên sách, tên tác giả ButKiemTra.Enabled = false; Giáo trình Visual Studio NET 180 } } } + Hàm KiemtraMaDocGia kiểm tra xem mã độc giả nhập có khơng hàm hiển thị họ tên tên khoa độc giả void KiemtraMaDocGia() { Docgia dg = new Docgia(); string[] st = new string[2]; st = dg.GetDocGia(txtma.Text); if (st != null) { txtHoTen.Text = st[0]; TxtKhoa.Text = st[1]; } } + Hàm KiemTraSach kiểm tra xem mã sách nhập có khơng hàm hiển thị tên sách tác giả void KiemTrasach() { Literal1.Text = ""; Sach dg = new Sach(); string[] st = new string[2]; Giáo trình Visual Studio NET 181 st = dg.GetSach(TxtMasach.Text); if (st != null) { TxtTensach.Text = st[0]; TxtTacGia.Text = st[1]; } else { Literal1.Text = "Khong co ma sach nay"; } } + Khi người sử dụng không chọn tên sách cần mượn mà tự gõ mã sách ta tìm xem thử có mã sách khơng, có hiển thị tên sách tác giả: protected void ButKiemTra_Click(object sender, EventArgs e)// Nút Kiểm tra { KiemTrasach(); } + Khi độc giả chọn nút mượn kiểm tra xem độc giả cịn mượn sách thư viên không, trả hết sách cho độc giả mượn sách protected void ButMuon_Click(object sender, EventArgs e) { PhieuMuon pm = new PhieuMuon(); if ( TxtMasach.Text == "")Literal2.Text = "Ban chua nhap ma sach "; else if (pm.KiemTraMuon(txtma.Text) == 1) Giáo trình Visual Studio NET 182 { Literal2.Text = "Ban chua tra sach"; } else { if (pm.CapNhat(txtma.Text, DateTime.Now, TxtMasach.Text, 1, 1)==1) Literal2.Text = "Ban da muon sach"; else Literal2.Text = "Sach na da het thu vien"; } } 5.3.4.3 Tạo trang ThongTinDocGia.aspx + Chọn HTML ToolBox: Tạo Table: dòng, cột: + Chọn thư mục UC cửa sổ Solution Explored: Kéo Top.ascx TopMenu.ascx vào dòng + Tại dòng thứ bảng: Chọn Standard ToolBox tạo Label DataGrid: Giáo trình Visual Studio NET 183 + Trên kiện Page_Load ta kiểm tra xem độc giả đăng nhập chưa, đăng nhập cho hiển thị thơng tin, sách đặt chổ chưa lấy ta tạo liên kết để độc giả hủy đặt chổ: protected void Page_Load(object sender, EventArgs e) { if (Session["kt"] == null) { Response.Redirect("~/DangNhap.aspx"); } else { Docgia dg = new Docgia(); dg.HienThiThongTin(GridView1, Session["UserName"].ToString()); taolienket(); //Lấy mã sách cần hủy đặt chổ string masach = Request.QueryString["masach"]; if (masach != null)//độc giả chọn sách cần hủy { PhieuMuon pm = new PhieuMuon(); pm.HuyDatCho(masach); dg.HienThiThongTin(GridView1, Session["UserName"].ToString()); } } } void taolienket() { foreach (GridViewRow rows in GridView1.Rows) { HyperLink hyperLink = new HyperLink(); hyperLink.Text = rows.Cells[3].Text; if (Int16.Parse(rows.Cells[6].Text) == 1) { hyperLink.NavigateUrl = "ThongTinDocGia.aspx?masach=" + rows.Cells[3].Text; hyperLink.ToolTip = "Chọn tên sách để hủy"; } rows.Cells[3].Controls.Add(hyperLink); } } Trong đó: phương thức taolienket() để tìm xem GridView có dịng có Giáo trình Visual Studio NET 184 trangthai=1 hay khơng, có tạo liên kết trường masach void taolienket() { foreach (GridViewRow rows in GridView1.Rows) { HyperLink hyperLink = new HyperLink(); hyperLink.Text = rows.Cells[3].Text; if (Int16.Parse(rows.Cells[6].Text) == 1) { hyperLink.NavigateUrl = "ThongTinDocGia.aspx?masach=" + rows.Cells[3].Text; hyperLink.ToolTip = "Chọn tên sách để hủy"; } rows.Cells[3].Controls.Add(hyperLink); } } 5.3.4.4 Tạo trang DoiMatKhau.aspx Chọn Standard ToolBox tạo Label , TextBox Literal sau: + Mã độc giả UserName độc giả đăng nhập protected void Page_Load(object sender, EventArgs e) { TxtMaDocGia.Text = Session["UserName"].ToString(); } + Khi độc giả chọn Button Đổi mật Khẩu kiểm tra xem mã độc giả nhập có khơng, mật có trùng hay khơng, cho thay đổi protected void Button1_Click(object sender, EventArgs e) Giáo trình Visual Studio NET 185 { Docgia dg = new Docgia(); if (TxtMatkhaumoi.Text.Equals(TxtGoLaiMatKhau.Text)) { if(dg.DoiMatKhau(TxtMaDocGia.Text,TxtMatKhaucu.Text,TxtMatkhaumoi.Text)==1) Literal1.Text = "Doi mat khau cong"; else Literal1.Text = "Ma doc gia hoac mat khau cu nhap sai"; } else Literal1.Text="Mat khau khong khop nhau"; } 5.3.5 Yêu cầu bổ sung: + Với ví dụ tập trung vào việc đặt trước chổ để mượn sách, chưa quan tâm đến chức người quản thư + Yêu cầu bổ sung, tạo trang thực công việc sau: - Để người quản thư đăng nhập tài khoản - Để người quản thư cho mượn sách (căn vào độc giả đặt chổ trước) - Hiển thị thông tin độc giả mượn hạn - Để độc giả trả sách PHỤ LỤC LỤC Bảng tương quan/chuyển đổi kiểu liệu NET Framework với Data Provider NET Framework System.Data.DbType type Giáo trình Visual Studio NET SqlDbType OleDbType OdbcType OracleType 186 .NET Framework System.Data.DbType type SqlDbType OleDbType OdbcType OracleType bool Boolean Bit Boolean Bit Byte byte Byte TinyInt UnsignedTinyInt TinyInt Byte byte[] Binary VarBinary Việc VarBinary chuyển đổi ngầm định không mảng byte lớn kích thước tối đa VarBinary (8000 bytes) Binary Raw Không hỗ trợ Char Char Byte char DateTime DateTime DateTime DBTimeStamp DateTime DateTime Decimal Decimal Decimal Decimal Numeric Number double Double Float Double Double Double float Single Real Single Real Float Guid Guid UniqueIdentifier Guid UniqueIdentifier Raw Int16 Int16 SmallInt SmallInt SmallInt Int16 Int32 Int32 Int Int Int Int32 Int64 Int64 BigInt BigInt BigInt Number object Object Variant Variant Khơng hỗ trợ Blob Giáo trình Visual Studio NET 187 .NET Framework System.Data.DbType type SqlDbType OleDbType OdbcType OracleType string String NVarChar VarWChar Chuyển đổi ngầm định không string lớn kích thước tối đa NVarChar (4000 ký tự) NVarChar NVarChar TimeSpan Time Không hỗ trợ DBTime Time DateTime UInt16 UInt16 Không hỗ trợ UnsignedSmallInt Int UInt16 UInt32 UInt32 Không hỗ trợ UnsignedInt BigInt UInt32 UInt64 UInt64 Không hỗ trợ UnsignedBigInt Numeric Number AnsiString VarChar VarChar VarChar VarChar AnsiStringFixedLength Char Char Char Char Currency Money Currency Không hỗ trợ Number Date Không hỗ trợ DBDate Date DateTime SByte Không hỗ trợ TinyInt Không hỗ trợ SByte StringFixedLength NChar WChar NChar NChar Time Không hỗ trợ DBTime Time DateTime VarNumeric Không hỗ trợ VarNumeric Không hỗ trợ Number Giáo trình Visual Studio NET 188 TÀI LIỆU THAM KHẢO KHẢO (1) Stephen C Perry, Core C# and NET, Prentice Hall PTR, 2005 (2) Phạm Hữu Khang, C# 2005, Tập Lập trình ASP.NET 2.0, 4: Đối tượng ADO.NET XML, Nhà xuất Lao Động Xã Hội (3) Microsoft Corporation, MSDN 2005 Giáo trình Visual Studio NET 189
ĐẠI HỌC HUẾ ĐẠI HỌC KHOA HỌC KHOA CÔNG NGHỆ THƠNG TIN GIÁO TRÌNH C# VÀ ỨNG DỤNG NGUYỄN HỒNG HÀ – NGUYỄN VĂN TRUNG HUẾ - 2008 Giáo trình Visual Studio NET CHƯƠNG TỔNG QUAN VỀ NET FRAMEWORK 1.1 Tổng quan kiến trúc NET Framework NET Framework thiết kế mơi trường tích hợp để đơn giản hóa việc phát triển thực thi ứng dụng Internet, desktop dạng Windows Forms, chí thiết bị di động (với Compact Framework) Các mục tiêu mà NET framework hướng đến là: - Cung cấp môi trường hướng đối tượng quán cho nhiều loại ứng dụng - Cung cấp môi trường giảm tối thiểu xung đột phiên (“DLL Hell” – Địa ngục DLL) làm điêu đứng lập trình viên Windows (COM), đơn giản hóa q trình triển khai/cài đặt - Cung cấp môi trường linh động, dựa chuẩn chứng nhận để chứa hệ điều hành C# phần mơi trường thực thi NET, CLI (Common Language Infrastructure – Hạ tầng ngôn ngữ chung) chuẩn hóa ECMA - Để cung cấp mơi trường quản lý được, mã dễ dàng xác thực để thực thi an toàn Kiến trúc NET Framework thiết kế thành phần: CLR (Common Language Runtime – Khối thức thi ngôn ngữ chung) FCL (Framework Class Library – Thư viện lớp khung) hình Hình 1.1 – Kiến trúc NET Framework Giáo trình Visual Studio NET CLR, phần cài đặt CLI Microsoft, làm nhiệm vụ quản lý thực thi mã lệnh tất tác vụ liên quan đến nó: biên dịch, quản lý nhớ, bảo mật, quản lý tuyến đoạn, thực thi an toàn kiểu Mã lệnh thực thi CLR gọi mã quản lý (managed code), phân biệt với mã không quản lý (unmanaged code), mã lệnh không cài đặt yêu cầu để thực thi CLR – chẳng hạn COM thành phần dựa Windows API FCL thư viện kiểu liệu tái sử dụng (gồm class, structure, …) dành cho ứng dụng thực thi NET Tất ngôn ngữ hỗ trợ NET Framework sử dụng thư viện lớp dùng chung 1.2 Môi trường thực thi ngôn ngữ chung CLR (Common Language Runtime) CLR (Common Languge Runtime – Môi trường thực thi ngôn ngữ chung) quản lý tồn vịng đời ứng dụng: nạp lớp có liên quan, quản lý thực thi lớp, đảm bảo quản lý nhớ cách tự động Ngoài ra, CLR cịn hỗ trợ tích hợp ngơn ngữ phép mã lệnh sinh ngôn ngữ khác tương tác với cách liền mạch 1.2.1 Biên dịch mã lệnh NET Trình biên dịch tương thích với CLR sinh mã thực thi cho môi trường thực thi mã thực thi cho CPU cụ thể Mã thực thi biết đến qua tên gọi CIL (Common Intermediate Language – Ngôn ngữ trung gian chung), hay MSIL (Microsoft Intermediate Language – Ngơn ngữ trung gian Microsoft); ngơn ngữ kiểu assembler đóng gói file EXE DLL Các file thuộc dạng file thực thi thơng thường, chúng cần trình biên dịch JIT (Just-inTime) mơi trường thực thi để chuyển đối IL chứa sang dạng mã lệnh cụ thể máy ứng dụng thực thực thi Quá trình biên dịch, thực thi chương trình NET framework tóm tắt sau: - Chương trình nguồn trước hết biên dịch đóng gói thành khối gọi assembly Khối chứa mã lệnh ngôn ngữ trung gian metadata mô tả thông tin cần thiết cho hoạt động khối - Mỗi có yêu cầu thực thi assembly nói trên, CLR chuyển đối mã lệnh ngôn ngữ trung gian assembly thành mã lệnh tương thích với CPU cụ thể trước Giáo trình Visual Studio NET thực thi Hình 1.2 – Chức CLR Như vậy, lập trình viên sử dụng ngơn ngữ để phát triển ứng dụng NET framework, miễn ngơn ngữ có hỗ trợ NET framework Điều đặc biệt là, sử dụng chung hệ thống kiểu liệu, nên tính liên thơng ngơn ngữ NET framework cao 1.2.2 Hệ thống kiểu liệu chung CTS (Common Type System) CTS cung cấp tập sở kiểu liệu cho ngơn ngữ hoạt động NET platform Ngồi ra, đặc tả cách khai báo tạo kiểu liệu tùy biến, cách quản lý vòng đời thể kiểu liệu Hình mô tả cách tổ chức CTS NET Giáo trình Visual Studio NET Hình 1.3 – Các kiểu liệu sở CTS Mọi kiểu liệu NET kế thừa từ kiểu liệu System.Object Các kiểu liệu chia làm hai loại: kiểu tham chiếu kiểu giá trị Kiểu liệu tham chiếu xử lý vùng nhớ đặc biệt gọi heap thông qua trỏ Kiểu liệu giá trị tham chiếu trực tiếp stack chương trình 1.2.3 Assemblies Tất mã quản lý thực thi NET phải chứa assembly Một assembly xem file EXE DLL Một asembly chứa tập hợp gồm hay nhiều file chứa phần mã lệnh tài nguyên (như ảnh liệu XML) Một assembly tạo trình biên dịch tương thích với NET chuyển file chứa mã nguồn thành file DLL EXE Như minh họa hình 1.4, assembly chứa manifest, metadata, ngơn ngữ trung gian sinh trình biên dịch cụ thể Manifest: Mỗi assembly phải có file chứa manifest Manifest tập hợp bảng chứa metadata liệt kê tên tất file assembly, tham chiếu đến assembly bên ngồi, thơng tin tên, phiên để định danh assembly Một số assembly cịn có chữ ký điện tử (unique digital signature) Khi assembly nạp, nhiệm vụ CLR mở file chứa manifest để định danh thành viên có assembly Metadata: Ngồi bảng manifest vừa định nghĩa, trình biên dịch C# cịn sinh bảng định nghĩa bảng tham chiếu Bảng định nghĩa cung cấp ghi đầy đủ Giáo trình Visual Studio NET kiểu chứa IL Ví dụ, có bảng định nghĩa kiểu, phương thức, trường liệu, tham số, thuộc tính Bảng tham chiếu chứa thông tin tất tham chiếu kiểu assembly khác Trình biên dịch JIT phụ thuộc vào bảng để chuyển IL sang mã máy IL: Vai trò IL đề cập trước Trước CLS sử dụng IL, phải đóng gói vào assembly dạng DLL EXE Assembly dạng EXE phải có điểm nhập (entry point) để thực thi Ngược lại, Assembly dạng DLL, thiết kế để hoạt động thư viện mã lệnh nắm giữ định nghĩa kiểu Hình 1.4 – Assembly gồm file Assembly không cách logic để đóng gói mã thực thi Nó quy định mơ hình chủ yếu NET để triển khai mã lệnh, quản lý phiên bản, bảo mật - Tất mã quản lý, cho dù chương trình đơn, điều khiển, hay thư viện DLL chứa kiểu liệu tái sử dụng, đóng gói vào assembly Đây khối triển khai hệ thống Khi ứng dụng bắt đầu, assembly yêu cầu cho việc khởi tạo cần diện Các assembly khác nạp có yêu cầu Các nhà phát triển phân ứng dụng thành assembly dựa theo mức độ thường xuyên sử dụng - Trong giới NET, assembly quy định biên giới phiên Trường Version Number manifest áp dụng cho tất kiểu tài nguyên assembly Vì vậy, file tạo nên assembly xem đơn vị đơn có phiên - Một assembly thiết lập biên giới bảo mật để định quyền hạn truy xuất Giáo trình Visual Studio NET C# sử dụng bổ từ truy cập để điều khiển cách mà kiểu thành phần kiểu assembly truy xuất Hai số sử dụng assembly, public – cho phép truy xuất tùy ý từ assembly ; internal – giới hạn truy xuất đến kiểu thành viên bên assembly Như đề cập trên, assembly chứa nhiều file Những file không giới hạn module mã lệnh mà file tài nguyên file hình ảnh văn Một cách sử dụng tính chất thực tế tạo ứng dụng đa ngơn ngữ, ứng dụng sử dụng chung module logic, phần giao diện tài nguyên khác triển khai riêng thành file độc lập Khơng có giới hạn số lượng file assembly Hình 1.5 minh họa bố cục assembly chứa nhiều file Hình 1.5 - Assembly chứa nhiều file Trong minh họa assembly chứa nhiều file, manifest assembly chứa thông tin để định danh file sử dụng assembly Mặc dù hầu hết assembly chứa file Sau thuận lợi assembly chứa nhiều file: - Có thể tổ hợp module tạo từ nhiều ngơn ngữ lập trình khác - Các module mã lệnh phân để tối ưu cách mà mã lệnh nạp vào CLR Các mã lệnh có liên quan sử dụng thường xuyên nên đặt vào module; mã lệnh sử dụng đặt vào module khác CLR không nạp module chưa thực cần thiết Giáo trình Visual Studio NET - Các file tài nguyên đặt vào module riêng nó, qua cho phép nhiều ứng dụng chia sẻ tài nguyên dùng chung 1.2.4 Private Assembly Shared Assembly Các assembly triển khai theo hai dạng: private assembly global assembly Private assembly assembly đặt thư mục ứng dụng thư mục Q trình cài đặt cập nhật private assembly đơn giản chép assembly vào thư mục cần thiết, không cần thiết lập thông tin registry Đơi khi, dùng thêm file cấu hình ứng dụng ghi đè số thiết lập manifest ứng dụng Shared assembly assembly cài đặt vào vị trí tồn cục, gọi Global Assembly Cache (GAC), nơi truy xuất từ nhiều ứng dụng Điểm quan trọng GAC cho phép nhiều phiên assembly thực thi Để hỗ trợ điều này, NET khắc phục vấn đề xung đột tên cách sử dụng thuộc tính để định danh assembly, bao gồm: Assembly Name (tên assembly), Culture Identity (định danh văn hóa), Version (phiên bản), Public Key Token (dấu hiệu mã khóa cơng khai) Các shared assembly thường đặt thư mục assembly thư mục hệ thống hệ điều hành (WINNT\ Windows 2000, WINDOWS\ Windows XP) Như mơ tả hình 1.6, assembly liệt kê theo định dạng đặc biệt để hiển thị thuộc tính chúng (.NET Framework bao gồm file DLL để mở rộng Windows Explorer cho phép hiển thị nội dung GAC) - Assembly Name: gọi tên thường gọi, tên file assembly không chứa phần mở rộng - Version: Mỗi assembly có số hiệu phiên để dùng cho tất file assembly Nó chứa số theo định dạng: Thông thường số cập nhật cho lần thay đổi mang tính phá vỡ tính tương thích ngược Một số hiệu phiên gán cho assembly cách đính thuộc tính AssemblyVersion phần mã nguồn assembly - Culture Setting: Nội dung assembly kết hợp với văn hóa hay ngơn ngữ cụ thể Thiết lập định mã hai ký tự kiểu “en” cho English, “vi” cho Vietnam, gán với thuộc tính Giáo trình Visual Studio NET AssemblyCulture đặt mã nguồn assembly [ assembl y: Assembl yCul t ur e ( " f r - CA" ) ] - Public Key Token: Để đảm bảo shared assembly đáng tin cậy, NET yêu cầu người tạo assembly phải đánh dấu định danh mạnh Quá trình gọi ký, yêu cầu sử dụng cặp khóa cơng khai/riêng tư Khi trình biên dịch xây dựng assembly, sử dụng khóa riêng tư để sinh định danh mạnh Token sinh byte cuối phép băm (hashing) khóa cơng khai Token đặt manifest assembly client có tham chiếu đến shared assembly sử dụng để định danh assembly trình thực thi Một assembly gán cặp khóa cơng khai/riêng gọi assembly định danh mạnh Mọi assembly phải có định danh mạnh Giáo trình Visual Studio NET Hình 1.6 – Thư mục Global Assembly hệ thống Windows XP 1.2.5 Tiền biên dịch Assembly Sau assembly nạp vào CLR, IL phải biên dịch sang thành mã máy trước thực thực thi .NET Framework có cung cập cơng cụ gọi Ngen (Native Image Generator), dùng để biên dịch assembly thành “native image” lưu native image cache – vùng dành riêng GAC Mỗi CLR nạp assembly, kiểm tra cache xem có native image tương ứng chưa; có nạp mã biên dịch không cần biên dịch thêm lần Đây tính mà khai thác hợp lý tận dụng để cải thiện hiệu 1.2.6 Kiểm chứng mã lệnh (Code Verification) Như phần trình biên dịch JIT, CLR thực hai loại kiểm chứng: kiểm Giáo trình Visual Studio NET 10 {sql[0] = "select masach,nhande,tacgia,nxb,soluong from sach where nhande like @maloai or tacgia like @maloai"; sql[1] = "%" + ma + "%"; } return sql; } protected void Page_Load(object sender, EventArgs e) { string[] ma = new string[2] { "",""}; ma= GetSql(); if (ma[0] != "" && ma[0] != null) { string cnstr = WebConfigurationManager.ConnectionStrings["thuvien"].ConnectionString; DuaDulieuVaoDieuKhien dl = new DuaDulieuVaoDieuKhien(cnstr); dl.CommandText = ma[0]; dl.ParameterCollection = new string[1] { "@maloai" }; dl.ValueCollection = new string[1] { ma[1] }; dl.KhoiTao(); //Hiển thị tối đa dòng GridView, số trang hiển thị 10 dl.NapDuLieuVaoGridView(this.GridView1, 5, 10, PagerButtons.Numeric); //tạo liên kết cột số (nhan đề), truyến tham số với tên masach, giá trị tham số cột // thứ (masach) sang trang MuonSach.aspx dl.TaoLienKetTrongGridView(GridView1, "~/MuonSach.aspx?masach=", 1, 0, "Kích vào tên sách để mượn"); Giáo trình Visual Studio NET 175 //nếu người dùng chọn tên loại left.ascx if (Request.QueryString.Get("tenloai") != null) Literal1.Text = " Danh sách sách loại: " + Request.QueryString.Get("tenloai") + ""; else Literal1.Text = " Cac sach tim thay "; } else {Literal1.Text = " SINH VIÊN HÃY CHỌN LOẠI SÁCH HOẶC TÌM KIẾM SÁCH ĐỂ MƯỢN"; } } + Trên kiện PageIndexChanging ta xác định trang thứ cần hiển thị protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) { GridView1.PageIndex = e.NewPageIndex ; } 5.3.4 Xây dựng các trang WEB Theo yêu cầu ví dụ ta cần xây dựng trang WEB sau: DangNhap.asp: cho phép độc giả đăng nhập tài khoản Default.aspx (trang chủ): để độc giả chọn tìm sách để mượn Muonsach.aspx: Người dùng mượn sách ThongTinDocGia.aspx: Hiển thị tất thông tin độc giả DoiMatKhau.aspx: Độc giả thay đổi mật Tạo trang WEB: Web site | Add New Item| Gõ tên trang | Add Giáo trình Visual Studio NET 176 5.3.4.1 Tạo trang DangNhap.asp + Chọn Standard Tool Box: Tạo Literal để hiển thị thông báo đăng nhập không thành công, Tạo label để hiển thị Mã độc giả Mật Tạo TextBox để gõ mã độc giả (TxtMaDocGia) gõ mật (TxtMatKhau).Trên TxtMatKhau đặt thuộc tính: Text Mode: Pasword Tạo Button Đăng Nhập (Button1) + Trên kiện Page_Load ta tạo biến kt thuộc lớp Session để kiểm tra xem độc giả đăng nhập hay chưa Biến thuộc lớp Session quản lý phiên làm việc độc giả protected void Page_Load(object sender, EventArgs e) { Giáo trình Visual Studio NET 177 Session["kt"] = null; } + Trên kiện Click nút Đăng Nhập (Button1) ta kiểm tra xem độc giả đăng nhập hay khơng đăng nhập mở trang Default.aspx, kiện ta sử dụng phương thức KiemDangNhap lớp Docgia protected void Button1_Click(object sender, EventArgs e) { Docgia dg = new Docgia(); if (dg.KiemDangNhap(TxtMaDocGia.Text,TxtMatKhau.Text)==1) { Session["kt"] = 1; Session["UserName"] = TxtMaDocGia.Text; Response.Redirect("~/Default.aspx"); } else { Literal1.Text = " Sai Ma doc gia hoac Mat Khau "; } } + Kích chuột phải lên DangNhap.aspx cửa sổ Solution Explored | Set As Start Page: để chọn trang DangNhap làm trang chạy mặc định 5.3.4.2 Tạo trang Default.asp (trang chủ) + Chọn HTML ToolBox: Tạo Table: dịng, cột, trộn dịng đầu thành (bơi đên đầu | Kích chuột phải | Merge Cells) : + Chọn thư mục UC cửa sổ Solution Explored: Kéo Top.ascx TopMenu.ascx vào dòng Kéo Left.ascx vào (1) Kéo LietKeSach.ascx vào (2) Giáo trình Visual Studio NET 178 Kéo Right.ascx vào (3) ta giao diện sau: + Nhấn F5 để chạy thử 5.3.4.3 Tạo trang Muonsach.asp + Chọn HTML ToolBox: Tạo Table: dòng, cột: + Chọn thư mục UC cửa sổ Solution Explored: Giáo trình Visual Studio NET 179 Kéo Top.ascx TopMenu.ascx vào dòng + Tại dòng thứ bảng: Chọn Standard ToolBox tạo Label, TextBox, Literal Button giống hình + Trên kiện Page_Load ta kiểm tra xem độc giả đăng nhập chưa, đăng nhập cho mượn sách, chưa phải đăng nhập protected void Page_Load(object sender, EventArgs e) { if (Session["kt"] == null)// Độc giả chưa đăng nhập { Response.Redirect("~/DangNhap.aspx"); } else { //txtma chứa mã độc giả mã độc giả đăng nhập txtma.Text = Session["UserName"].ToString(); KiemtraMaDocGia(); // Hiển thị tên độc giả tên khoa TxtNgayMuon.Text = DateTime.Now.ToShortDateString(); //Khi độc giả chọn tên sách cần mượn, ta lấy mã sách từ //LietKesach.ascx truyền sang string ma = Request.QueryString.Get("masach"); if (ma != null && ma != "") { TxtMasach.Text = ma; KiemTrasach(); // Hiển thị tên sách, tên tác giả ButKiemTra.Enabled = false; Giáo trình Visual Studio NET 180 } } } + Hàm KiemtraMaDocGia kiểm tra xem mã độc giả nhập có khơng hàm hiển thị họ tên tên khoa độc giả void KiemtraMaDocGia() { Docgia dg = new Docgia(); string[] st = new string[2]; st = dg.GetDocGia(txtma.Text); if (st != null) { txtHoTen.Text = st[0]; TxtKhoa.Text = st[1]; } } + Hàm KiemTraSach kiểm tra xem mã sách nhập có khơng hàm hiển thị tên sách tác giả void KiemTrasach() { Literal1.Text = ""; Sach dg = new Sach(); string[] st = new string[2]; Giáo trình Visual Studio NET 181 st = dg.GetSach(TxtMasach.Text); if (st != null) { TxtTensach.Text = st[0]; TxtTacGia.Text = st[1]; } else { Literal1.Text = "Khong co ma sach nay"; } } + Khi người sử dụng không chọn tên sách cần mượn mà tự gõ mã sách ta tìm xem thử có mã sách khơng, có hiển thị tên sách tác giả: protected void ButKiemTra_Click(object sender, EventArgs e)// Nút Kiểm tra { KiemTrasach(); } + Khi độc giả chọn nút mượn kiểm tra xem độc giả cịn mượn sách thư viên không, trả hết sách cho độc giả mượn sách protected void ButMuon_Click(object sender, EventArgs e) { PhieuMuon pm = new PhieuMuon(); if ( TxtMasach.Text == "")Literal2.Text = "Ban chua nhap ma sach "; else if (pm.KiemTraMuon(txtma.Text) == 1) Giáo trình Visual Studio NET 182 { Literal2.Text = "Ban chua tra sach"; } else { if (pm.CapNhat(txtma.Text, DateTime.Now, TxtMasach.Text, 1, 1)==1) Literal2.Text = "Ban da muon sach"; else Literal2.Text = "Sach na da het thu vien"; } } 5.3.4.3 Tạo trang ThongTinDocGia.aspx + Chọn HTML ToolBox: Tạo Table: dòng, cột: + Chọn thư mục UC cửa sổ Solution Explored: Kéo Top.ascx TopMenu.ascx vào dòng + Tại dòng thứ bảng: Chọn Standard ToolBox tạo Label DataGrid: Giáo trình Visual Studio NET 183 + Trên kiện Page_Load ta kiểm tra xem độc giả đăng nhập chưa, đăng nhập cho hiển thị thơng tin, sách đặt chổ chưa lấy ta tạo liên kết để độc giả hủy đặt chổ: protected void Page_Load(object sender, EventArgs e) { if (Session["kt"] == null) { Response.Redirect("~/DangNhap.aspx"); } else { Docgia dg = new Docgia(); dg.HienThiThongTin(GridView1, Session["UserName"].ToString()); taolienket(); //Lấy mã sách cần hủy đặt chổ string masach = Request.QueryString["masach"]; if (masach != null)//độc giả chọn sách cần hủy { PhieuMuon pm = new PhieuMuon(); pm.HuyDatCho(masach); dg.HienThiThongTin(GridView1, Session["UserName"].ToString()); } } } void taolienket() { foreach (GridViewRow rows in GridView1.Rows) { HyperLink hyperLink = new HyperLink(); hyperLink.Text = rows.Cells[3].Text; if (Int16.Parse(rows.Cells[6].Text) == 1) { hyperLink.NavigateUrl = "ThongTinDocGia.aspx?masach=" + rows.Cells[3].Text; hyperLink.ToolTip = "Chọn tên sách để hủy"; } rows.Cells[3].Controls.Add(hyperLink); } } Trong đó: phương thức taolienket() để tìm xem GridView có dịng có Giáo trình Visual Studio NET 184 trangthai=1 hay khơng, có tạo liên kết trường masach void taolienket() { foreach (GridViewRow rows in GridView1.Rows) { HyperLink hyperLink = new HyperLink(); hyperLink.Text = rows.Cells[3].Text; if (Int16.Parse(rows.Cells[6].Text) == 1) { hyperLink.NavigateUrl = "ThongTinDocGia.aspx?masach=" + rows.Cells[3].Text; hyperLink.ToolTip = "Chọn tên sách để hủy"; } rows.Cells[3].Controls.Add(hyperLink); } } 5.3.4.4 Tạo trang DoiMatKhau.aspx Chọn Standard ToolBox tạo Label , TextBox Literal sau: + Mã độc giả UserName độc giả đăng nhập protected void Page_Load(object sender, EventArgs e) { TxtMaDocGia.Text = Session["UserName"].ToString(); } + Khi độc giả chọn Button Đổi mật Khẩu kiểm tra xem mã độc giả nhập có khơng, mật có trùng hay khơng, cho thay đổi protected void Button1_Click(object sender, EventArgs e) Giáo trình Visual Studio NET 185 { Docgia dg = new Docgia(); if (TxtMatkhaumoi.Text.Equals(TxtGoLaiMatKhau.Text)) { if(dg.DoiMatKhau(TxtMaDocGia.Text,TxtMatKhaucu.Text,TxtMatkhaumoi.Text)==1) Literal1.Text = "Doi mat khau cong"; else Literal1.Text = "Ma doc gia hoac mat khau cu nhap sai"; } else Literal1.Text="Mat khau khong khop nhau"; } 5.3.5 Yêu cầu bổ sung: + Với ví dụ tập trung vào việc đặt trước chổ để mượn sách, chưa quan tâm đến chức người quản thư + Yêu cầu bổ sung, tạo trang thực công việc sau: - Để người quản thư đăng nhập tài khoản - Để người quản thư cho mượn sách (căn vào độc giả đặt chổ trước) - Hiển thị thông tin độc giả mượn hạn - Để độc giả trả sách PHỤ LỤC LỤC Bảng tương quan/chuyển đổi kiểu liệu NET Framework với Data Provider NET Framework System.Data.DbType type Giáo trình Visual Studio NET SqlDbType OleDbType OdbcType OracleType 186 .NET Framework System.Data.DbType type SqlDbType OleDbType OdbcType OracleType bool Boolean Bit Boolean Bit Byte byte Byte TinyInt UnsignedTinyInt TinyInt Byte byte[] Binary VarBinary Việc VarBinary chuyển đổi ngầm định không mảng byte lớn kích thước tối đa VarBinary (8000 bytes) Binary Raw Không hỗ trợ Char Char Byte char DateTime DateTime DateTime DBTimeStamp DateTime DateTime Decimal Decimal Decimal Decimal Numeric Number double Double Float Double Double Double float Single Real Single Real Float Guid Guid UniqueIdentifier Guid UniqueIdentifier Raw Int16 Int16 SmallInt SmallInt SmallInt Int16 Int32 Int32 Int Int Int Int32 Int64 Int64 BigInt BigInt BigInt Number object Object Variant Variant Khơng hỗ trợ Blob Giáo trình Visual Studio NET 187 .NET Framework System.Data.DbType type SqlDbType OleDbType OdbcType OracleType string String NVarChar VarWChar Chuyển đổi ngầm định không string lớn kích thước tối đa NVarChar (4000 ký tự) NVarChar NVarChar TimeSpan Time Không hỗ trợ DBTime Time DateTime UInt16 UInt16 Không hỗ trợ UnsignedSmallInt Int UInt16 UInt32 UInt32 Không hỗ trợ UnsignedInt BigInt UInt32 UInt64 UInt64 Không hỗ trợ UnsignedBigInt Numeric Number AnsiString VarChar VarChar VarChar VarChar AnsiStringFixedLength Char Char Char Char Currency Money Currency Không hỗ trợ Number Date Không hỗ trợ DBDate Date DateTime SByte Không hỗ trợ TinyInt Không hỗ trợ SByte StringFixedLength NChar WChar NChar NChar Time Không hỗ trợ DBTime Time DateTime VarNumeric Không hỗ trợ VarNumeric Không hỗ trợ Number Giáo trình Visual Studio NET 188 TÀI LIỆU THAM KHẢO KHẢO (1) Stephen C Perry, Core C# and NET, Prentice Hall PTR, 2005 (2) Phạm Hữu Khang, C# 2005, Tập Lập trình ASP.NET 2.0, 4: Đối tượng ADO.NET XML, Nhà xuất Lao Động Xã Hội (3) Microsoft Corporation, MSDN 2005 Giáo trình Visual Studio NET 189