int i;
ResponsẹWrite(@"<b><u>Danh sách các biến trong đối tượng Application</u></b><br>");
for (i = 0; i <= Application.Count() - 1; i++) { ResponsẹWrite(Application.Keys(i) + " : "); ResponsẹWrite(Application(i) + "<br />"); } 5.5. Cookies 5.5.1. Giới thiệu
Có lẽ bạn cũng đã từng đăng ký là một thành viên của một trang web hay một forum nào đó, và chắc cũng không ít lần ngạc nhiên khi bạn vừa yêu cầu đến một trang
KHOA CÔNG NGHỆ THÔNG TIN 133 web hay forum mà bạn đã đăng ký trước đó, trang web nhận ngay ra, bạn chính là thành viên của họ và gởi ngay lời chào đến bạn, chẳng hạn: Chào Nguyễn Đăng.
Làm sao mà Web Server nhận ra được mình nhỉ? Mình đã đăng ký từ ngày hôm qua kia mà? Không đâu xa cả, những thông tin đó được lưu ngay chính tại máy của bạn. Những thông tin được Web Server lưu tại máy Client được gọi là Cookies.
Không giống như đối tượng Session, đối tượng Cookies cũng được dùng để lưu trữ thông tin của người dùng, tuy nhiên, thông tin này được lưu ngay tại máy gởi yêu cầu đến Web Server.
Có thể xem một Cookie như một tập tin (với kích thước khá nhỏ) được Web Server lưu tại máy của người dùng. Mỗi lần có yêu cầu đến Web Server, những thông tin của Cookies cũng sẽ được gởi theo về Server.
Hình 5-2 Mô hình làm việc của Cookies 5.5.2. Làm việc với Cookies
Thêm Cookies
ResponsẹCookies.Ađ(<HttpCookie>) Ví dụ:
HttpCookie cookTen_dn = new HttpCookie("Ten_dang_nhap"); cookTen_dn.Value = txtTen_dang_nhap.Text;
cookTen_dn.Expires = DateTimẹTodaỵAđDays(1); ResponsẹCookies.Ađ(cookTen_dn);
Trong ví dụ trên, chúng ta đã tạo ra Cookies có tên là Ten_dang_nhap lưu trữ tên đăng nhập của người dùng. Thông tin này sẽ được lưu trữ trên Cookies 1 ngày kể từ ngày hiện hành trên Web Server.
KHOA CÔNG NGHỆ THÔNG TIN 134 Dim <biến Cookie> As HttpCookie
<biến Cookie> = Request.Cookies(<Tên Cookies>) <biến Cookie>.Value ' -> Giá trị của Cookies
Trong trường hợp Cookies chưa được lưu hoặc đã hết thời hạn duy trì tại Client, giá trị nhận được là Nothing.
5.6. Global.asax
Tập tin Global.asax được dùng để:
* Khai báo và khởi tạo giá trị cho các biến Application, Session. * Viết xử lý cho các sự kiện của 2 đối tượng Application và Session.
5.6.1. Cấu trúc tập tin Global.asax
<%@ Application Language="C#" %> <script runat="server">
void Application_Start(object sender, EventArgs e) {
// Code that runs on application startup Application["So_luot_truy_cap"] = 0; Application["So_nguoi_online"] = 0; }
void Application_End(object sender, EventArgs e) {
// Code that runs on application shutdown Application.Lock();
Application["So_nguoi_online"] =
Convert.ToInt32(Application["So_nguoi_online"]) - 1; Application.UnLock();
}
KHOA CÔNG NGHỆ THÔNG TIN 135 {
// Code that runs when an unhandled error occurs ResponsẹRedirect("Errors.aspx");
}
void Session_Start(object sender, EventArgs e) {
// Code that runs when a new session is started Session.Timeout = 10; //10 minute timerout Application["So_luot_truy_cap"]=Convert.ToInt32(Application["So_luot_truy_cap" ]) + 1; Application["So_nguoi_online"]=Convert.ToInt32(Application["So_nguoi_online"]) + 1; }
void Session_End(object sender, EventArgs e) { Application.Lock(); Application["So_nguoi_online"] = Convert.ToInt32(Application["So_nguoi_online"]) - 1; Application.UnLock(); } </script>
5.6.2. Các sự kiện trong tập tin Global.asax
Application_Start: Chỉ xảy ra một lần đầu tiên khi bất kỳ trang nào trong ứng dụng được gọị
void Application_Start(object sender, EventArgs e) {
KHOA CÔNG NGHỆ THÔNG TIN 136 // Code that runs on application startup
Application["So_luot_truy_cap"] = 0; Application["So_nguoi_online"] = 0; }
Session_Start: Xảy ra khi có một người dùng mới yêu cầu đến bất kỳ trang aspx của ứng dụng.
Khi Session_Start xảy ra, một giá trị duy nhất (SessionID) sẽ được tạo cho người dùng, và giá trị này được sử dụng để quản lý người dùng trong quá trình làm việc với ứng dụng.
void Session_Start(object sender, EventArgs e) {
// Code that runs when a new session is started Session.Timeout = 10; //20 minute timerout
Application["So_luot_truy_cap"]=Convert.ToInt32(Application["So_luot_truy_cap" ]) + 1;
Application["So_nguoi_online"]=Convert.ToInt32(Application["So_nguoi_online"]) + 1;
}
Application_BeginRequest: Xảy ra khi mỗi khi có Postback về Server. Sub Application_Error: Xảy ra khi có lỗi phát sinh trong quá trình thi hành.
Session_End: Xảy ra khi phiên làm việc không có gởi yêu cầu hoặc làm tươi trang aspx của ứng dụng web trong một khoảng thời gian (mặc định là 20 phút).
void Session_End(object sender, EventArgs e) {
Application.Lock();
Application["So_nguoi_online"] =
KHOA CÔNG NGHỆ THÔNG TIN 137 Application.UnLock();
}
Application_End: Xảy ra khi dừng hoạt động của WebServer.
Ví dụ xử lý ghi nhận thông tin Số lượt truy cập vào cơ sở dữ liệu (nếu cần).
5.7. Web.config
5.7.1 Cấu trúc tập tin web.config
Web.config là một tập tin văn bản được sử dụng để lưu trữ thông tin cấu hình của một ứng dụng, được tự động tạo ra khi chúng ta tạo mới ứng dụng web. Tập tin web.config được viết theo định dạng XML.
Web.config được tạo kế thừa các giá trị từ tập tin Windows\Microsoft. NET\Framework\[Framework Version]\CONFIG\machinẹconfig
Tập tin cấu hình ứng dụng Web.config:
<?xml version="1.0"?>
<!-- For more information on how to configure your ASP.NET application, please visit http://gọmicrosoft.com/fwlink/?LinkId=169433 --> <configuration> <connectionStrings> <ađ name="qlkhachhang" connectionString="server=.;database=QLSV;integrated security=sspi" providerName="System.DatạSqlClient"/> </connectionStrings> <system.web>
<compilation debug="true" targetFramework="4.0"/> <authentication mode="Forms">
<forms loginUrl="~/Account/Login.aspx" timeout="2880"/> </authentication>
KHOA CÔNG NGHỆ THÔNG TIN 138 <providers> <clear/> <ađ name="AspNetSqlMembershipProvider" type="System.Web.SecuritỵSqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/"/> </providers> </membership> <profile> <providers> <clear/> <ađ name="AspNetSqlProfileProvider" type="System.Web.ProfilẹSqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> </providers> </profile> <roleManager enabled="false"> <providers> <clear/> <ađ name="AspNetSqlRoleProvider" type="System.Web.SecuritỵSqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/"/> <ađ name="AspNetWindowsTokenRoleProvider" type="System.Web.SecuritỵWindowsTokenRoleProvider" applicationName="/"/> </providers> </roleManager>
KHOA CÔNG NGHỆ THÔNG TIN 139 </system.web> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration> 5.7.2. Các cấu hình mặc định
* <compilation defaultLanguage="vb" debug="true"/>
defaultLanguage: qui định ngôn ngữ mặc định của ứng dụng. debug: Bật/tắt chế độ debug của ứng dụng
* <customErrors mode="RemoteOnly"/>
Đây là một cấu hình khá cần thiết cho ứng dụng Web. Hiệu chỉnh cấu hình này cho phép chúng ta quản lý việc xử lý lỗi khi có lỗi phát sinh trong ứng dụng.
Thuộc tính mode có các giá trị: RemoteOnly, On và Off.
RemoteOnly: Cho phép người dùng thấy thông báo lỗi của hệ thống hoặc trang thông báo lỗi được chỉ định qua defaultRedirect (nếu có).
Thông báo lỗi gồm: Mã lỗi và mô tả lỗi tương ứng <customErrors mode="RemoteOnly"
defaultRedirect="Error/Err.aspx"/>
On: Tùy theo giá trị của defaultRedirect mà có các trường hợp tương ứng:
* Có qui định trang thông báo lỗi qua defaultRedirect: Hiển thị trang thông báo lỗị
KHOA CÔNG NGHỆ THÔNG TIN 140
Hình 5-3 Thông báo lỗi trang
* Không có thuộc tính defaultRedirect: Hiển thị trang báo lỗi nhưng không có hiển thị mã lỗi và mô tả lỗị
Hình 5-4 Trang lỗi, không hiển thị mã lỗi
Off: Hiển thị thông báo lỗi của trang aspx (nếu xảy ra lỗi).
KHOA CÔNG NGHỆ THÔNG TIN 141 * <sessionState>
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1; Trusted_Connection=yes" cookieless="false" timeout="20" />
mode: Thuộc tính này có 3 giá trị: InProc, sqlserver (lưu trong database), và stateserver (lưu trong bộ nhớ)
stateConnectionString: Cấu hình địa chỉ và cổng (port) của máy để lưu trữ thông tin của Session trong vùng nhớ (nếu chức năng này được chọn).
sqlConnectionString: Cấu hình kết nối đến SQL Server được dùng để lưu thông tin Session (nếu chức năng này được chọn).
cookieless: Nếu giá trị của thuộc tính này = True, thông tin cookie sẽ được lưu trữ trong URL, ngược lại, nếu = False, thông tin cookies sẽ được lưu trữ tại client (nếu client có hỗ trợ)
timeout: Khoảng thời gian (tính bằng phút) mà đối tượng Session được duy trì. Sau khoảng thời gian này, đối tượng Session sẽ bị huỷ. Giá trị mặc định của thuộc tính này là 20.
5.8. Bài tập áp dụng
1. Viết chương trình đếm số người đang onlinẻ
2. Tạo tập tin .txt. Viết chương trình ghi nhận các thành viên đã truy cập website vào file và đọc số thành viên đã từng truy câp cho người dùng xem?
3. Viết chương trình đăng nhập bằng username và password lưu thông tin trên máy client để cho lần đăng nhập saụ
KHOA CÔNG NGHỆ THÔNG TIN 142
CHƯƠNG 6: XÂY DỰNG CÁC THÀNH PHẦN TRUY XUẤT DỮ LIỆU Giới thiệu: Giới thiệu về các kiến trúc công nghệ ADỌNET kết nối với cơ sở dữ liệu
Mục tiêu:
- Trình bày được các kiến trúc của cộng nghệ ADỌNET - Nhận diện được các đối tượng của ADỌNET
- Trình bày được qui trình kết nối dữ liệu - Sử dụng được các đối tượng của ADỌNET
- Xây dựng được ứng dụng Web có sử dụng cơ sở dữ liệu
Nội dung chính:
6.1. Tìm hiểu về ADỌNET
ADỌNET tương tự với ADO, điểm khác biệt chính ở chỗ ADỌNET là một kiến trúc dữ liệu rời rạc, không kết nối (Disconnected Data Architecture). Với kiến trúc này, dữ liệu được nhận về từ cơ sở dữ liệu và được lưu trên vùng nhớ cache của máy người dùng. Người dùng có thể thao tác trên dữ liệu họ nhận về và chỉ kết nối đến cơ sở dữ liệu khi họ cần thay đổi các dòng dữ liệu hay yêu cầu dữ liệu mớị
Việc kết nối không liên tục đến cơ sở dữ liệu đã đem lại nhiều thuận lợi, trong đó điểm lợi nhất là việc giảm đi một lưu lượng lớn truy cập vào cơ sở dữ liệu cùng một lúc, tiết kiệm đáng kể tài nguyên bộ nhớ. Giảm thiểu đáng kể vấn đề hàng trăm ngàn kết nối cùng truy cập vào cơ sở dữ liệu cùng một lúc.
ADỌNET kết nối vào cơ sở dữ liệu để lấy dữ liệu và kết nối trở lại để cập nhật dữ liệu khi người dùng thay đổi chúng. Hầu hết mọi ứng dụng đều sử dụng nhiều thời gian cho việc đọc và hiển thị dữ liệu, vì thế ADỌNET đã cung cấp một tập hợp con các đối tượng dữ liệu không kết nối cho các ứng dụng để người dùng có thể đọc và hiển thị chúng mà không cần kết nối vào cơ sở dữ liệụ
Các đối tượng ngắt kết nối này làm việc tương tự đối với các ứng dụng Web.
6.2. Giới thiệu
Mục tiêu chính của ADỌNET là:
o Cung cấp các lớp để thao tác dữ liệu trong cả hai môi trường là phi kết nối (Disconnected data) và kết nối (Connected data).
o Tích hợp chặt chẽ với XML (Extensible Markup Language)
o Tương tác với nhiều nguồn dữ liệu thông qua mô tả chung
KHOA CÔNG NGHỆ THÔNG TIN 143
o Làm việc trên môi trường Internet
Các lớp của ADỌNET được đặt trong Namespase là System.Data
ADỌNET bao gồm 2 provider để thao tác với các cơ sở dữ liệu là OLEDB provider (nằm trong System.DatạOLEDB) dùng để truy xuất đến bất kỳ CSDL có hỗ trợ OLEDB; SQL Provider dữ liệu (nằm trong System.DatạSQLClient) chuyên dùng để truy xuất đến CSDL SQL Server (Không qua OLE DB nên nhanh hơn).
6.3. Kiến trúc ADỌNET
ADỌNET được chia ra làm hai phần chính rõ rệt, được thể hiện qua hình
Hình 6-1 Kiến trúc ADỌNET
Từ kiến trúc ta thấy rằng ADỌNET là một phần nội tại của .NET Framework, do vậy nó có thể được sử dụng trong tất cả các ngôn ngữ hộ trợ .NET như C#, VB.Net… mà không có sự khác biệt nào (Tức là các chức năng cũng như cách sử dụng hoàn toàn giống nhau).
- ADỌNET được thiết kế để kết nối với cả dữ liệu phi kết nối trong môi trường đa tầng (Multi – Tier). Nó sử dụng XML để trao đổi dữ liệu phi kết nối do vậy dễ dàng khi giao tiếp giữa các ứng dụng không phải trên nền Windows.
- ADỌNET hỗ trợ hoàn toàn XML, nghĩa là chúng ta có thể nạp dữ liệu từ một tệp XML và thao tác như một CSDL, sau đó cũng có thể lưu kết quả ngược trở lại tệp XML do vậy có thểđi qua FireWall một cách dễ dàng.
KHOA CÔNG NGHỆ THÔNG TIN 144
6.4. Minh họa tạo kết nối cơ sở dữ liệu
Hình 6-2 Mô hình kết nối cơ sở dữ liệu
DataSet là thành phần chính cho đặc trưng kết nối không liên tục của kiến trúc ADỌNET. DataSet được thiết kế để có thể thích ứng với bất kỳ nguồn dữ liệu nàọ DataSet chứa một hay nhiều đối tượng DataTable mà nó được tạo từ tập các dòng và cột dữ liệu, cùng với khoá chính, khóa ngoại, ràng buộc và các thông tin liên quan đến đối tượng DataTable nàỵ Bản thân DataSet được dạng như một tập tin XML.
Thành phần chính thứ hai của ADỌNET chính là NET Provider Data, nó chứa các đối tượng phục vụ cho việc thao tác trên cơ sở dữ liệu được hiệu quả và nhanh chóng, nó bao gồm một tập các đối tượng Connection, Command, DataReader và
DataAdapter. Đối tượng Connection cung cấp một kết nối đến cơ sở dữ liệu, Command cung cấp một thao tác đến cơ sở dữ liệu, DataReader cho phép chỉ đọc dữ liệu và DataAdapter là cấu nối trung gian giữa DataSet và nguồn dữ liệụ
6.5. Các đối tượng trong ADỌNET
ADỌNET bao gồm nhiều đối tượng bạn có thể dùng với dữ liệụ Các đối tượng dưới đây bắt buộc bạn phải biết để làm việc với dữ liệu khi dùng ADỌNET.
SqlConnection
Để tương tác với database, bạn phải có một kết nối tới nó. Kết nối giúp xác định database server, database name, user name, password, và các tham số cần thiết để kết nối tới databasẹ Một đối tượng connection được dùng bởi đối tượng command vì thế chúng sẽ biết database nào để thực thi lệnh.
KHOA CÔNG NGHỆ THÔNG TIN 145 Quá trình tương tác với database cần phải biết hành động nào bạn muốn xảy rạ Điều này được thực hiện bởi đối tượng command. Bạn dùng đối tượng command để gửi một câu lệnh SQL tới databasẹ Một đối tượng command dùng một đối tượng connection để xác định database nào sẽ được truy xuất. Bạn có thể dùng một đối tượng command riêng lẻ để thực thi lệnh trực tiếp, hoặc để gắn một tham chiếu của đối tượng command cho một SqlDataAdapter – đối tượng giữ các command sẽ làm việc trên một nhóm dữ liệu như sẽ đề cập tới trong phần dướị
SqlDataReader
Nhiều thao tác dữ liệu đòi hỏi bạn chỉ lấy một luồng dữ liệu để đọc. Đối tượng data reader cho phép bạn lấy được kết quả của một câu lệnh SELECT từ một đối tượng command. Để tăng hiệu suất, dữ liệu trả về từ một data reader là một luồng dữ liệu fast forward-onlỵ Có nghĩa là bạn chỉ có thể lấy dữ liệu từ luồng theo một thứ tự nhất định. Mặc dù điều này có lợi về mặt tốc độ, nhưng nếu bạn cần phải thao tác dữ liệu, thì một DataSet sẽ là một đối tượng tốt hơn để làm việc.
DataSet
Đối tượng DataSet là một thể hiện của dữ liệu trong bộ nhớ. Chúng chứa nhiều đối tượng DataTable, bên trong DataTable lại có nhiều column và row, giống như các database table thông thường. Bạn thậm chí có thể định nghĩa dữ liệu giữa các table để tạo các quan hệ parent-child. DataSet được thiết kế đặc biệt để giúp quản lý dữ liệu trong bộ nhớ và để hỗ trợ các thao tác không cần kết nối (disconnected) trên dữ liệụ DataSet là một đối tượng được dùng bởi tất cả Data Provider, đó là lý do tại sao nó không có một Data Provider prefix trong tên gọị
SqlDataAdapter
Đôi lúc dữ liệu mà bạn làm việc là read-only và bạn ít khi cần thay đổi dữ liệu nguồn. Vài trường hợp cần lưu trữ tạm dữ liệu trong bộ nhớ để hạn chế truy xuất đến databasẹ Data adapter làm điều này dễ dàng bằng cách giúp bạn quản lý dữ liệu trong chế độ ngắt kết nốị Data adapter sẽ đổ vào DataSet khi đọc dữ liệu và thực hiện thay đổi dữ liệu một lượt vào databasẹ
Data adapter chứa một tham chiếu đến đối tượng connection và mở/đóng kết nối tự động khi đọc và ghi dữ liệu vào databasẹ Hơn nữa, data adapter chứa đối tượng command cho những thao tác SELECT, INSERT, UPDATE và DELETE trên dữ liệụ Bạn sẽ có một data adapter được định nghĩa cho mỗi table trong một DataSet và nó sẽ quản lý các giao tiếp với database cho bạn. Tất cả những gì bạn cần làm là chỉ cho data adapter khi nào nạp hoặc ghi vào databasẹ
KHOA CÔNG NGHỆ THÔNG TIN 146
6.6. Đối tượng Connection
Kết nối cơ sở dữ liệu SQLServer
Bạn cần nhập khẩu lớp SqlClient using System.DatạSqlClient; Khai báo và khởi tạo:
SqlConnection sqlcon;
string driver="server=localhost; UID=sa; PWD=; database=name_database"; sqlcon=new Sqlconnection();
sqlcon.ConnectionString=driver;
Driver là chuỗi kết nối đến cơ sở dữ liệu trong trường hợp này mình kết nối với sqlserver 2000/2005
Kết nối với cơ sở dữ liệu Access Bạn cận nhập khẩu lớp OleDb using System.DatạOleDb; OleDbConnection oleconn;
string driver = "Provider=Microsoft.jet.OLEDB.4.0; Data Source=duongdan_tendata";
oleconn = new OleDbConnection(); oleconn.ConnectionString = driver; Thuộc tính:
ConnectString: chứa đựng chuỗi kết nối tới cơ sở dữ liệu
Database: Chứa đựng tên cơ sở dữ liệu trong chuỗi kết nối ConnectString ở trên và bạn có thể thay đổi cơ sở dữ liệu trong lúc thực thi bằng phương thức ChangeDataBase:
Sqlconn.ChangeDatabase(“name_database_thaydoi”); Server: tên máy chủ bạn trỏ tới
Connect Timeout: số thời gian(tính bằng giây) chờ kết nối dữ liệu mặc đình là 15giây,