This document was uploaded by user and they confirmed that they have the permission to share
it. If you are author or own the copyright of this book, please report to us by using this DMCA
report form. Report DMCA
Windows 2000 Server or Advanced Server with Service Pack 2 .
•
Windows XP Professional or 64-Bit Edition
•
MDAC 2.7 for Data
•
Internet Information Services
Ghi chú: Khi tạo XML Web Sevices yêu cầu hệ thống giống như ASP.NET. Yêu cầu hệ thống cho client sử dụng XML Web Services là phải có Microsoft .NET Framework.
2 Giới thiệu về ASP.NET 2.1
ASP.NET là phiên bản kế tiếp của Active Server Page (ASP); nó là một nền phát triển ứng dụng Web hợp nhất, cung cấp nhiều dịch vụ cần thiết cho lập trình viên xây dựng các lớp ứng dụng chuyên nghiệp. Cú pháp ASP.NET tượng thích với cú pháp ASP, ngoài ra ASP.NET còn cung cấp một mô hình lập trình mới, nền tảng an toàn (secure), linh hoạt (scalable),và ổn ñịnh (stable). Sẽ cảm thấy dễ chịu khi nâng cấp ứng dụng ASP hiện có, bằng cách ñưa vào các hàm ASP.NET cho chúng (lời của MS).
2.2
ASP.NET là biên dịch, dựa trên môi trường .NET và có thể xây dựng bằng bất cứ ngôn ngữ nào tương thích .NET, bao gồm Visual Basic .NET, C#, and JScript .NET. Ngoài ra, toàn bộ thư viện .NET Framework có thể sử dụng với ứng dụng ASP.NET, lập trình viên tận dụng dễ dàng những lợi ích của các kỹ thuật ñược cung cấp, bao gồm quản lý môi trường thực thi ngôn ngữ cung (common language runtime), kiểu an toàn (type safety), kế thừa (inheritance), .v.v.
2.3
ASP.NET ñược thiết kế làm việc với các trình soạn thảo WYSIWYG HTML ñi kèm và các công cụ lập trình khác ñược ñưa vào trong Microsoft Visual .NET. Tất cả các công cụ này không phài chỉ dùng ñể phát triển ứng dụng Web ñược dễ dàng, tuy nhiên có thể sử dụng một vài chức năng thông thường cho ứng dụng Web, bao gồm một GUI cho phép lập trình viên có thể dễ dàng ñặt các server control vào trang web (web page), và một trình debug rất mạnh mẽ.
2.4
Khi tạo một ứng dụng Web lập trình viên có thể chọn Web Forms hoặc Web Services, ngoài ra cũng có thể kết hợp hai loại này với nhau theo bất kỳ cách nào. Cà hai loại này có một nền cơ bản, cho phép sử dụng authentication schemes, cache frequently used data, hoặc chỉnh sửa cấu hình ứng dụng (customize application’s configuration). Tuy nhiên mỗi loại có một vài khả năng riêng:
2.4.1
Web Forms cho phép xây dựng các form có nội dung phong phú (powerful forms) trên trang Web (Web Page). Khi xây dựng các form có thể sử dụng các server control
Created by THÁI NGỌC DUY MSDN based-written.
1 4/12/2007
ñể tạo các thành phần UI thông dụng và lập trình cho chúng một vài chức năng thông dụng, những control này cho phép xây dựng nhanh chóng các form chỉ dùng một lần (out of reusable built-in), hoặc các custom component, làm ñơn giản mã của trang web (simplifying the code of a page).
2.5
Một XML Web Service cung cấp ñiều kiện (mean) ñể truy cập các hàm ở server từ xa. Khi sử dụng Web Service, trong kinh doanh người ta có thể ñưa ra các giao diện lập trình ñược cùng với dữ liệu, hoặc kết quả kinh doanh, những cái này có thể ñược nhận, hiệu chỉnh bởi các ứng dụng client và server. Web Server cho phép trao ñổi dữ liệu theo hai kịch bản (scenarios) client-server và server-client, sử dụng chuẩn HTTP và thông diệp XML (XML messaging) ñể di chuyển dữ liệu qua tường lữa (firewall). XML Web Service có thể ñược viết bằng mọi ngôn ngữ lập trình, sử dụng mọi mô hình thành phần (component model), và có thể chạy trên bất kỳ hệ ñiều hành nào có thể truy cập XML Web Services.
2.6
Mô hình (model) Web Forms và Web Services ñều có tất cả các ñặt tính của ASP.NET, ñó là sức mạnh của .NET Framework và .NET Framework Common Lanuage Runtime. Các tính chất và cách sử dụng có thể ñược phát thảo như sau:
2.6.1
Với người ñã có kỹ năng lập trình ASP thì mô hình lập trình mới ASP.NET sẽ rất gần gũi. Tuy là như vậy nhưng ASP.NET ñã có những thay ñổi rất ñặc biệt so với ASP, ASP.NET ñã có cấu trúc hơn và hướng ñối tượng. Thật ñáng tiết, ñiều này có nghĩa là tất cả các trang ASP ñã tồn tại ñều phải ñược chỉnh sửa một vài nơi ñể có thể chạy dưới ASP.NET. Ngoài ra, Visual Basic và Visual Basic.NET ñã có một sự khác biệt rất lớn, ñiều này có nghĩa là các trang ñược viết bằng Visual Basic Scripting Edition sẽ không thể chuyển trực tiếp sang ASP.NET, cần thiết phải có một số thay ñổi nhất ñịnh ñể có thể chuyển sang ASP.NET. ðể có thêm thông tin về vấn ñề này hãy xem mục Migrating from ASP to ASP.NET trong MSDN.
2.6.2
Truy cập database là kỹ thuật thường ñược sử dụng ñể hiển thị dữ liệu trên trang Web của khách (visitor). Với ASP.NET, việc quản lý (manage) database sẽ khá dễ dàng thông qua code. ðể có nhiều thông tin hơn về vấn ñề này xin xem mục Accessing Data with ASP.NET.
2.6.3
ASP.NET cung cấp một mô hình ñơn giản ñể lập trình viên Web có thể làm việc như trên một ứng dụng thông thường. Lập trình viên có thể viết mã ngay trong file văn bản global.asax, hoặc là trong một class ñược biên dịch, ñược triễn khai như là một assembly, và có thể ñưa vào các sự kiện mức ứng dụng. Ngoài ra người lập trình còn có thể mở rộng mô hình ñể thích hợp cho nhu cầu của từng ứng dụng. ðể có nhiều thông tin hơn hãy xem mục ASP.NET Application trong MSDN.
2.6.4
ASP.NET tạo ra những chương trình dễ sử dụng và những session-state facility gần gủi với lập trình viên ASP và sẳn sàng tương thích với tất cả các giao diện lập trình .NET Framework khác (other .NET Framework APIs). ðể có nhiều thông tin hơn xin xem mục ASP.NET State Management trong MSDN.
2.6.5
ðối với những lập trình viên cao cấp, người muốn sử dụng những giao diện lập trình mạnh như giao diện ISAPI (có trong ASP), ASP.NET giới thiệu hai giao diện: IhttpHandler và IhttpModule. Cài ñặt giao diện IHttpHandler cho phép chương trình tương tác với các yêu cầu mức thấp (low-level request) và những dịch vụ hồi báo (response services) của IIS Web Services và cung cấp một vài chức năng giống với
Created by THÁI NGỌC DUY MSDN based-written.
2 4/12/2007
phần mở rộng ISAPI, nhưng với một mô hình lập trình rất ñơn giản. Cài ñặt giao diện IhttpModule cho phép lập trình viên ñưa vào những customize event riêng trong mỗi yêu cầu (request) sinh ra trong ứng dụng. ðể có nhiều thông tin hơn về vấn ñề này hãy xem mục HTTP Runtime Support.
2.6.6
ASP.NET có ñược những chất lượng thực thi ñược tìm thấy trong .NET Framework và thực thi ngôn ngữ chung (common language runtime). Ngoài ra ASP.NET ñã ñược thiết kế cho mục ñích nâng cao khả năng thực thi vượt qua ASP và tất cả các nền ứng dụng Web khác (Lời của MS).
2.6.7
Tất cả mã của ASP.NET ñều ñược biên dịch, việc này cho phép kết hợp dễ (early binding), kiễu mạnh (strong type), trình biên dịch tức thời (JIT) tương thích native code. Ngoài ra ASP.NET còn cung cấp catch mở rộng cho lập trình viên có thể tối ưu hóa ứng dụng trong một vài trường hợp.
2.6.8
Tạo ñược các câu lệnh debug (custom debug statements) cho trang web, nó rất hữu ích trong khi giãi quyết sự cố (troubleshooting).
2.6.9
Nền .NET Framework và ASP.NET cung cấp sơ ñồ (schemes) chứng nhận(authentication) và cấp phép (authorization) cho ứng dụng Web, có thể dễ dàng xóa, thêm, hiệu chỉnh sơ ñồ.
2.6.10 Cấu hình ứng dụng ASP.NET ñược lưu trữ trong các tập tin XML chuẩn, hiệu chỉnh dễ dàng , và có thể mở rộng ñể phù hợp cho nhu cầu của từng ứng dụng Web.
Created by THÁI NGỌC DUY MSDN based-written.
3 4/12/2007
3 Ứng dụng ASP.NET. Khái quát.
3.1
Một ứng dụng ASP.NET ñược ñịnh nghĩa là tất cả những tập tin, những ñiều khiển (handler), những module và mã thực thi (executable code) có thể ñược gọi từ một cây thư mục ảo (virtual directory) trên ứng dụng Web Server. Có thể sử dụng mọi mô hình lập trình ASP.NET (ASP.NET programming models) trong ứng dụng. Tất cả chúng phải cùng tồn tại trong một cấu trúc thư mục ảo riêng lẻ.
3.2 3.2.1
Tập tin Global.asax. Tập tin Global.asax, còn ñược hiểu như tập tin ứng dụng ASP.NET, là một tập tin tùy chọn chứa mã ñể ñáp ứng (responding) những sự kiện mức ứng dụng (application-level events) ñược phát ra bởi ASP.NET hoặc những module HTTP. Tập tin Global.asax ñược ñặt tại thư mục gốc (root directory) của một ứng dụng ASP.NET. Khi ứng dụng chạy (run), tập tin Global.asax ñược phân tích và biên dịch thành một lớp class .NET Framework dẫn xuất từ lớp HttpApplication. Bản thân tập tin Global.asax ñược cấu hình ñể từ chối bất kỳ yêu cầu URL trực tiếp nào; người sử dụng bên ngoài (external users) không thể download hoặc xem mã ñược viết bên trong nó.
Created by THÁI NGỌC DUY MSDN based-written.
4 4/12/2007
3.2.2
Tập tin Global.asax của ASP.NET có thể cùng tồn tại với tập tin Global.asa của ASP. Có thể tạo tập tin Global.asax bằng trình thiết kế WYSIWYG, bằng Notepad, hoặc như là một lớp ñược biên dịch thành assambly ñặt trong thư mục \bin là thư mục con của thư mục ứng dụng.
3.2.3
Tập tin Global.asax là một tùy chọn, nếu không ñịnh nghĩa tập tin Global.asax thì framework (ASP.NET page framework) sẽ xem như (assumes) không có bất kỳ một event application handler và event session handler nào ñược ñịnh nghĩa.
3.2.4
Nếu nội dung tập tin Global.asax bị thay ñổi trong lúc ứng dụng ASP.NET ñang hoạt ñộng thì ASP.NET Page Framework sẽ tự ñộng dò tìm sự thay ñổi này. Nó sẽ thực hiện xong tất cả những yêu cầu hiện tại, gởi sự kiện Application_OnEnd ñến tất cả những bộ lắng nghe (listeners), và khởi ñộng lại miền ứng dụng (application domain). Trong thực tế, ứng dụng này ñược khởi ñộng lại, ñóng tất cả những browse sesstion, xóa (flushing) tất cả những thông tin trạng thái. Khi có yêu cầu kế tiếp ñến từ browse, ASP.NET page framework sẽ phân tích và biên dịch lại tập tin Global.asax thành ñối tượng trong bộ nhớ và phát ra sự kiện Application_OnStart.
Làm việc với thực thể HttpApplication.
3.3
Trong suốt thời gian sống của ứng dụng, ASP.NET duy trùy một số thực thể Global.asax chung dẫn xuất từ lớp HttpApplication. Khi ứng dụng ASP.NET nhận một yêu cầu HTTP thì ASP.NET page framework sẽ chỉ ñịnh một trong những ñối tượng này ñể xử lý yêu cầu. Mỗi thực thể HttpApplication chịu trách nhiệm quản lý suốt thời gian sống của yêu cầu mà nó ñược chỉ ñịnh quản lý, và thực thể chỉ ñược sử dụng lại (reused) cho yêu cầu khác sau khi nó ñã xử lý xong yêu cầu hiện tại.
Lớp HttpApplication cho phép lập trình (overriding) truy xuất (access) các phương thức (method), cũng như những sự kiện Application_OnStart và Application_OnEnd. Ngoài ra, nó còn cho phép truy xuất ñến bất kỳ sự kiện nào ñược ñưa ra (exposed) bởi các module HTTP.
3.3.1
Lập trình lại (Overriding) phương thức Init và Dispose.
3.3.1.1 Phương thức HttpApplication.Init ñược gọi ngay sau khi một thực thể (instance) của lớp HttpApplication ñược tạo (sau khi tất cả các module quản lý sự kiện ñã ñược add vào). Có thể sử dụng phương thức này ñể tạo và cấu hình bất kỳ ñối tượng nào ñược sử dụng xuyên suốt (across) trong tất cả các thao tác xử lý sự kiện. Ví dụ: <script language="C#" runat="server"> public override void Init() { // ñặt các ñoạn mã thật sự cần thiết ở ñây. }
Chú ý:
<script language="C#" runat="server"> diễn tả: sử dụng ngôn ngữ C# làm ngôn ngữ script(language="C#"), nơi thực thi script là server (runat="server"). Ví dụ phía trên viết ñể ñặt vào tập tin .aspx. ðể tận dụng sức mạnh của IDE và phương pháp lập trình mới, khi lập trình ta sẽ không lập trình lại phương thức Init() trong tập tin Global.asax, thay vào ñó ta sẽ làm ngay trong lớp Global ñược dẫn xuất từ lớp HttpApplication. Các ví dụ minh họa cho việc overriding các phương thức sẽ ñược thực hiện theo phương pháp này.
Created by THÁI NGỌC DUY MSDN based-written.
5 4/12/2007
3.3.1.2 Phương thức Init không giống với sự kiện Application_OnStart, bởi ví nó luôn luôn ñược gọi trong tất cả các thực thể HttpApplication trong phạm vi một ứng dụng. Sự kiện Application_OnStart chỉ ñược phát ra một lần trong suốt cuộc sống của ứng dụng, khi thực thể (instance) HttpApplication ñầu tiên ñược tạo. Chỉ sử dụng sự kiện Application_OnStart ñể tạo và hiệu chỉnh (modify) những trạng thái (state) ñược chia sẽ bởi tất cả những thực thể pipeline, như là ñối tượng ApplicationState. Không sử dụng nó ñể tạo các biến cục bộ, bởi vì biến cục bộ không ñược chia sẽ bởi nhiều thực thể HttpApplication.Phương thức HttpApplication.Dispose ñược gọi trực tiếp trước khi một thực thể của lớp HttpApplication ñược hũy. Có thể sử dụng nó ñể xóa bất kỳ local resource nào. 3.3.1.3 Phương thức Dispose không giống với sự kiện Application_OnEnd, bởi vì nó luôn luôn ñược gọi trong tất cả các thực thể của lớp HttpApplication trong phạm vi một ứng dụng. Sự kiện Application_OnEnd chỉ ñược phát ra duy nhất một lần trong suốt cuộc sống của ứng dụng, khi thực thể cuối cùng của lớp HttpApplication ñược hũy (torn down). Chỉ sử dụng sự kiện Application_OnEnd ñể xóa những trạng thái hoặc những resource ñược chia sẽ bới tất cả các thực thể pipeline, như là ñối tượng ApplicationState. Không sử dụng nó ñể xóa các biến cục bộ, bởi vì biến cục bộ không ñược chia sẽ sử dụng bởi nhiều thực thể HttpApplication. 3.3.1.4 Không ñược sử dụng các thuộc tính Request, Response, Sesstion của thực thể HttpApplication bên trong các hàm Init và Dispose của một sự thực thi yêu cầu. 3.3.1.5 Ví dụ bên dưới chỉ ra làm thế nào ñể override hai phương thức (method) chu kỳ sống ñược cung cấp bởi lơp cơ bản HttpApplication. <script language="C#" runat=server> public override void Init() { // Init override code goes here. } public override void Dispose() { // Init override code goes here. } Chú ý:
3.3.2
Ví dụ phía trên viết ñể ñặt vào tập tin .aspx. ðể tận dụng sức mạnh của IDE và phương pháp phát triển ứng dụng Web mới, khi lập trình ta sẽ không thực hiện overriding các phương thức trong tập tin Global.asax thay vào ñó ta sẽ làm công việc này ngay trong lớp Global , là một lớp ñược dẫn xuất từ lớp HttpApplication.
Quản lý những sự kiện của thực thể HttpApplication. Có thể sử dụng tập tin Global.asax ñể xử lý bất kỳ sự kiện nào ñược ñưa ra (exposed) bởi lớp cơ bản HttpApplication. Mẫu sau ñây ñược cung cấp ñể thực hiện công việc này: Application_EventName(AppropriateEventArgumentSignature) Ví dụ: ñoạn mã sau ñây giải quyết các sự kiện OnStart, BeginRequest, và OnEnd cho một ứng dụng ASP.NET, phải ñặt ñoạn mã vào trong tập tin Global.asax, ñoạn mã trong giống như sau:
Created by THÁI NGỌC DUY MSDN based-written.
6 4/12/2007
<Script language="C#" runat="server"> public void Application_OnStart() { // Application start-up code goes here. } public void Application_BeginRequest() { // Application code for each request could go here. } public void Application_OnEnd() { // Application clean-up code goes here. } Chú ý:
3.4 3.4.1
Ví dụ phía trên viết ñể ñặt vào tập tin .aspx. ðể tận dụng sức mạnh của IDE và phương pháp phát triển ứng dụng Web mới, khi lập trình ta sẽ không thực hiện overriding các phương thức trong tập tin Global.asax thay vào ñó ta sẽ làm công việc này ngay trong lớp Global , là một lớp ñược dẫn xuất từ lớp HttpApplication.
Sử dụng các Module trong tập tin Global.asax. Khái quát. ASP.NET cung cấp những module khác nhau và riêng biệt trong mỗi yêu cầu và những sự kiện ñược ñưa ra (exposed), có thể quản lý (handle) các module này ngay trong tập tin Global.asax hoặc ngay trong một lớp ñược dẫn xuất từ lớp HttpApplication . Có thể sửa ñổi (custmize) và mở rộng các module này, hoặc thậm chí có thể tạo một module mới ñể xử lý thông tin về các yêu cầu HTTP. Ví dụ, có thể tạo một module output cache ñể cài ñặt (implements) output-caching làm việc (behaviors) cho toàn bộ ứng dụng. Tất cả các module, cả những module tự tạo và những module chuẩn ñược cung cấp bởi ASP.NET, ñều phải cài ñặt giao diện IHttpModule . Chỉ cần các module ñược ñăng ký với ứng dụng là có thể dễ dàng tương tác (interact) với các yêu cầu HTTP ñi vào ứng dụng.
3.4.2
Quản lý HTTP Module Events. Có thể sử dụng các module trong tập tin Global.asax ñể quản lý bất kỳ sự kiện nào ñược phát sinh trong các yêu cầu HTTP. Ví dụ, có thể tạo một custom authentication module cho ứng dụng Web ñịnh xây dựng, trong module có xử lý sự kiện OnAuthenticateRequest ñể chứng thực người dùng. Lệnh viết ñể ñiều khiển sự kiện phát sinh (exposed) bởi một HTTP module phải phù hợp với mẫu ñược chỉ rỏ bên dưới. FriendlyModuleName_EventName(AppropriateEventArgumentSignature) Ví dụ, nếu muốn ñưa code ñể quản lý sự kiện bắt ñầu và kết thúc của sesstion, cũng như cho sự kiện OnAuthenticateRequest, nó sẽ trong giống như bên dưới. <Script language="C#" runat="server"> void Session_OnStart() { // Session start-up code goes here. } void Session_OnEnd() {
Ví dụ phía trên viết ñể ñặt vào tập tin .aspx. ðể tận dụng sức mạnh của IDE và phương pháp phát triển ứng dụng Web mới, khi lập trình ta sẽ không thực hiện overriding các phương thức trong tập tin Global.asax thay vào ñó ta sẽ làm công việc này ngay trong lớp Global , là một lớp ñược dẫn xuất từ lớp HttpApplication.
Created by THÁI NGỌC DUY MSDN based-written.
8 4/12/2007
3.5
Tổng kết.
3.5.1
Ứng dụng ASP.NET là toàn bộ những tập tin nằm trong một hệ thống thư mục (ảo) phân cấp, và gồm tất cả các ñối tượng ñược tạo ra bởi các tập tin này.
3.5.2
Ứng dụng ASP.NET ñược quản lý bởi một lớp ñược dẫn xuất từ lớp HttpApplication. Trong lúc chạy hệ thống ASP.NET duy trì một hoặc nhiều thực thể của lớp này (ñược tạo và quản lý bởi hệ thống ASP.NET) . Có thể có nhiều yêu cầu HTTP ñược xử lý ñồng thời. Tuy nhiên, tại mỗi thời ñiểm mỗi thực thể (instance) chỉ xử lý cho một yêu cầu HTTP.
3.5.3
Có thể lập trình lại (overriding) phương thức Init() và Dispose().
3.5.4
Có thể viết mã ñể giải quyết các sự kiện mức ứng dụng (Application).
3.5.5
Có thể viết mã ñể xử lý các yêu cầu mức module (sesstion).
3.5.6
Không cần tập tin Global.asax ứng dụng ASP.NET vẫn hoạt ñộng bình thường.
3.5.7
Tập tin Global.asa vẫn có thể tồn tại ñồng thời với tập tin Global.asax.
3.5.8
Sự kiện Start() (Application_OnStart) chỉ ñược phát ra một lần duy nhất khi thực thể ñầu tiên quản lý ứng dụng ,thực thể của lớp dẫn xuất từ lớp HttpApplication, ñược tạo.
3.5.9
Sự kiện End() (Application_OnEnd) chỉ ñược phát ra duy nhất một lần khi thực thể cuối cùng quản lý ứng dụng, thực thể của lớp dẫn xuất từ lớp HttpApplication, bị hũy bỏ.
3.5.10 Phương thức Application.Init() ñược gọi mỗi lần một thực thể quản lý ứng dụng, thực thể của lớp dẫn xuất từ lớp HttpApplication ,ñược tạo ra.
3.5.11 Phương thức Application.Dispose() ñược gọi mỗi khi một thực thể quản lý ứng dụng bị hũy bỏ.
3.5.12 Mỗi khi có một yêu cầu HTTP (HTTP Request) các sử kiện sẽ xảy ra lần lượt: 3.5.12.1 BeginRequest()(Application_BeginRequest): bắt ñầu yêu câu HTTP.
3.5.12.2 AuthenticateRequest() (Application_AuthenticateRequest): chứng thực yêu cầu.
3.5.12.3 EndRequest() (Application_EndRequest): ñã xử lý xong yêu cầu. 3.5.13 Khi một client kết nối vào Server sự kiện Start() (Session_Start) sẽ phát ra. 3.5.14 Khi client ngắt kết nối với Server ngoài khoảng thời gian timeout sự kiện End()(Session_End) sẽ ñược phát ra.
3.5.15 Sự kiện Error() (Application_Error) ñược phát ra khi xuất hiện một lổi không ñược quản lý (unhandled exception).
3.6
Tham khảo lớp HttpApplication.
Created by THÁI NGỌC DUY MSDN based-written.
9 4/12/2007
3.7
Tham khảo Giao diện IHttpModule.
4 Cấu hình ASP.NET. 4.1
Khái qúat .
-
-
ðặc ñiểm hệ thống cấu hình của ASP.NET là một thành phần có thể mở rộng ñược, cho phép ñịnh nghĩa những thiết lập hệ thống khi triễn khai ứng dụng ASP.NET lần ñầu tiên, sau ñó có thể thêm, sửa lại những thiết lập cấu hình tại bất cứ thời ñiểm nào với một sự tác ñộng nhỏ trên các ứng dụng Web và các Server. Hệ thống cấu hình của ASP.NET mang lại các lợi ích sau: Thông tin cấu hình ñược lưu trữ trong tập tin XML chuẫn, cho nên, có thể sử dụng các trình soạn thảo văn bản chuẫn (notepad) hoặc các ứng dụng phân tích XML (XML Parser) ñể tạo và hiệu chỉnh nó một cách khá dễ dàng. Có nhiều tập tin cấu hình, tất cả ñều ñược ñặt tên là Web.config, có thể xuất hiện trong nhiều thư mục của một ứng dụng Server ASP.NET. Mỗi tập tin cấu hình áp dụng những thiết lập cấu hình cho thư mục chứa nó và những thư mục con bên dưới nó. Theo mặc ñịnh, những thư mục con sẽ có những thiết lập cấu hình của tập tin Web.config trong thư mục cha, tuy nhiên, những tập tin cấu hình trong thư mục con có thể bổ sung, hiệu chĩnh, và thậm chí còn có thể ñịnh nghĩa chòng những thiếg lập của tập tin cấu hình trong thư mục cha. Tập tin cấu hình mức cao nhất có tên là: C:\WINNT\Microsoft.NET\Framework\ version\CONFIG\Machine.config , nó ñược cung cấp bởi ASP.NET và thiết lập cấu hình cho toàn Web Server. Trong khi chạy, ASP.NET sử dụng thông tin cấu hình ñược cung cấp trong cấu trúc phân cấp của thư mục ảo ñể tính ra một thiết lập tổng hợp cho mỗi nguồn lực (resource) duy nhất. Chý ý, hệ thống phân cấu thư mục ở ñây là hệ thống thư mục ảo của IIS, không liên quan ñến hệ thống thư mục thường ñược quản lý bởi hệ ñiều hành. ASP.NET tự ñộng dò tìm những thay ñổi trong các tập tin thiết lập cấu hình và tự ñộng áp dụng những thiết lập cấu hình mới cho những trang Web có liên quan. Web Server không cần phải khởi ñộng lại ñể các thiết lập cấu hình mới có hiệu lực. Thiết lập cấu hình phân cấp (tổng hợp của nhiều tập tin cấu hình) tự ñộng ñược tính và lưu trữ lại bất cứ khi nào hệ thống phân cấp các tập tin cấu hình có sự thay ñổi. Chú ý, những quy tắt ở trên không ñược tính với khối <processModel> trong tập tin cấu hình. Hệ thống cấu hình của ASP.NET cho phép mở rộng, có thể thêm vào các thông số cấu hình (configuration parameters), và tạo các vùng ñiều khiểnc cấu hình (configuration section handlers) ñể xử lý chúng.
Created by THÁI NGỌC DUY MSDN based-written.
10 4/12/2007
ASP.NET bảo vệ các tập tin cấu hình từ sự truy cập từ bên ngoài bằng cách cấu hình IIS ngăn cản truy cập trực tiếp từ Browse ñến các tập tin cấu hình. Mã lỗi 403 sẽ ñược trã về cho bất kỳ sự truy cập trực tiếp nào. 4.2
ðịnh dạng của tập tin cấu hình trong ASP.NET.
-
-
Thông tin cấu hình cho nguồn lực ASP.NET (ASP.NET resource) chứa trong một tập hợp các tập tin cấu hình, mỗi tập tin ñều ñược ñặt tên là Web.config. Mỗi tập tin cấu hình chứa một hệ thống cấp bậc các tag XML và các subtag cùng với những thuộc tính chỉ ñịnh những thiết lập cấu hình. Bởi vì những tag phải có cấu trúc XML ñúng chuẫn (well-formed XML) cho nên tag, subtag, attributes phân biệt dạng chữ (case-sensitive). Tên của tag và tên của attributes phải là camelcase, ñiều này có nghĩa là ký tự ñầu tiên của tên tag phải là chử thường, và ký tự ñầu tiên của bất kỳ từ theo sau nào phải là chử hoa. Giá trị của thuộc tính phải là Pascal-case. Tất cả thông tin cấu hình ñều ñược ñặt giữa cặp and . Thông tin cấu hình giữa các tag ñược nhóm vào hai khối (area) chính: khối ñịnh nghĩa ñiều khiển cấu hình section (the configuration section handler declaration area) và khối (area) thiết lập cấu hình section (the configuration section settings area). Khối ñịnh nghĩa ñiều khiển xuất hiện tại phần ñầu của tập tin cấu hình giữa cặp tag and . Mỗi một sự ñịnh nghĩa chứa trong một tag <section> chỉ rỏ tên của một vùng (section), mỗi section cung cấp một tập hợp dữ liệu cấu hình và tên của các lớp .NET Framework xử lý dữ liệu cấu hình trong section này. Khối thiết lập cấu hình vùng (section) theo sau khối và chứa các thiết lập cấu hình thật sự. Có mỗi khối thiết lập cấu hình vùng (section) cho mỗi ñịnh nghĩa vùng (section) trong khối . Mỗi cấu hình vùng chứa các subtag, các attribute chứa các thiết lập cho vùng.
Created by THÁI NGỌC DUY MSDN based-written.
11 4/12/2007
-
Tập tin Web.config bên dưới là một ví dụ ñịnh nghĩa hai ñiều khiển cấu hình (declares two configuration section handlers). Cái thứ nhất quản lý các thiết lập cho ứng dụng, và cái còn lại quản lý trạng thái section. <section name="appSettings" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <section name="sessionState" type="System.Web.SessionState.SessionStateSectionHandler, System.Web, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" allowDefinition="MachineToApplication" /> <sessionState cookieless="true" timeout="10" />
-
-
Chỉ cần ñịnh nghĩa khối ñiều khiển cấu hình section (configuration section handler) một lần duy nhất, có thể ñặt nó trong tập tin thiết lập cấu hình toàn server Machine.config hoặc trong tập tin Web.config trong thư mục ảo chứa các tập tin của ứng dụng Web. Các tập tin cấu hình trong thư mục con sẽ tự ñộng thừa kế các ñịnh nghĩa ñiều khiển cấu hình trong thư mục cha. ðể có nhiều thông tin hơn về vấn ñề này xin xem mục Configuration Inheritance trong MSDN. Các thiết lập cấu hình ñược ñặt bên trong các tag phân nhóm section (section grouping tags). Những section tag ở mức cao (top-level section tags) thường mô tả namespace mà những thiết lập cấu hình tác dụng lên. Ví dụ, tag <system.net> mô tả những thiết lập cho những lớp mạng, và tag <system.web> mô tả những thiết lập cho những lớp ASP.NET. Ví dụ bên dưới chỉ rỏ vị trí của các tag. <sectionGroup name="system.net"> <section name="authenticationModules" type="System.Net.Configuration.NetAuthenticationModuleHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <section name="webRequestModules" type="System.Net.Configuration.WebRequestModuleHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <sectionGroup name="system.web"> <section name="authorization" type="System.Web.Configuration.AuthorizationConfigHandler, System.Web, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
5 Truy cập những thiết lập cấu hình của ASP.NET. Có thể truy cập vào những thiết lập cấu hình công cộng (public) của ASP.NET từ một ứng dụng ASP.NET bằng cách sử dụng những phương thức tỉnh nội (intrinsic static methods) ñược ñưa ra (exposed) bởi ASP.NET. Ví dụ, ñể ñọc giá trị của thuộc tính cookieless trong section <sessionState> có thể sử dụng ñoạn mã lệnh sau ñây: bool nocookies = Session.Cookieless; Những thiết lập rỏ ràng của ứng dụng (Application-specific settings) ñược lưu trữ trong section của những tập tin Web.config, có thể sử dụng tập hợp tỉnh kiểu chuỗi ConfigurationSettings.AppSettings ñể truy cập ñến nó, ví dụ: String dsn = ConfigurationSettings.AppSettings["dsn"];
6 Tạo những Configuration Sections mới. - Có thể mở rộng những thiết lập cấu hình chuẩn của ASP.NET với những tag cấu hình XML (XML configuration tags) tự ñịnh nghĩa. ðể làm công việc này, ñầu tiên phải tạo một ñiều khiển cấu hình section (configuration section handler). ðiều khiển (handler) phải là một lớp .NET Framework có cài ñặt giao diện IconfigurationSectionHandler. Những ñiều khiển section (section handler) thông dịch và xử lý (processes) những thiết lập ñã ñược ñịnh nghĩa trong các tag XML ñã ñược phân chia (portion) rỏ ràng trong tập tin Web.config, và trả về một ñối tượng cấu hình thích hợp (appropriate) dựa trên những thiết lập cấu Created by THÁI NGỌC DUY MSDN based-written.
13 4/12/2007
hình. ðối tượng cấu hình (configuration object), cái ñược trả về bởi handler class, có thể có cấu trúc dữ liệu không cố ñịnh; nó không bị giới hạn bởi những lớp cấu hình hoặc những ñịnh dạng cấu hình cơ bản. - Ví dụ bên dưới ñịnh nghĩa một giao diện IconfigurationSectionHandler. namespace System.Web.Configuration { public interface IConfigurationSectionHandler { public Object Create(Object parent, Object input, XmlNode node); }
} - Sau khi cài ñặt giao diện IconfigurationSectionHandler, phải ñịnh nghĩa một section trong tập tin Web.config như sau: <sectionGroup name="myGroup"> <sectionGroup name="nestedGroup"> <section name="mySection" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=9b35aa32c18d4fb1 /> <myGroup> <mySection>
Created by THÁI NGỌC DUY MSDN based-written.
14 4/12/2007
- Có thể ñọc giá trị của configuration section vừa ñược ñịnh nghĩa bằng ñoạn code sau: NameValueCollection config = (NameValueCollection) ConfigurationSettings.GetConfig("mygroup/nestedgroup/mysection"); Response.Write("The value of key_one is " + config["key_one"] + " ");
Response.Write("The value of key_two is " + config["key_two"] + " ");
7 Sơ ñồ thiết lập cấu hình của ASP.NET. Sơ ñồ cấu hình section (configuration section schema) chứa các ñơn vị (element) ñể ñiều khiển ứng dụng ASP.NET sẽ hoạt ñộng như thế nào. Sơ ñồ tổng quát như sau:
(Mọi người tạm xem nha, Hồi sau sẽ có tiếng việt ñầy ñủ) <system.web> <passport> <deny> <use> <customErrors> <error>
Description Chỉ ñơn vị cấu hình cao nhất cho ASP.NET configuration section. Thêm một tham chiếu ñến assembly ñược sử dụng trong suốt qúa trình biên dịch của một nguồn lực ñộng (dynamic resource) Adds an alias for a specific user agent to an internal collection of user agent aliases. Adds a reference to an assembly to use during compilation of a dynamic resource. Adds a reference to an assembly to use during compilation of a dynamic resource. 16 4/12/2007
for <protocols>
Adds a transmission protocol that the .NET Framework can use to decrypt data sent from a client browser in the HTTP request. for Adds a service description format <serviceDescriptionFormatExtensionTypes> extension to run within the scope of the configuration file. for <soapExtensionTypes>, Adds a SOAP extension to run with all <soapExtensionImporterTypes>, and XML Web services within the scope of <soapExtensionReflectorTypes> the configuration file. Allows access to a resource. Specifies ASP.NET compilation processing directives. Configures ASP.NET authentication support. Configures ASP.NET authorization support. Configures the settings for the browser capabilities component. Allows pattern matching to stop after processing the first successful match out of a number of alternatives. Removes all references to items appropriate to the parent tag. Adds aliases for specific user agents to an internal collection of user agent aliases. Contains all the compilation settings used by ASP.NET. Defines a new compiler option. Specifies the compilers that the ASP.NET application supports. Allows optional definition of name and password credentials within the configuration file. <customErrors> Defines custom error messages for an ASP.NET application and the pages that a browser is redirected to when errors occur. <deny> Specifies that access to a resource is denied. <error> Defines one custom error condition that will be handled by a custom error page. Allows multiple rules to be applied in sequence. Configures an ASP.NET application for custom forms-based authentication. Created by THÁI NGỌC DUY MSDN based-written.
17 4/12/2007
<machineKey>
<pages> <passport>
<processModel> <protocols>
for for for for
for <protocols>
Created by THÁI NGỌC DUY MSDN based-written.
Configures the globalization settings of an application. Maps incoming URL requests to IHttpHandler classes. Adds, removes, or clears HTTP modules within an application. Configures ASP.NET HTTP runtime settings. This section can be declared at the machine, site, application, or subdirectory level. Controls the application identity of the Web application. Configures keys to use for encryption and decryption of forms authentication cookie data. This section allows developers to configure a validation key that performs message authentication checks on view state data and forms authentication tickets. It can be declared at the machine, site, or application levels, but not at the subdirectory level. Identifies page-specific configuration settings. Specifies the page to redirect to if the page requires authentication and the user has not signed on with Microsoft Passport authentication. Configures the ASP.NET process model settings on Internet Information Services (IIS) Web server systems. Specifies the transmission protocols that ASP.NET can use to decrypt data sent from a client browser in the HTTP request. Removes a reference to an assembly. Removes an alias for a specific user agent from an internal collection of user agent aliases. Removes a verb/path mapping to an HttpHandler class. Removes a reference to an HttpModule class. The value of must exactly match that of a previous directive. Removes a single protocol from a specific application's list of supported HTML encoding protocols. 18 4/12/2007
for Removes a single service description <serviceDescriptionFormatExtensionTypes> format extension type from within the scope of the configuration file. The HttpCapabilitiesBase-derived class used to hold the results (key-value string pairs) from parsing this section. This string is used at run time to create the return type. <securityPolicy> Defines valid mappings of named security levels to policy files. This section can be declared at the machine, site, or application levels. <serviceDescriptionFormatExtensionTypes> Specifies the service description format extensions to run within the scope of the configuration file. <sessionState> Configures some session-state settings for the current application. <soapExtensionImporterTypes> Specifies the SOAP extensions to run when a service description for an XML Web service within the scope of the configuration file is accessed. <soapExtensionReflectorTypes> Specifies the SOAP extensions to run when a service description is generated for all XML Web services within the scope of the configuration file. <soapExtensionTypes> Specifies the SOAP extensions to run with all XML Web services within the scope of the configuration file. Configures the ASP.NET trace service. <trust> Configures the code access security permission set used to run a particular application. This section can be declared at the machine, site, and application levels. <trustLevel> Defines the mapping of specific security levels to named policy files. <use> Specifies the HTTP request strings sent to this parser. <user> Allows definition of user name and password credentials within the configuration file. <webServices> Controls the settings of XML Web services created using ASP.NET. <WsdlHelpGenerator> Specifies the .aspx Help page for an XML Web service.
Created by THÁI NGỌC DUY MSDN based-written.
19 4/12/2007
TRUY CẬP DỮ LIỆU TRONG MÔI TRƯỜNG .NET ---------------------I. Giới thiệu về ADO.NET I.1. Tổng quan về ADO.NET ADO.NET cung cấp việc truy cập các nguồn dữ liệu một cách nhất quán như SQL Server, cũng như những nguồn dữ liệu quản lý thông qua OLE DB và XML. Những ứng dụng sử dụng dữ liệu chia sẽ có thể dùng ADO.NET ñể kết nối ñến những nguồn dữ liệu này, cũng như truy xuất, thao tác và cập nhật dữ liệu. ADO.NET dễ dàng quản lý việc truy cập dữ liệu từ việc thao tác trên cơ sở dữ liệu thông qua những thành phần riêng lẽ mà có thể dùng chung hoặc dùng riêng lẽ các thành phần này. ADO.NET bao gồm các trình cung cấp dữ liệu .NET (.NET data provider) cho việc kết nối ñến cơ sở dữ liệu, thực thi một câu lệnh và truy xuất kết quả. Các kết quả này hoặc là ñược xử lý trực tiếp hoặc là ñược ñặt trong một ñối tượng ADO.NET Dataset, cho người dùng thao tác trên ñối tượng này . ðối tượng ADO.NET Dataset cũng có thể ñược sử dụng một cách ñộc lập với .NET data provider ñể quản lý dữ liệu thuộc những ứng dụng hoặc những nguồn từ XML. Lớp ADO.NET ñược tìm thấy trong namespace System.Data, và ñược tích hợp với lớp XML, lớp này ñược tìm thấy trong namespace System.Xml Connection Sự khác nhau giữa ADO.NET và ADO 1. Sự thể hiện dữ liệu . ADO dữ liệu ñược lưu trữ ở dạng recordset , còn ADO.NET lưu trữ dạng dataset .ðây là ñiểm khác biệt quan trọng nhất . 2. Số table . Một recordset như là một table , nếu recordset chứa nhiều tables thì nó phải dùng phép JOIN query kết các bảng lại, lấy dữ liệu từ các tables khác nhau tập hợp lại thành một tables ñơn . Ngược lại , dataset là một collection của một hoặc nhiều tables .Các tables bên trong một dataset có thể gọi trực tiếp từng tables thông qua ñối tượng DaTaTable . Nếu một dataset chứa nhiều tables ,nó sẽ chứa nhiều ñối tượng DataTable .Tức là ,mỗi DataTable ñiển hình tương ñương với một table hoặc là một view. Như vậy một dadaset có cấu trúc tương tự như một database. Ngoài ra , một dataset còn chứa các mối quan hệ .Một mối quan hệ của dataset tương tư như là mối quan hệ khoá ngoại của database ; tức là ,nó kết hợp các dòng của table này với table khác Ví dụ : Một dataset chứa một table về thông tin nhà ñầu tư (investors ) và một table khác lưu trữ lĩnh vực ñầu tư (purchases) . Nó có thể chứa mối quan hệ mỗi dòng investors table tương ứng mỗi dòng của purchases . Bởi vì dataset có nhiều ngăn với nhiều tables tách rời nhau và các thông tin về mối quan hệ giữa các table với nhau . Vì vậy cấu trúc dữ liệu nhiều hơn recordset và chứa các mối quan hệ trên tables với nhau . 3. Sự ảnh hưởng dữ liệu và con trỏ . Trong ADO ta có thể duyệt liên tục các dòng của recordset ta dùng phương thức ADO MoveNext .Trong ADO.NET, các dòng ñược thể hiện như một collection. Vì vậy, ta có thể sử dụng vòng lặp thông qua một table như là thông qua một collection, hoặc là truy cập trực tiếp các dòng thông qua số thứ tự hoặc khoá chính. ðối tượng DataRelation chứa thông tin chính và chi tiết của một record và cung cấp phương thức cho phép truy xuất record quan hệ với các record mà ta ñang thao tác.
Created by THÁI NGỌC DUY MSDN based-written.
20 4/12/2007
Con trỏ là một phần tử của database ñiều khiển hoạt ñộng của record ,khả năng update dữ liệu và xem xét sự chuyển ñồi dữ liệu bởi các user khác nhau .ADO.NET không có ñối tượng con trỏ vốn có,nhưng thay vào ñó nó chứa data class cung cấp các phương thức như con trỏ truyền thống. 4. Tối ưu các kết nối mở . ADO.NET thường mở một connection ñủ ñể thực thi một thao tác trên database ,ví dụ như select hoặc update sau khi thực thi select hoặc update thì connection tự ngắt ,ta có thể ñọc các dòng vào dataset và thao tác trên nó mà không cần giữ kết nối ñến data source.Trong ADO, recordset có thể cung cấp ngắt kết nối ,nhưng ADO ñược thiết kế chính cho mục ñích kết nối liên tục. Một khác biệt quan trọng việc xử lý disconnected trong ADO và ADO.NET . Trong ADO, bạn giao tiếp với cơ sở dữ liệu bằng cách thực hiện cuộc gọi ñến Ole Db Provider. Trong ADO.NET, bạn giao tiếp với cơ sở dữ liệu thông qua một DataAdapter(OleDbDataAdapter hay SqlDataAdapter), nó thực hiện việc gọi ñến Ole Db provider hay APIs (ñược cung cấp bởi nguồn dữ liệu cơ bản). Sự khác nhua quan trọng là trong ADO.NET, data adapter cho phép bạn ñiều khiển cách thay ñổi trên dataset ñược chuyển xuống cơ sở dữ liệu. 5. Chia sẻ dữ liệu giữa các ứng dụng . Việc truyền một ADO.NET Dataset giữa các ứng dụng thì dễ dàng hơn việc truyền một ADO disconnected recordset. ðể chuyển một ADO disconnected recordset từ một thành phần ñến một thành phần khác, bạn sử dụng COM marshalling. ðể truyền dữ liệu trong ADO.NET, bạn sử dụng một Dataset, nó cũng có thể chuyển một Xml stream. Việc truyền các file Xml thì thuận lợi hơn truyền COM marshalling. Nhiều kiểu dữ liệu hơn: COM marshalling giới hạn kiểu dữ liệu, chỉ các kiểu ñược ñịnh nghĩa theo chuẩn của COM. Bởi vì việc truyền của Dataset trong ADO.NET dựa trên khuôn dạng XML, vì thế không giới hạn kiểu dữ liệu Khả năng thực hiện: Việc truyền một ADO recordset lớn hay một ADO.NET dataset lớn có thể sử dụng tài nguyên mạng, như số lượng dòng dữ liệu. Cả 2 ADO và ADO.NET ñều cho phép bạn tối thiểu dữ liệu ñược truyền. Nhưng ADO.NET cung cấp một khả năng thực hiện thuận lợi hơn, trong ADO.NET không ñòi hỏi việc chuyển ñổi kiểu dữ liệu. ADO yêu cầu COM marshalling chuyển ñổi kiểu dữ liệu cho phù hợp với kiểu dữ liệu của COM. Vấn ñề bức tường lửa: Việc sử dụng ADO.NET sẽ giúp ta dễ dàng trong việc truyền dữ liệu giữa các thành phần mshelp://MS.VSCC/MS.MSDNVS/vbcon/html/vbconadopreviousversionsofad o.htm
I.1 Cấu trúc của ADO.NET I.1.1. XML và ADO.NET ADO.NET kết hợp với sức mạnh của XML ñể cung cấp truy xuất dữ liệu ngắt ñoạn. ADO.NET ñược thiết kế tay trong tay với lớp XML trong .NET Framework, cả 2 là những thành phần của một kiến trúc ñơn. ADO.NET và lớp XML của .NET Framework cùng sử dụng ñối tượng Dataset. Dataset có thể ñược nạp dữ liệu từ nguồn XML, có thể là 1 file XML hay là 1 dòng XML nào ñó.
Created by THÁI NGỌC DUY MSDN based-written.
21 4/12/2007
I.1.2. ADO.NET Component ADO.NET Components ñược thiết kế ñể quản lý việc truy cập dữ liệu từ nguồn dữ liệu. Có 2 thành phần chính trong ADO.NET: Dataset và .NET Data Provider - một tập hợp các thành phần bao gồm các ñối tượng Connection, Command, DataReader, DataAdapter. ADO.NET Dataset là thành phần chính của kiến trúc kết nối gián ñoạn của ADO.NET. Dataset ñược thiết kế một cách rõ ràng cho việc truy cập dữ liệu không phụ thuộc vào bất kỳ nguồn dữ liệu nào. Và kết quả là nó có thể sử dụng nhiều nguồn dữ liệu khác nhau. Dataset bao gồm tập hợp một hoặc nhiều ñối tượng DataTable ñược tạo thành từ nhiều dòng và nhiều cột dữ liệu, cũng như các khoá chính, khoá ngoại, các ràng buộc và các mối quan hệ của các ñối tượng DataTable. Thành phần chính khác của ADO.NET là .NET Data Provider. Thành phần này ñược thiết kế cho việc thao tác dữ liệu và chắc chắn, truy cập dữ liệu forward only, read only. ðối tượng Connection cung cấp việc kết nối ñến nguồn dữ liệu. ðối tượng command cho phép truy cập các câu lệnh cơ sở dữ liệu ñể lấy kết quả trả về, dữ liệu thay ñổi, thực thi các stored procedure, gửi hoặc nhận thông tin các tham số (parameter). DataReader cung cấp một luồng truy xuất dữ liệu nhanh từ nguồn dữ liệu. Cuối cùng DataAdapter cung cấp một cầu nối giữa ñối tượng Dataset và cơ sở dữ liệu. DataAdapter sử dụng ñối tượng Command ñể thực thi các câu lệnh SQL dưới cơ sở dữ liệu ñể load dữ liệu lên Dataset và cập nhật những thay ñổi trên Dataset xuống cơ sở dữ liệu Bạn có thể viết .NET Data Provider bằng bất kỳ nguồn dữ liệu nào. .NET Framework thông qua 2 .NET Data Provider là: SQL Server .NET Data Provider và OLE DB .NET Data Provider.
Các thành phần trong kiến trúc của ADO.NET I.1.3. Chọn lựa DataReader hay Dataset Khi quyết ñịnh ứng dụng của bạn sẽ sử dụng DataReader hay DataSet, bạn nên quan tâm ñến những chức năng mà ứng dụng của bạn yêu cầu. Bạn nên dùng Dataset khi: Tách biệt dữ liệu giữa các lớp hoặc từ một XML Wed Service Tương tác dữ liệu một cách năng ñộng như liên kết với Window Forms control hoặc kết hợp và quan hệ dữ liệu từ nhiều nguồn khác nhau. Lưu trữ dữ liệu cục bộ trong ứng dụng của bạn
Created by THÁI NGỌC DUY MSDN based-written.
22 4/12/2007
Cung cấp một cách nhìn về mối quan hệ dữ liệu XML phân tầng và sử dụng những công cụ giống như XSL Transformation hoặc một XLM Path Language (XPath) Query trên dữ liệu của bạn Thực hiện rộng rãi việc xử lý dữ liệu không yêu cầu một kết nối mở ñến nguồn dữ liệu. Thực hiện việc giải phóng kết nối ñể ñược dùng bởi các Client khác Nếu bạn không yêu cầu các chức năng ñược cung cấp bởi Dataset, bạn có thể cải thiện khả năng ứng dụng của bạn bằng cách sử dụng DataReader II. ðối tượng Dataset ðối tượng Dataset là thành phần chính ñể hổ trợ việc kết nối ngắt ñoạn, là kịch bản phân bổ dữ liệu với ADO.NET. Dataset là bộ nhớ tạm, nó là một bản sao dữ liệu mà cung cấp một mô hình lập trình quan hệ nhất quán không quan tâm ñến nguồn dữ liệu. DataSet bao gồm tập hợp các ñối tượng DataTable mả bạn có thể thiết lập mối quan hệ giữa chúng thông qua ñối tượng DataRelation. Bạn cũng có thể làm cho dữ liệu trong DataSet ñược nhất quán bằng cách sử dụng ñối tượng UniqueConstraint và ForeignKeyConstraint Mô hình ñối tuợng Dataset Mô hình ñối tuợng Dataset
Mô hình ñối tuợng Dataset Các thành phần của ñối tượng DataSet Public properties Thuộc tính Diễn tả CaseSensitive Thiết lập hay trả về một giá trị cho biết so sánh chuỗi bên trong các ñối tượng DataTable có phân biệt hoa thường hay không Container(kế thừa từ Trả về container cho thành phần MarshalByValueComponent) DataSetName Thiết lập hay trả về tên của DataSet hiện hành DefaultViewManager DesignMode EnforceConstraints
Thiết lập hay trả về namespace của DataSet Trả về một tập hợp các quan hệ liên kết các bảng(DataTable) trong DataSet và cho phép ñịnh hướng từ bảng cha ñến bảng con Trả về tập hợp bảng(DataTable) chứa bên trong DataSet
Public methods a. AcceptChanges ðồng ý tất cả những thay ñổi làm trên DataSet trước khi AcceptChanges ñược gọi. Khi AcceptChanges ñược gọi, các ñối tượng DataRow trong chế ñộ soạn thảo sẽ kết thúc việc soạn thảo. Trạng thái của DataRow cũng ñược thay ñổi. Những dòng ñã thêm vào hay ñã cập nhật thì không thay ñổi, những dòng ñã xoá sẽ bị xoá khỏi DataSet. Phương thức AcceptChanges thường ñược gọi trên một DataTable sau khi bạn thực hiện việc update DataSet sử dụng phương thức dbDataAdapter.Update
Ví dụ sau sẽ kiểm tra lỗi cho mỗi bảng. Nếu lỗi có thể bỏ qua, AcceptChanges ñược gọi, ngược lại RejectChanges ñược gọi private void AcceptOrReject(DataTable myTable) { //Nếu có lỗi thì cố gắng reconsiled if(!myTable.HasErrors) { if(Reconcile(myTable)) { // Sau khi ñã sửa tất cả các lỗi myTable.AcceptChanges(); } else { // không thể sửa tất cả các lỗi myTable.RejectChanges(); } } else // nếu không có lỗi, gọi phương thức AcceptChanges myTable.AcceptChanges(); } private bool Reconcile(DataTable thisTable) { foreach(DataRow myRow in thisTable.Rows) { //Chèn lệnh ñể cố gắng reconsile lỗi // Nếu vẫn còn lỗi
Created by THÁI NGỌC DUY MSDN based-written.
24 4/12/2007
// since the caller rejects all changes upon error. if(myRow.HasErrors) return false; } return true; } b. Clear Xoá dữ liệu của DataSet bằng cách xoá tất cả những dòng trong tất cả các bảng của DataSet Ví dụ sau xoá tất cả các dòng trong tất cả các bảng của DataSet private void ClearDataSet(DataSet myDataSet){ // In ra số dòng trong từng bảng foreach(DataTable t in myDataSet.Tables){ Console.WriteLine(t.TableName + "Rows.Count = " + t.Rows.Count.ToString()); } // Xoá tất cả các dòng của mỗi bảng myDataSet.Clear(); // In ra số dòng của mỗi bảng foreach(DataTable t in myDataSet.Tables){ Console.WriteLine(t.TableName + "Rows.Count = " + t.Rows.Count.ToString()); } } c. Clone Sao chép cấu trúc của DataSet, bao gồm tất cả các lược ñồ DataTable, các quan hệ và các ràng buộc. Không sao chép dữ liệu Ví dụ private void GetClone(DataSet myDataSet){ // Sao chép cấu trúc của DataSet DataSet cloneSet; cloneSet = myDataSet.Clone() } ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatadatasetclassclonetopic.htm d. Copy Sao chép cả cấu trúc và dữ liệu của DataSet này Ví dụ sau dùng phương thức copy ñể tạo một bản sao của DataSet private void CopyDataSet(DataSet myDataSet){ // Tạo một biến ñối tượng DataSet DataSet copyDataSet; copyDataSet = myDataSet.Copy(); } e. Dispose Giải phóng tài nguyên hệ thống sử dụng bởi MarshalByValueComponent f. Equals Xác ñịnh xem 2 thể hiện của ñối tượng có bằng nhau hay không Ví dụ sau so sánh các ñối tượng khác nhau using System; public class MyClass { public static void Main() {
Created by THÁI NGỌC DUY MSDN based-written.
25 4/12/2007
string s1 = "Tom"; string s2 = "Carol"; Console.WriteLine("Object.Equals(\"{0}\", \"{1}\") => {2}", s1, s2, Object.Equals(s1, s2)); s1 = "Tom"; s2 = "Tom"; Console.WriteLine("Object.Equals(\"{0}\", \"{1}\") => {2}", s1, s2, Object.Equals(s1, s2)); s1 = null; s2 = "Tom"; Console.WriteLine("Object.Equals(null, \"{1}\") => {2}", s1, s2, Object.Equals(s1, s2)); s1 = "Carol"; s2 = null; Console.WriteLine("Object.Equals(\"{0}\", null) => {2}", s1, s2, Object.Equals(s1, s2)); s1 = null; s2 = null; Console.WriteLine("Object.Equals(null, null) => {2}", s1, s2, Object.Equals(s1, s2)); } } /* This code produces the following output. Object.Equals("Tom", "Carol") => False Object.Equals("Tom", "Tom") => True Object.Equals(null, "Tom") => False Object.Equals("Carol", null) => False Object.Equals(null, null) => True */ g. GetChanges Trả vể một bản sao của DataSet chứa tất cả những thay ñổi ñã làm trên DataSet từ khi lần cuối nó ñược Load hay từ khi AcceptChanges ñược gọi. Ví dụ sau dùng phương thức GetChanges ñể tạo một ñối tượng DataSet thứ 2 mà sau ñó ñược dùng ñể cập nhật dữ liệu trên data source private void UpdateDataSet(DataSet myDataSet){ // ðầu tiên ta kiểm tra xem dataset có thay ñổi không với phương thức HasChanges if(!myDataSet.HasChanges(DataRowState.Modified)) return; // Tạo ra một biến DataSet tạm DataSet xDataSet; // Lấy những thay ñổi trên Dataset, chỉ những thay ñổi cập nhật(Modified) mà thôi. xDataSet = myDataSet.GetChanges(DataRowState.Modified);
Created by THÁI NGỌC DUY MSDN based-written.
26 4/12/2007
// Kiểm tra xem Dataset có lỗi không if(xDataSet.HasErrors){ // viết lệnh ñể fix lỗi } // Sau khi Dataset không còn lỗi // gọi phương thức Update của DataAdapter ñể cập nhật dữ liệu xuống Database myOleDbDataAdapter.Update(xDataSet); } h. GetXml Trả về trình bày Xml của dữ liệu ñược lưu trữ trong DataSet. Phương thức này thường ñược sử dụng chung với phương thức WriteXml. i. WriteXml Ghi dữ liệu Xml, tuỳ chọn lược ñồ từ DataSet. Ví dụ sau tạo một ñối tượng System.IO.FileStream mà ñựơc dùng ñể tạo System.Xml.XmlTextWriter. ðối tượng XmlTextWriter ñược dùng với phương thức WriteXml ñể ghi một tài liệu Xml.
private void WriteXmlToFile(DataSet thisDataSet) { if (thisDataSet == null) { return; } // Tạo ra một file ñể ghi string filename = "myXmlDoc.xml"; // Tạo một FileStream ñể ghi System.IO.FileStream myFileStream = new System.IO.FileStream (filename, System.IO.FileMode.Create); // Tạo một XmlTextWriter với FileStream System.Xml.XmlTextWriter myXmlWriter = new System.Xml.XmlTextWriter(myFileStream, System.Text.Encoding.Unicode); // Ghi xuống file với phương thức WriteXml thisDataSet.WriteXml(myXmlWriter); myXmlWriter.Close(); } j. HasChanges Trả về giá trị cho biết DataSet ñã thay ñổi chưa, bao gồm các dòng thêm mới, xoá hay cập nhật Ví dụ sau dùng phương thức GetChanges ñể tạo DataSet thứ 2, sau ñó cập nhật dữ liệu xuống nguồn dữ liệu. private void UpdateDataSet(DataSet myDataSet){ // Kiểm tra xem DataSet có thay ñổi không if(!myDataSet.HasChanges(DataRowState.Modified)) return; // Tạo một biến DataSet tạm DataSet xDataSet; // chỉ lấy những dòng ñã thay ñổi xDataSet = myDataSet.GetChanges(DataRowState.Modified); // Kiểm tra xem dataset có lỗi không if(xDataSet.HasErrors){ // Viết code fix lỗi
Created by THÁI NGỌC DUY MSDN based-written.
27 4/12/2007
} // Sau khi fix lỗi // gọi phương thức Update của DataAdapter ñể cập nhật dữ liệu từ Dataset xuống Database myOleDbDataAdapter.Update(xDataSet); } k. Merge Trộn DataSet này với một DataSet khác Ví dụ sau tạo ra một DataSet với một bảng, 2 cột và 10 dòng. Một DataTable thứ 2 ñược tạo gần như giốn hệt với DataTable thứ nhất ngoại trừ cột mới ñược thêm vào bảng. Hai dòng ñược thêm vào bảng thứ 2, sau ñó nó ñược trộn vào DataSet với tham số preserveChanges là False và tham số missingSchemaAction ñựơc thiết lập là MissingSchemaAction.Add. private void DemonstrateMergeTableAddSchema(){ // Create a DataSet with one table, two columns, and ten rows. DataSet ds = new DataSet("myDataSet"); DataTable t = new DataTable("Items"); // Add table to the DataSet ds.Tables.Add(t); // Create and add two columns to the DataTable DataColumn c1 = new DataColumn("id", Type.GetType("System.Int32"),""); c1.AutoIncrement=true; DataColumn c2 = new DataColumn("Item", Type.GetType("System.Int32"),""); t.Columns.Add(c1); t.Columns.Add(c2); // Set the primary key to the first column. t.PrimaryKey = new DataColumn[1]{ c1 }; // Add RowChanged event handler for the table. t.RowChanged+= new DataRowChangeEventHandler(Row_Changed); // Add ten rows. for(int i = 0; i <10;i++){ DataRow r=t.NewRow(); r["Item"]= i; t.Rows.Add(r); } // Accept changes. ds.AcceptChanges(); PrintValues(ds, "Original values"); // Create a second DataTable identical to the first, with // one extra column using the Clone method. DataTable t2 = t.Clone();
Created by THÁI NGỌC DUY MSDN based-written.
28 4/12/2007
t2.Columns.Add("extra", typeof(string)); // Add two rows. Note that the id column can't be the // same as existing rows in the DataSet table. DataRow newRow; newRow=t2.NewRow(); newRow["id"]= 12; newRow["Item"]=555; newRow["extra"]= "extra Column 1"; t2.Rows.Add(newRow); newRow=t2.NewRow(); newRow["id"]= 13; newRow["Item"]=665; newRow["extra"]= "extra Column 2"; t2.Rows.Add(newRow); // Merge the table into the DataSet. Console.WriteLine("Merging"); ds.Merge(t2,false,MissingSchemaAction.Add); PrintValues(ds, "Merged With Table, Schema Added"); } private void Row_Changed(object sender, DataRowChangeEventArgs e){ Console.WriteLine("Row Changed " + e.Action.ToString() + "\t" + e.Row.ItemArray[0]); } private void PrintValues(DataSet ds, string label){ Console.WriteLine("\n" + label); foreach(DataTable t in ds.Tables){ Console.WriteLine("TableName: " + t.TableName); foreach(DataRow r in t.Rows){ foreach(DataColumn c in t.Columns){ Console.Write("\t " + r[c] ); } Console.WriteLine(); } } } l. ReadXml ðọc lược ñồ Xml và ñọc dữ liệu vào DataSet. Ví dụ sau tạo ra một DataSet ñơn với một bảng, 2 cột, 10 dòng. Lược ñồ và dữ liệu của DataSet ñược ghi vô ñĩa bằng cách gọi phương thức WriteXml. Một DataSet thứ hai ñược tạo và phương thức ReadXml ñược dùng ñể ñiền lược ñồ và dữ liệu vào DataSet. private void DemonstrateReadWriteXMLDocumentWithXMLReader(){ // Create a DataSet with one table and two columns. DataSet OriginalDataSet = new DataSet("myDataSet"); OriginalDataSet.Namespace= "NetFrameWork"; DataTable myTable = new DataTable("myTable"); DataColumn c1 = new DataColumn("id", Type.GetType("System.Int32"));
Created by THÁI NGỌC DUY MSDN based-written.
29 4/12/2007
c1.AutoIncrement= true; DataColumn c2 = new DataColumn("item"); myTable.Columns.Add(c1); myTable.Columns.Add(c2); OriginalDataSet.Tables.Add(myTable); // Add ten rows. DataRow newRow; for(int i = 0; i < 10; i++){ newRow = myTable.NewRow(); newRow["item"]= "item " + i; myTable.Rows.Add(newRow); } OriginalDataSet.AcceptChanges(); // Print out values of each table in the DataSet using the // function defined below. PrintValues(OriginalDataSet, "Original DataSet"); // Write the XML schema and data to file with FileStream. string xmlFilename = "myXmlDocument.xml"; // Create FileStream System.IO.FileStream fsWriteXml = new System.IO.FileStream (xmlFilename, System.IO.FileMode.Create); // Create an XmlTextWriter to write the file. System.Xml.XmlTextWriter xmlWriter = new System.Xml.XmlTextWriter (fsWriteXml, System.Text.Encoding.Unicode); // Use WriteXml to write the document. OriginalDataSet.WriteXml(xmlWriter); // Close the FileStream. fsWriteXml.Close(); // Dispose of the original DataSet. OriginalDataSet.Dispose(); // Create a new DataSet. DataSet newDataSet = new DataSet("New DataSet"); // Read the XML document back in. // Create new FileStream to read schema with. System.IO.FileStream fsReadXml = new System.IO.FileStream (xmlFilename, System.IO.FileMode.Open); // Create an XmlTextReader to read the file. System.Xml.XmlTextReader myXmlReader = new System.Xml.XmlTextReader(fsReadXml); // Read the XML document into the DataSet. newDataSet.ReadXml(myXmlReader); // Close the XmlTextReader myXmlReader.Close(); // Print out values of each table in the DataSet using the // function defined below. PrintValues(newDataSet,"New DataSet"); } private void PrintValues(DataSet ds, string label){
Created by THÁI NGỌC DUY MSDN based-written.
30 4/12/2007
Console.WriteLine("\n" + label); foreach(DataTable t in ds.Tables){ Console.WriteLine("TableName: " + t.TableName); foreach(DataRow r in t.Rows){ foreach(DataColumn c in t.Columns){ Console.Write("\t " + r[c] ); } Console.WriteLine(); } } } m. RejectCanges Huỷ bỏ tất cả những thay ñổi trên DataSet từ khi nó ñược tạo ra, hoặc từ khi lần cuối DataSet.AcceptChanges ñược gọi. Ví dụ sau chỉ ra một lớp kế thừa từ lớp DataSet. Sự kiện RejectChanges ñược gọi bên trong hàm private void RejectChangesInDataSet(){ // Instantiate the derived DataSet. DerivedDataSet myDerivedDataSet = new DerivedDataSet(); // Insert code to change values // Invoke the RejectChanges method in the derived class. myDerivedDataSet.RejectDataSetChanges(); } // +++++++++++++++++++++++++++++++++++++++++++++++ public class DerivedDataSet:System.Data.DataSet { public void RejectDataSetChanges(){ // Invoke the RejectChangesmethod. this.RejectChanges(); } } n. Reset Thiết lập DataSet về trạng thái ban ñầu o. WriteXmlSchema Ghi cấu trúc Xml như một lược ñồ Xml Ví dụ sau tạo ra một ñối tượng System.IO.FileStream mới với ñường dẫn chỉ ra. ðối tượng FileStream ñược dùng ñể tạo một ñối tượng System.Xml.XMLTextWriter. Phương thức WriteXmlSchema ñược gọi bởi ñối tượng XmlTextWriter ñể ghi lược ñồ xuồng ñĩa private void WriteSchemaWithXmlTextWriter(DataSet thisDataSet){ // Set the file path and name. Modify this for your purposes. string filename="mySchema.xml"; // Create a FileStream object with the file path and name. System.IO.FileStream myFileStream = new System.IO.FileStream (filename,System.IO.FileMode.Create); // Create a new XmlTextWriter object with the FileStream. System.Xml.XmlTextWriter MyXmlTextWriter =
Created by THÁI NGỌC DUY MSDN based-written.
31 4/12/2007
new System.Xml.XmlTextWriter(myFileStream, System.Text.Encoding.Unicode); // Write the schema into the DataSet and close the reader. thisDataSet.WriteXmlSchema(MyXmlTextWriter ); MyXmlTextWriter.Close(); } II.1 DataTableCollection II.1.1. Khái niệm Một ADO.NET Dataset chứa một tập hợp 0 hoặc nhiều bảng trình bày bởi ñối tượng DataTable.DataTableCollection chứa tất cả các ñối tượng DataTable trong Dataset Một DataTable ñược ñịnh nghĩa trong namespace System.Data và trình bày một bảng ñơn. Nó chứa một tập hợp các cột là DataColumnCollection và các ràng buộc ñược trình bày bởi ConstraintCollection, nó ñược ñịnh nghĩa với giản ñồ của các bảng. Một DataTable cũng chứa tập hợp các dòng ñược trình bày bởi DataRowCollection, nó chứa dữ liệu trong các bảng. Cùng với trạng thái hiện tại của nó, Datarow nhớ ñược trạng thái hiện tại và trạng thái ban ñầu của nó ñể xác ñịnh những thay ñổi của nó trong những dòng. II.1.2. Thành phần của DataTable collection Public properties Property Description Lấy tổng số thành phần trong collection Count
IsReadonly(kế thừa từ InternalDataCollectionBase) IsSynchronized(kế thừa từ InternalDataCollectionBase) Item
Lấy giá trị chỉ ra liệu InternalDataCollectionBase là chỉ ñọc hay không Lấy giá trị chỉ ra liệu InternalDataCollectionBase ñược ñồng bộ hay không Lấy một ñối tượng DataTable cụ thể trong collection SyncRoot(kế thừa từ Lấy một ñối tượng mà có thể ñược dùng ñể ñồng InternalDataCollectionBase) bộ collection Public methods Method Description Add Thêm một ñối tượng DataTable vào collection AddRange Sao chép các thành phần của một mảng ñối tượng DataTable chỉ ñịnh vào cuối của collection CanRemove Kiểm tra liệu ñối tượng DataTable chỉ ñịnh có ñược xoá khỏi collection hay không Clear Xoá tất cả các ñối tượng DataTable trong collection Contains Lấy giá trị cho biết liệu một ñối tượng DataTable với tên chỉ ra có tồn tại trong collection hay không CopyTo Equals Xác ñịnh xem hai thể hiện của ñối tượng có bằng nhau không GetEnumerator(kế thừa từ Lấy một Enumerator cho collection InternalDataCollectionBase) GetHastCode(kế thừa từ Object) GetType(kế thừa từ object) Lấy kiểu của thể hiện hiện tại
Lấy chỉ số trong collection của một ñối tượng DataTable cụ thể Xoá một ñối tượng DataTable cụ thể trong collection Xoá một ñối tượng DataTable ở một vị trí cụ thể Trả về một chuỗi trình bày bởi ñối tượng hiện tại
II.1.3. ðối tượng DataTable Một Dataset ñược tạo thành từ một tập hợp các bảng, các quan hệ và các ràng buộc. Trong ADO.NET, các ñối tượng DataTable ñược dùng ñể trình bày các bảng trong DataSet. Một DataTable trình bày một bảng trong DataTableCllection Lớp DataTable là một thành phần của namespace System.Data bên trong thư viện của .NET Framework. Bạn có thể tạo và sử dụng một DataTable một cách ñộc lập hoặc như một thành phần của một Dataset, và các ñối tượng DataTable cũng có thể ñược sử dụng chung với các ñối tượng khác của .NET Framework như là DataView. Bạn có thể truy cập tập hợp các bảng trong Dataset thông qua thuộc tính Tables của ñối tượng DataSet. Lược ñồ, cấu trúc của Table ñược trình bày bởi columns và constraints. Bạn ñịnh nghĩa lược ñồ của DataTable sử dụng các ñối tượng DataColumns, ForeignKeyConstraint và UniqueConstraint. Các cột trong table có thể ánh xạ từ các cột trong nguồn dữ liệu, chứa những giá trị tính toán từ những biểu thức, các giá trị tăng tự ñộng hoặc chứa những giá trị khoá chính. Ngoài những lược ñồ, một DataTable cũng phải có những dòng, dùng ñể chứa và sắp xếp dữ liệu. Lớp DataRow trình bày dữ liệu thật ñược chứa trong bảng. Bạn sử dụng DataRow và những thuộc tính , phương thức của nó ñể truy xuất, ñịnh giá và thao tác dữ liệu trong một bảng. Như bạn truy cập và thay ñổi dữ liệu bên trong một bảng. ðối tượng DataRow giữ lại cả 2 trạng thái hiện tại và trạng thái ban ñầu. Bạn có thể tạo những mối quan hệ cha con giữa những bảng bằng cách sử dụng một hoặc nhiều cột quan hệ trong bảng. Bạn tạo một mối quan hệ giữa các ñối tượng DataTable sử dụng một DataRelation. ðối tượng DataRelation sau ñó ñược sử dụng ñể trả về những dòng quan hệ cha con của một dòng cụ thể. Class DataTable là ñối tượng chính trong thư viện ADO.NET. Các thành phần sử dụng DataTable bao gồm DataSet và DataView. Khi truy cập các ñối tượng DataTable, bạn phải chú ý ñến việc phân biệt chữ hoa chữ thường. Ví dụ nếu có một bảng tên là “mydatatable” và một bảng khác tên là “Mydatatable”. Khi tìm tên bảng, bạn phải quan tâm tới việc phân biệt này. Nếu bạn ñang tạo DataTable bằng cách lập trình, ñầu tiên bạn phải ñịnh nghĩa giản ñồ cho nó bằng cách thêm các ñối tượng DataColumnm vào collection DataColumnCollection(truy cập thông qua thuộc tính columns) ðể thêm các dòng vào DataTable, trước hết bạn phải sử dụng phương thức NewRow ñể trả về một ñối tượng DataRow mới. Phương thức NewRow trả về một dòng với giản ñồ của DataTable, giống như nó ñã ñược ñịnh nghĩa bởi DataColumnCollection của Table. Số dòng lớn nhất mà một DataTable có thể lưu trữ là 16,777,216 DataTable còn chứa một tập hợp các ñối tượng ràng buộc mà có thể ñược sử dụng ñể ñảm bảo tính nhất quán dữ liệu ðể xác ñịnh khi có những thay ñổi ñược làm trên bảng, chúng ta dùng một trong những sự kiện sau: RowChanged, RowChanging, RowDeleting, RowDeleted Các thành phần của ñối tượng DataTable Public Constructors Public properties
Created by THÁI NGỌC DUY MSDN based-written.
33 4/12/2007
Property CaseSensitive ChildRelation Columns Constraints Container(kế thừa từ MarshalByValueCompo nent) Dataset DefaulView DesignMode(kế thừa từ MarshalbyValueCompo nent) DisplayExpression ExtendedProperties HashErrors Locale MinimumCapacity Namespace ParentRelations Prefix PrimaryKey Rows Site TableName Public method Method AcceptChanges BeginInit BeginLoadData Clear Clone Compute Copy Dispose(kế thừa từ MarshalbyValueCompo nent) EndInit
Description Cho biết liệu chuỗi so sánh bên trong bảng có phân biệt chữ hoa chữ thường hay không Lấy tập hợp các quan hệ con của DataTable này Trả về tập hợp column có trong bảng này Trả về tập hợp các constraint ñược lưu giữ bởi bảng này Trả về Container của thành phần
Trả về Dataset chứa bảng này Trả về cách nhìn tuỳ chọn của bảng Lấy giá trị cho biết liệu thành phần ñang trong chế ñộ thiết kế hay không
Trả về hay thiết lập biểu thức mà sẽ trả về một giá trị dùng ñể trình bày bảng này trong giao diện người dùng Trả về tập hợp thông tin người dùng một cách tuỳ chọn Trả về giá trị cho biết có lỗi nào trong bất kỳ dòng trong bất kỳ bảng của Dataset mà chứa bảng này
Trả về hay thiết lập các không gian tên XML trình bày dữ liệu lưu trữ trong DataTable Trả về tập các quan hệ cha cho DataTable này Trả về hay thiết lập một mảng các columns mà chức năng như một primary key cho bảng dữ liệu Trả về tập hợp các dòng thuộc về bảng này Trả về hay thiết lập tên của DataTable
Description ðảm bảo tất cả những thay ñổi ñã làm trên bảng này kể từ lần cuối AcceptChanges ñược gọi Bắt ñầu khởi tạo DataTable mà ñược sử dụng trên một form hoặc ñược dùng bởi thành phần khác. Khởi tạo xảy ra lúc chạy tắt những thông báo, chỉ mục và ràng buộc trong khi load dữ liệu Xoá dữ liệu của DataTable Lấy cấu trúc của DataTable bao gồm các lược ñồ và các ràng buộc của DataTable Tính toán những giá trị cho trước trên những dòng hiện tại mà ñã ñược lọc ra Copy tất cả cấu trúc và dữ liệu của DataTable này Giải phóng tài nguyên ñược sử dụng bởi MarshalValueComponent Kết thúc việc khởi tạo DataTable mà ñược dùng trên form hoặc
Created by THÁI NGỌC DUY MSDN based-written.
34 4/12/2007
EndLoadData Equals(kế thưà từ Object) GetChanges
GetErrors GetHashCode(kế thừa từ Object) GetService(kế thừa từ MarshalByValueCompo nent) GetType(kế thừa từ Object) ImportRow LoadDataRow NewRow RejectChanges
Reset Select ToString Public Event Event ColumnChanged
ñược dùng bởi thành phần khác. Việc khởi tạo xảy ra lúc chạy Bật các thông báo, chỉ mục và các ràng buộc sau khi ñã load dữ liệu Xác ñịnh liệu 2 thể hiện của ñối tượng có bằng nhau không Trả về một bảng sao của DataTable chứa tất cả những thay ñổi làm trên nó từ khi nó ñã ñược load lần cuối hoặc từ khi AcceptChanges ñược gọi Trả về một mảng DataRow mà chứa lỗi
Trả về kiểu dữ liệu của thể hiện hiện tại Sao chép một DataRow vào một DataTable Tìm và cập nhật một trường cụ thể, nếu không tìm thấy thì một dòng mới ñược tạo ra sử dụng giá trị cho trước tạo một DataRow mới với cùng lược ñồ của bảng Quay về(huỷ bỏ) tất cả những thay ñổi mà ñã ñược làm trên bảng kể từ khi nó ñược load hoặc lần cuối AcceptChanges ñược gọi Thiết lập lại DataTable về trạng thái ban ñầu của nó Trả về một mảng ñối tượng DataRow
ColumnChanging Dispose(kế thừa từ MarshalByValueComponent) RowChanged RowChanging RowDeleted RowDeleting
Description Xảy ra khi sau khi một giá trị của DataColumn ñược thay ñổi trong DataRow Xảy ra khi một giá trị của DataColumn ñang bị thay ñổi trong DataRow
Xảy ra công Xảy ra Xảy ra Xảy ra
sau khi một DataRow ñược thay ñổi thành khi một DataRow ñang thay ñổi sau khi một dòng trong bảng ñược xoá trước khi một dòng trong table ñang ñược xoá
II.1.4. DataColumnCollection II.1.4.1. Khái niệm Trình bày một tập hợp các ñối tượng DataColumn cho DataTable. DataColumn collection ñịnh nghĩa lược ñồ cho DataTable, và xác ñịnh loại dữ liệu mả DataColumn có thể chứa. Bạn có thể truy cập DataColumnCollection thông qua thuộc tính Columns của ñối tượng DataTable. DataColumnCollection dùng phương thức Add và Remove ñể chèn và xoá các ñối tượng DataColumn. Dùng thuộc tính Count ñể xác ñịnh có bao nhiêu ñối tượng DataColumn trong collection. Dùng phương thức Constraint ñể kiểm tra ñối tượng DataColumn chỉ ra có tồn tại trong collection hay không.
Created by THÁI NGỌC DUY MSDN based-written.
35 4/12/2007
Ví dụ sau in ra các thuộc tính của mỗi cột trong collection private void PrintDataTableColumnInfo(DataTable myTable){ DataColumnCollection cols; // Use a DataTable object's DataColumnCollection. cols = myTable.Columns; // Print the ColumnName and DataType for each column. foreach(DataColumn col in cols){ Console.WriteLine(col.ColumnName); Console.WriteLine(col.DataType); } } Các thành phần của DataColumnCollection cũng giống như các thành phần của một collection khác. mshelp://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatadatacolumncollectionclasst opic.htm II.1.4.2. ðối tượng DataColumn II.1.4.2.1. Khái niệm Trình bày lược ñồ của một cột trong một DataTable. DataColumn là một khối xây dựng có qui tắc cho việc tạo ra lược ñồ cho một DataTable. Bạn xây dựng lược ñồ bằng cách thêm vào một hay nhiều ñối tượng DataColumn vào DataColumnCollection Mỗi DataColumn có một thuộc tính DataType mà xác ñịnh kiểu dữ liệu ñược lưu trữ trong DataColumn. Bạn có thể hạn chế kiểu dữ liệu integers, strings hay decimals. Bởi vì dữ liệu chứa bởi DataTable thuờng ñược trộn lại với nguồn dữ liệu ban ñầu của nó II.1.4.2.2. Các thành phần của ñối tượng DataColumn Public Properties Thuộc tính Diễn tả AllowDBName Trả về hay thiết lập giá trị cho biết liệu có cho phép một giá trị Null cho cột này hay không AutoIncrement Trả về hoặc thiết lập giá trị cột này có tự ñộng tăng hay không khi một dòng mới ñược thêm vào bảng AutoIncrementSeed Thiết lập hay trả về giá trị ñầu tiên cho một cột và thuộc tính AutoIncrement ñược thiết lập là True AutoIncrementStep Thiết lập hay trả về giá trị mỗi lần tăng Caption Thiết lập hay trả về tiêu ñề của cột ColumnMapping Thiết lập hay trả về MappingType của cột ColumnName Thiết lập hay trả về tên của cột trong DataColumnCollection Container(kế thừa từ Trả về Container của thành phần MarshalByValueComponent) DataType Thiết lập hay trả về kiểu dữ liệu lưu trữ trong cột DefaultValue Thiết lập hay trả về giá trị mặc ñịnh cho cột khi tạo ra một dòng mới DesignMode(kế thừa từ Trả về giá trị cho biết liệu thành phần ñang trong chế MarshalByValueComponent) ñộ thiết kế hay không Expression Thiết lập hay trả về biểu thức dùng ñể lọc dữ liệu, tính toán giá trị trên cột hoặc tạo một cột tính toán ExtendedProperties Trả về collection thông tin người dùng tuỳ chọn
Created by THÁI NGỌC DUY MSDN based-written.
36 4/12/2007
Maxlength Namespace Ordinal Prefix ReadOnly
Thiết lập hay trả về chiều dài tối ña của dữ liệu của cột Thiết lập hay trả về không gian tên của DataColumn Trả về vị trí của cột trong DataColumnCollection Thiết lập hay trả về giá trị cho biết dữ liệu cột là chỉ ñọc hay không Thiết lập hay trả về site của thành phần
Site(kế thừa từ MarshalByValueComponent) Table Trả về tên của bảng chứa cột Unique Thiết lập hay trả về giá trị cho biết liệu giá trị mỗi dòng của cột có là duy nhất hay không
II.1.4.2.3. Ví dụ Ví dụ sau tạo ra một DataTable với vài DataColumn private void MakeTable(DataTable myTable){ // Create a DataTable. DataTable myTable = new DataTable("myTable"); // Create a DataColumn and set various properties. DataColumn myColumn = new DataColumn(); myColumn.DataType = System.Type.GetType("System.Decimal"); myColumn.AllowDBNull = false; myColumn.Caption = "Price"; myColumn.ColumnName = "Price"; myColumn.DefaultValue = 25; // Add the column to the table. myTable.Columns.Add(myColumn); // Add 10 rows and set values. DataRow myRow; for(int i = 0; i < 10; i++){ myRow = myTable.NewRow(); myRow["Price"] = i + 1; // Be sure to add the new row to the DataRowCollection. myTable.Rows.Add(myRow); } } II.1.5. DataRowCollection II.1.5.3. Khái niệm DataRowCollection trình bày tập hợp các dòng trong DataTable. DataRowCollection là thành phần chính của DataTable. Trong khi DataColumnCollection ñịnh nghĩa lược ñồ của bảng, DataRowCollection chứa dữ liệu thật của bảng. Mỗi DataRow trong DataRowCollection trình bày một dòng ñơn. Bạn có thể gọi phương thức Add hay Remove ñể chèn hay xoá các ñối tượng DataRow từ DataRowCollection. Bạn cũng có thể gọi phương thức Find ñể tìm kiếm các ñối tượng DataRow bằng cách chỉ ra giá trị của khoá chính của dòng này II.1.5.4. ðối tượng DataRow II.1.5.4.1. Khái niệm ðối tượng DataRow trình bày một dòng dữ liệu trong DataTable. ðối tượng DataRow và DataColumn là các thành phần chính của một DataTable. Sử dụng ñối tượng DataRow và các thuộc tính, phương thức của nó ñể truy xuất và tính toán, chèn, xoá, cập nhật dữ liệu cho DataTable. DataRowCollection trình bày các ñối tượng DataRow thật sự cho DataTable. II.1.5.4.2. Các thành phần của ñối tượng DataRow Public properties
Created by THÁI NGỌC DUY MSDN based-written.
37 4/12/2007
Thuộc tính Diễn tả HasErrors Trả về giá trị cho biết liệu có lỗi trong dòng hay không Item Thiết lập hay trả về dữ liệu lưu trữ trong một cột ñặc biệt ItemArray Thiết lập hay trả về tất cả giá trị cho dòng này thông qua một mảng RowError Thiết lập hay trả về mô tả lỗi tuỳ chọn cho một dòng RowState Trả về trạng thái hiện tại của dòng Table Trả về DataTable chứa DataRow này Public methods Phương thức Diễn tả AcceptChanges ðảm bảo(xác nhận)tất cả những thay ñổi ñã làm trên dòng này từ khi lần cuối AcceptChanges ñược gọi BeginEdit Bắt ñầu thao tác soạn thảo trên ñối tượng DataRow CancelEdit Huỷ bỏ việc soạn thảo hiện tại trên dòng ClearErrors Xoá những lỗi cho dòng, bao gồm RowError và tập các lỗi SetColumnError Delete Xoá DataRow EndEdit Kết thúc việc soạn thảo trên một dòng Equals(kế thừa từ Xác ñịnh liệu hai thể hiện của ñối tượng có bằng nhau hay Object) không GetChildRows Trả về những dòng con của DataRow GetColumnError Trả về một mảng cột mà có lỗi GetHashCode(kế thừa từ Object) GetParentRow Trả về những dòng cha của DataRow GetType(kế thừa Trả về kiểu của thể hiện hiện tại từ Object) HasVersion Trả về một giá trị cho biết một phiên bản chỉ ra có tồn tại hay không IsNull Trả về một giá trị cho biết giá trị của cột có chứa giá trị null hay không RejectChanges Loại bỏ tất cả những thay ñổi ñã làm trên dòng từ jkhi AcceptChanges ñược gọi lần cuối SetColumnError Thiết lập diễn tả lỗi cho một cột SetParentRow Thiết lập dòng cha cho một DataRow ToString II.1.5.4.3. Ví dụ Ví dụ sau tạo ra một DataRow mới bằng cách gọi phương thức NewRow của ñối tượng DataTable private void CreateNewDataRow(){ // Use the MakeTable function below to create a new table. DataTable myTable; myTable = MakeNamesTable(); // Once a table has been created, use the NewRow to create a DataRow. DataRow myRow; myRow = myTable.NewRow(); // Then add the new row to the collection. myRow["fName"] = "John"; myRow["lName"] = "Smith"; myTable.Rows.Add(myRow);
Created by THÁI NGỌC DUY MSDN based-written.
38 4/12/2007
foreach(DataColumn dc in myTable.Columns) Console.WriteLine(dc.ColumnName); dataGrid1.DataSource=myTable; } private DataTable MakeNamesTable(){ // Create a new DataTable titled 'Names.' DataTable namesTable = new DataTable("Names"); // Add three column objects to the table. DataColumn idColumn = new DataColumn(); idColumn.DataType = System.Type.GetType("System.Int32"); idColumn.ColumnName = "id"; idColumn.AutoIncrement = true; namesTable.Columns.Add(idColumn); DataColumn fNameColumn = new DataColumn(); fNameColumn.DataType = System.Type.GetType("System.String"); fNameColumn.ColumnName = "Fname"; fNameColumn.DefaultValue = "Fname"; namesTable.Columns.Add(fNameColumn); DataColumn lNameColumn = new DataColumn(); lNameColumn.DataType = System.Type.GetType("System.String"); lNameColumn.ColumnName = "LName"; namesTable.Columns.Add(lNameColumn); // Create an array for DataColumn objects. DataColumn [] keys = new DataColumn [1]; keys[0] = idColumn; namesTable.PrimaryKey = keys; // Return the new DataTable. return namesTable; } II.2 DataRelationCollection II.2.1. Khái niệm Dataset lưu trữ những mối quan hệ trong ñối tượng DataRelationCollection của nó. Một mối quan hệ ñược biểu diễn bởi một ñối tượng DataRelation, kết hợp những dòng trong DataTable này với những DataTable khác Mối quan hệ (Relationship) cho phép ñiều hướng từ một bảng ñến một bảng khác bên trong Dataset. Những thành phẩn chủ yếu của DataRelation là tên của quan hệ, tên của những bảng quan hệ và những cột quan hệ trong mỗi bảng. Mối quan hệ có thể ñược xây dựng với nhiều hơn một cột cho mỗi bảng bằng cách chỉ ra một mảng các ñối tượng của DataColumn như là những cột chính.. Khi một quan hệ ñược thêm vào DataRelationCollection, nó có thể them vào một UniqueKeyConstraint và một ForeignKeyConstraint ñể ñảm bảo tính toàn vẹn dữ liệu khi có những thay ñổi giá trị trên những cột quan hệ II.2.2. ðối tượng DataRelation Một DataRelation ñược sử dụng ñể quan hệ giữa 2 ñối tượng DataTable với nhau thông qua ñối tượng DataColumn. Ví dụ trong mối quan hệ khách hàng và hoá ñơn, bảng khách hàng là cha và bảng hoá ñơn là con trong mối quan hệ. Mối quan hệ ñược tạo ra giữa những cột tương thích trong bảng cha và bảng con. ðó lả kiểu dữ liệu giữa 2 cột là duy nhất.
Created by THÁI NGỌC DUY MSDN based-written.
39 4/12/2007
Những mối quan hệ cũng có thể xếp tầng những thay ñổi khác nhau từ những dòng dữ liệu cha ñến những dòng dữ liệu con. ðể ñiều khiển cách giá trị bị thay ñổi trong nhũng dòng dữ liệu con, ta thêm vào một ForeignKeyConstraint vào ConstraintCollection của ñối tượng DataTable. ConstraintCollection hoạt ñộng khi dữ liệu trên bảng cha bị xoá hay ñược cập nhật. Khi một DataRelation ñược tạo, ñầu tiên nó kiểm tra xem mối quan hệ ñược tạo hay không. Sau khi nó ñược thêm vào DataRelationCollection. Mối quan hệ ñược duy trì bởi việc không cho phép bất kỳ sự thay ñổi nào mà vi phạm ràng buộc này. Các ñối tượng DataRelation ñược chứa trong DataRelationCollection. Bạn có thể truy cập DataRealtionCollection thông qua thuộc tính Collections của DataSet và thuộc tính ChildRelation and ParentRelation của DataTable private void CreateRelation() { // Get the DataColumn objects from two DataTable objects in a DataSet. DataColumn parentCol; DataColumn childCol; // Code to get the DataSet not shown here. parentCol = DataSet1.Tables["Customers"].Columns["CustID"]; childCol = DataSet1.Tables["Orders"].Columns["CustID"]; // Create DataRelation. DataRelation relCustOrder; relCustOrder = new DataRelation("CustomersOrders", parentCol, childCol); // Add the relation to the DataSet. DataSet1.Relations.Add(relCustOrder); } mshelp://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatadatarelationclasstopic.ht m Các thành phần của ñối tượng DataRelation Public properties Thuộc tính Diễn tả ChildColumns Trả về các ñối tượng DataColumns con của quan hệ này ChildKeyConstraint Trả về ForeignKeyConstraint cho quan hệ ChildTable Trả về bảng con của quan hệ DataSet Trả về Dataset chứa DataRealtion này ExtendedProperties Trả về tập hợp mà lưu trữ những thuộc tính tuỳ chọn Nested Trả về hoặc thiết lập một giá trị cho biết các ñối tượng DataRelation là ẩn ParentColumns Trả về một mảng ñối tượng DataColumn mà là những cột cha của DataRelation này ParentKeyConstraint Trả về UniqueConstraint mà chắc rằng những giá trị trong cột cha của DataRelation là duy nhất RelationName Trả về hoặc thiết lập tên dùng ñể truy xuất một DataRelation từ DataRelationCollection II.3 Extendedproperties Dataset(cũng như DataTable và DataColumn) có một thuộc tính ExtendedProperties. ExtendedProperty là một PropertyCollection nơi mà bạn có thể ñặc những thông tin tuỳ chọn, như là câu lệnh select mà ñã ñược sử dụng ñể sinh ra kết quả, ngày giờ dữ liệu ñược tạo ra\
Created by THÁI NGỌC DUY MSDN based-written.
40 4/12/2007
III.
.NET Data Provider .Net Data Provider dùng ñể kết nối ñến cơ sở dữ liệu, thực thi những câu lệnh và truy xuất kết quả. Những kết quả ñó hoặc ñược xử lý trực tiếp hoặc ñược giữ trong ADO.NET DataSet. Có 2 loại .NET Data Provider: OLEDB Data Provider: sử dụng cho các cơ sở dữ liệu OLEDB như Access, DB2,… SQL Data Provider: sử dụng cho cơ sở dữ liệu SQL Server 7.0 và các phiên bản SQL mới hơn. Mỗi ñối tượng của .NET Data Provider cũng chia ra làm 2 loại: như ñối tượng connection có OleDbConnection và SqlConnection, ñối tượng DataAdapter có OleDbDataAdapter và SqlDataAdapter, ñối tượng Command cũng có OleDbCommnad và SqlCommand, ñối tượng DataReader cũng có OleDbDataReader và SqlDataReader. OleDb Managed-provider Namespace
SqlClient Managed-provider Namespace
ðối tượng Connection III.1 - Thiết lập kết nối ñến nguồn dữ liệu - Chuỗi ConnectionString: Lấy hoặc ñặt chuỗi dùng ñể mở một cơ sở dữ liệu SQL Server public void CreateSqlConnection() { //khai báo và khởi tạo một SqlConnection SqlConnection myConnection = new SqlConnection(); // thiết lập chuỗi ConnectionString myConnection.ConnectionString = "user id=sa;password=aU98rrx2;initial catalog=northwind;data source=mySQLServer;Connect Timeout=30"; //Mở kết nối myConnection.Open(); } Các giá trị bên trong chuỗi ConnectionString User id: account login vào Sql Server
Created by THÁI NGỌC DUY MSDN based-written.
41 4/12/2007
Password hay pwd: password của account ñang log on Initial catalog hay Database: Tên của Database Data Source | Server | Address | Addr | Network Address: tên thể hiện SQL mà ta sẽ kết nối Ngoài ra còn các thành phần khác trong chuỗi kết nối như: o Connect Timeout | Connection Timeout:thời gian chờ kết nối o Integrated Security | Trusted_Connection: kết nối bảo mật hay là không bảo mật (true or false) DataAdapter III.2 III.2.1. Khái niệm DataAdapter trình bày một tập các câu lệnh dữ liệu và một kết nối dữ liệu, DataAdapter dùng ñể ñiền dữ liệu vào DataSet và cập nhật dữ liệu vào nguồn dữ liệu. DataAdapter như một cầu nối giữa DataSet và nguồn dữ liệu phục vụ cho việc truy xuất và lưu dữ liệu. DataAdapter dùng phương thức Fill ñể ñiền dữ liệu vào DataSet và sử dụng phương thức Update ñể cập nhật những thay ñổi từ DataSet xuống cơ sở dữ liệu. Tuỳ thuộc vào loại dữ liệu nguồn mà bạn sẽ sử dụng loại DataAdapter phù hợp. Có 2 loại DataAdapter: Các thành phần của DataAdapter III.2.2. Public properties AcceptChangesDuringFill: Thiết lập hoặc trả về giá trị cho biết phương thức AcceptChanges có ñược gọi trên DataRow sau khi nó ñược thêm vào DataTable Container ContinueUpdateOnError: thiết lập hay trả về giá trị cho biết có cho phép cập nhật dữ liệu trong khi xảy ra lỗi trên DataRow hay không (True/false) MisssingMapingAction Site TableMapings: Trả về một collection mà cung cấp ánh xạ chính giữa một bảng nguồn và một DataTable Public methods CreateObjRef: Dispose(kế thừa từ ñối tượng Component): giải phóng tài nguyên mà ñối tượng sử dụng Equals(kế thừa từ Object): Fill: Thêm vào hay làm tươi những dòng dữ liệu trong DataSet ñể hợp với dữ liệu ở cơ sở dữ liệu. Phương thức Fill truy xuất những dòng trong nguồn dữ liệu bằng cách sử dụng câu lệnh Select. ðối tượng Connection kết hợp với câu lệnh Select phải là hợp lệ, nhưng ta không cần phải mở connection, phương thức Fill sẽ tự ñộng mở kết nối nếu kết nối chưa ñược mở, còn nếu kết nối ñã mở thì nó sẽ xác nhận. Sau khi ñã Fill, nó sẽ ñóng kết nối lại. Thao tác Fill sau ñó thêm các dòng vào các ñối tượng DataTable ñích trong DataSet, việc tạo các ñối tượng DataTable nếu chúng chưa tồn tại. Khi tạo các ñối tượng DataTable, thông thường phương thức Fill chỉ tạo tên cột. Tuy nhiên, nếu thuộc tính MissingSchemaAction ñược thiết lập là AddWithKey thì khoá chính và ràng buộc thích hợp cũng ñược tạo ra. Nếu data adapter bắt gặp các cột trùng lắp trong khi nạp dữ liệu cho DataTable, nó sẽ sinh ra một chuỗi cột tuần tự, sử dụng columnname1, columnname2,… Nếu dữ liệu vào chứa những cột không tên thì các cột này sẽ ñược ñặt vào DataSet
Created by THÁI NGỌC DUY MSDN based-written.
42 4/12/2007
theo mẫu column1, column2. Khi nhiều tập kết quả ñược thêm vào DataSet, mỗi tập kết quả ñược ñặt trong một bảng riêng biệt Bạn có thể dùng phương thức Fill nhiều lần trên cùng một DataTable. Nếu một khoá chính tồn tại, các dòng thêm vào ñược trộn với những dòng tương thích mà ñã tồn tại. Nếu chưa tồn tại khoá chính, những dòng thêm vào ñược thêm vào cuối của DataTable mshelp://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatacommondataadapterclas sfilltopic.htm Các cú pháp của phương thức Fill • Cú pháp 1: thêm vào hoặc làm tươi dòng dữ liệu trong DataSet ñể tương thích với chúng trong dữ liệu nguồn, sử dụng tên DataSet và tạo một DataTable tên là “”Table” public override int Fill( DataSet dataSet ); •
Cú pháp 2: Thêm vào hoặc làm tươi dòng dữ liệu trong DataTable ñể tương thích với chúng trong nguồn dữ liệu bằng cách sử dụng tên DataTable public int Fill( DataTable dataTable );
•
Cú pháp 3: thêm hoặc làm tươi dòng dữ liệu trong DataSet ñể tương thích với chúng trong nguồn dữ liệu sử dụng tên DataSet và tên DataTable public int Fill( DataSet dataSet, string srcTable ); Nếu DataSet tồn tại nhiều DataTable mà tên của các DataTable này chỉ khác nhau về chữ hoa và chữ thường thì khi ta gọi phương thức Fill với 1 DataTable mà tên của DataTable này khác với tất cả các tên DataTable trong Dataset về chữ hoa và chữ thường thì DataTable này sẽ ñược thêm mới. DataSet dataset = new DataSet(); dataset.Tables.Add("aaa"); dataset.Tables.Add("AAA"); // Fills "aaa", DataTable ñã tồn tại trong DataSet adapter.Fill(dataset, "aaa"); adapter.Fill(dataset, "Aaa"); // Thêm một bảng mới Aaa Còn trường hợp Trong DataSet chỉ có một DataTable. Thì khi phương thức Fill ñược gọi với tên của DataTable chỉ khác với tên DataTable trong DataSet về chữ hoa và chữ thường thì phương thức Fill sẽ Fill trên DataTable - DataTable ñã tồn tại trong DataSet DataSet dataset = new DataSet(); dataset.Tables.Add("aaa");
Created by THÁI NGỌC DUY MSDN based-written.
43 4/12/2007
•
// Fills table "aaa" bởi vì chỉ có 1 tên bảng giống với tên bảng Fill trong DataSet adapter.Fill(dataset, "AAA"); Cú pháp 4: thêm vào hoặc làm tươi dòng dữ liệu trong DataTable ñể tương thích với chúng trong nguồn dữ liệu sử dụng tên của DataTable và tên của IdataReader protected virtual int Fill( DataTable dataTable, IDataReader dataReader );
•
Cú pháp 5: thêm vào hoặc làm tươi dòng dữ liệu trong dataTable ñể tương thích với chúng trong nguồn dữ liệu sử dụng tên DataTable, câu lệnh Sql Select cụ thể và CommandBehaviour protected virtual int Fill( DataTable dataTable, IDbCommand command, CommandBehavior behavior ); DataTable: tên dataTable ñể ñiền dữ liệu Command: câu lệnh Sql Select dùng ñể truy xuất dòng dữ liệu từ nguồn dữ liệu Behaviour: giá trị commandBehaviour. Bạn có thể tham khảo các giá trị của commandBehaviour tại trang
mshelp://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatacommandbehaviorclasst opic.htm • Cú pháp 6: thêm vào hay làm tươi dòng dữ liệu trong một vùng cụ thể trong DataSet ñể tương thích với chúng trong nguồn dữ liệu sử dụng tên DataSet và tên DataTable. public int Fill( DataSet dataSet, int startRecord, int maxRecords, string srcTable ); •
Cú pháp 7: thêm hay làm tươi dòng dữ liệu trong một vùng trong DataSet sử dụng tên DataSet, tên DataTable và tên IdataReader protected virtual int Fill( DataSet dataSet, string srcTable, IDataReader dataReader, int startRecord, int maxRecords );
Created by THÁI NGỌC DUY MSDN based-written.
44 4/12/2007
•
Cú pháp 8: thêm hay làm tươi dòng dữ liệu trong một vùng trong DataSet sử dụng tên dataset, tên bảng nguồn, chuỗi command và command behaviour
protected virtual int Fill( DataSet dataSet, int startRecord, int maxRecords, string srcTable, IDbCommand command, CommandBehavior behavior ); Bạn có thể tham khảo thêm các cú pháp của phương thức Fill tại ñịa chỉ sau mshelp://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatacommondbd ataadapterclassfilltopic.htm FillSchema: thêm vào một DataTable tên là Table vào một DataSet và cấu hình lược ñồ dựa trên SchemaType cụ thể. public abstract DataTable[] FillSchema( DataSet dataSet, SchemaType schemaType ); GetFillParameters: trả về tham số thiết lập bởi người dùng khi thực thi một câu lệnh SQL SELECT. Trả về một mảng các ñối tượng Idataparameter. Update: Gọi câu lệnh Insert, Update, Delete tương ứng cho mỗi dòng ñược inserted, updated, deleted trong Dataset từ DataTable public DataSet CreateCmdsAndUpdate(DataSet myDataSet,string myConnection,string mySelectQuery,string myTableName) { OleDbConnection myConn = new OleDbConnection(myConnection); OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(); myDataAdapter.SelectCommand = new OleDbCommand(mySelectQuery, myConn); OleDbCommandBuilder custCB = new OleDbCommandBuilder(myDataAdapter); myConn.Open(); DataSet custDS = new DataSet(); myDataAdapter.Fill(custDS); //viết code ñể cập nhật dữ liệu ở ñây //Without the OleDbCommandBuilder this line would fail myDataAdapter.Update(custDS); myConn.Close(); return custDS; }
Created by THÁI NGỌC DUY MSDN based-written.
45 4/12/2007
III.3 ðối tượng Command III.3.1. ðịnh nghĩa Một Data Command chứa một tham chiếu ñến một câu lệnh Sql hoặc một Stored procedure mà bạn có thể thực thi trực tiếp. Một Data Command là một thể hiện của class OleDbCommand hoặc class SqlCommand Khi làm việc với Data Commands, bạn có thể thực hiện ñược một số tác vụ trên ứng dụng của bạn như: Thực thi câu lệnh Select mà trả về một kết quả, bạn có thể ñọc trực tiếp mà bạn không phải load nó lên DataSet. ðể ñọc, bạn sử dụng một DataReader(OleDbDataReader hoặc là SqlDataReader). Sử dụng ñối tượng DataReader giúp ta giảm thiểu bộ nhớ và truy xuất dữ liệu một cách nhanh chóng Thực thi các câu lệnh ñịnh nghĩa cơ sở dữ liệu (DDL) như tạo, cập nhật và xoá bảng, stored procedure và các cấu trúc cơ sở dữ liệu khác(dĩ nhiên là bạn phải có quyền ñể thực hiện các câu lệnh này) Thực thi các câu lệnh ñể lấy thông tin danh mục Thực thi các câu lệnh Sql ñộng như update, insert hoặc delete, ta không phải update dataset rồi sau ñó copy những thay ñổi xuống cơ sở dữ liệu Thực thi các câu lệnh mà trả về giá trị vô hướng (giá trị ñơn), như kết quả của chứng thực thể tính dụng hay một giá trị tính toán Thực thi các câu lệnh mà trả về dữ liệu từ một cơ sở dữ liệu SQL Server(phiên bản 7.0 hay mới hơn) theo dạng Xml. Cách dùng thông thường là thực thi một câu truy vấn và lấy lại dữ liệu theo dạng Xml Cách Data Command làm việc Các thuộc tính của Data Command chứa tất cả các thông tin cần thiết ñể thực thi câu lệnh dựa vào cơ sở dữ liệu. Bao gồm: Connection: Command tham chiếu ñến một connection - ñối tượng này dùng ñể giao tiếp với cơ sở dữ liệu. Name hoặc text của một câu lệnh: chuỗi trình bày câu lệnh Sql hay là tên của một Stored Procedure Các tham số(parameters): Một câu lệnh có thể yêu cầu bạn truyền giá trị các tham số. Câu lệnh cũng có thể trả về các giá trị. Mỗi câu lệnh có một tập hợp các tham số mà bạn có thể thiết lập hoặc ñọc một cách riêng biệt ñể truyền hoặc nhận dữ liệu. Nhiều tập kết quả Cách dùng thông thường của data command là trả về một tập kết quả ñơn. Tuy nhiên data command có thể thực thi những thủ tục mà trả về nhiều tập kết quả. Ta có thể thực hiện ñược theo nhiều cách. Thứ nhất data command tham chiếu ñến một stored procedure mà stored này trả về nhiều tập kết quả. Thứ hai, command có thể chứa 2 hay nhiều câu lệnh hay tên của stored procedure, trong trường hợp này các câu lệnh hay các thủ tục chạy tuần tự và trả về nhiều tập kết quả Việc trả về nhiều tập kết quả cho phép bạn tối ưu cách sử dùng một kết nối mở ñơn của bạn. Thông thường việc sử dụng bao gồm: Việc chạy nhiều câu truy vấn, mỗi câu truy vấn trả về một tập kết quả riêng biệt Việc chạy một câu lệnh Update hay Insert theo sau bởi câu lệnh Select Thực thi data command Sau khi thiết lập các thuộc tính của Data command, bạn có thể thực thi Data command. Data command cung cấp 4 phương thức thực thi. Tuỳ thuộc vào câu lệnh và thủ tục ñược thực thi, bạn có thể thực thi và trả về:
Created by THÁI NGỌC DUY MSDN based-written.
46 4/12/2007
Tập kết quả: trong trường hợp này bạn ñang thực thi một câu lệnh Sql hay một stored procedure mà trả về một hay nhiều mẫu tin. Bạn có thể lấy tập kết quả này bằng cách sử dụng data reader ðếm những mẫu tin bị ảnh hưởng: tình huống này xảy ra khi bạn thực thi một câu lệnh hay một thủ tục mà cập nhật cơ sở dữ liệu hay làm thay ñổi cấu trúc của cơ sở dữ liệu Giá trị ñơn; Thực thi trên câu lệnh hay stored procedure mà thực hiện việc tìm kiếm, tính toán một giá trị thích hợp hay giải quyết một giá trị ñơn nào khác Dữ liệu dưới dạng Xml: Khả năng này chỉ thực hiện ñược trên Sql Server 7.0 trở về sau Cách Data Adapter sử dụng Data command Data Adapter sử dụng data command ñể ñọc và ghi cơ sở dữ liệu. Data Adapter có thể chứa 4 ñối tượng Data command . Mỗi ñối tượng chứa trong một thuộc tính của Data Adapter: SelectCommand, UpdateCommand, InsertCommand, DeleteCommand. Khi bạn sử dụng Data Adapter, nó thực hiện một cách hiệu quả những thao tác tương tự với command. Ví dụ khi bạn gọi phương thức Fill của Adapter, Adapter thực thi data command trong thuộc tính SelectCommand và sử dụng một data Adapter ñể fill tập kết quả vào table của Dataset mà bạn chỉ ra. Tương tự khi bạn gọi phương thức Update, nó thực thi các câu lệnh thích hợp (trong thuộc tính UpdateCommand, Insertcommand, DeleteCommand) Một ñiểm quan trọng là Data Adapter ñược thiết kế sử dụng command ñể giao tiếp với Dataset. Bằng cách sử dụng Data Command của chính bạn, bạn có thể thực hiện những chức năng tương tự như Data Adapter làm, nhưng khi bạn có nhiều control thì ñối tượng command ñược thực thi khi nào và như thế nào, ñặc biệt là ñiều gì sẽ xảy ra với tập kết quả của command. III.3.2. Các thành phần của ñối tượng Command Như ñã ñề cập trước, mỗi ñối tượng của .NET Data Provider có 2 loại OleDb và Sql. Data command cũng có 2 loại: OleDbCommand và SqlCommand. Ở ñây ta sẽ nghiên cứu SqlCommand. Public constructor: SqlCommand có nhiều constructor, mỗi loại có một chức năng khác nhau. Khởi tạo một thể hiện mới của lớp SqlCommand public SqlCommand(); Ví dụ: public void CreateMySqlCommand() { SqlCommand myCommand = new SqlCommand(); myCommand.CommandTimeout = 15; myCommand.CommandType = CommandType.Text; } Khởi tạo một thể hiện của SqlCommand với chuỗi truy vấn public SqlCommand( string cmdText ); Ví dụ: public void CreateMySqlCommand() { string mySelectQuery = "SELECT * FROM Categories ORDER BY CategoryID";
Khởi tạo một thể hiện của class SqlCommand với chuỗi truy vấn và một SqlConnection public SqlCommand( string cmdText, SqlConnection connection ); Ví dụ: public void CreateMySqlCommand() { string mySelectQuery = "SELECT * FROM Categories ORDER BY CategoryID"; string myConnectString = "user id=sa;password=;database=northwind;server=mySQLServer"; SqlConnection myConnection = new SqlConnection(myConnectString); SqlCommand myCommand = new SqlCommand(mySelectQuery,myConnection); myCommand.CommandTimeout = 15; myCommand.CommandType = CommandType.Text; } Khởi tạo một thể hiện mới của class SqlCommand với chuỗi truy vấn, một SqlConnection và Transaction public SqlCommand( string cmdText, SqlConnection connection, SqlTransaction transaction ); Ví dụ: public void CreateMySqlCommand() { SqlConnection myConnection = new SqlConnection("user id=sa;password=;initial catalog=northwind;data source=mySQLServer"); myConnection.Open(); SqlTransaction myTrans = myConnection.BeginTransaction(); string mySelectQuery = "SELECT * FROM Categories ORDER BY CategoryID"; SqlCommand myCommand = new SqlCommand(mySelectQuery, myConnection,myTrans); myCommand.CommandTimeout = 20; }
Public Properties Thuộc tính Diễn tả CommandText nhận hoặc trả về câu lệnh T-Sql hay
Created by THÁI NGỌC DUY MSDN based-written.
Ví dụ Mycommand.CommandText=”Select *
48 4/12/2007
CommandTimeout CommandType
Connection
thủ tục ñể thực thi nhận hay trả về thời gian chờ thực thi nhận hay trả về giá trị cho biết loại commandtext ñược gán(các giá trị StoredProcedure, TableDirect,Text. Mặc ñịnh là Text) nhận hay trả về SqlConnection mà command sử dụng
from NhanVien” Mycommand.CommandTimeout=20 Mycommand.CommandType= CommandType.Text myCommand.Connection = new SqlConnection(myConnectString);
Container DesignTimeVisible Parameters trả về SqlParameter collection Site Transaction UpdateRowSource Ví dụ sử dụng các thuộc tính của SqlCommand public void CreateMySqlCommand() { // gán chuỗi truy vấn cho một biến chuỗi string mySelectQuery = "SELECT * FROM Categories ORDER BY CategoryID"; // chuỗi kết nối string myConnectString = "user id=sa;password=;database=northwind;server=mySQLServer"; // tạo mới một thể hiện của SqlCommand với chuỗi truy vấn SqlCommand myCommand = new SqlCommand(mySelectQuery); //thiết lập thuộc tính Connection của SqlCommand myCommand.Connection = new SqlConnection(myConnectString); // thuộc tính CommandTimeout myCommand.CommandTimeout = 15; // thuộc tính CommandType myCommand.CommandType = CommandType.Text; } Public methods a. Cancel Huỷ bỏ thực thi của một SqlCommand b. CreateParameter Tạo một thể hiện mới cho ñối tượng SqlParameter. c. ExecuteNonQuery Thực thi một câu lệnh T-SQL dựa vào Connection và trả về số mẫu tin bị ảnh hưởng. Bạn có thể sử dụng phương thức ExecuteNonQuery ñể thực hiện các thao tác catalog(ví dụ việc truy vấn cấu trúc của một cơ sở dữ liệu hoặc tạo các ñối tượng của cơ sở dữ liệu như table) hoặc là thay ñổi dữ liệu không dùng Dataset bằng cách thực thi các câu lệnh Update, Insert và Delete ðối với các câu lệnh Update, Insert và Delete thì giá trị trả về là số dòng bị ảnh hưởng, còn các loại câu lệnh khác thì giá trị trả về là –1 Ví dụ sau sẽ tạo một ñối tượng SqlCommand và thực thi nó sử dụng phương thức ExecuteNonQuery. Ta sẽ truyền vào một chuỗi – là câu lệnh T-SQL (Update, Insert hay Delete)-và một chuỗi dùng ñể kết nối ñến data source. public void CreateMySqlCommand(string myExecuteQuery, SqlConnection myConnection) {
Created by THÁI NGỌC DUY MSDN based-written.
49 4/12/2007
SqlCommand myCommand = new SqlCommand(myExecuteQuery, myConnection); myCommand.Connection.Open(); myCommand.ExecuteNonQuery(); myConnection.Close(); } d. ExecuteReader Gửi CommandText ñến Connection và xâ dựng một SqlDataReader Ví dụ sau sẽ tạo một ñối tượng SqlCommand và thực thi nó sử dụng phương thức ExecuteNonQuery. Ta sẽ truyền vào một chuỗi – là câu lệnh T-SQL (Update, Insert hay Delete)-và một chuỗi dùng ñể kết nối ñến data source. CommandBehavious ñược thiết lập là CloseConnection. public void CreateMySqlDataReader(string mySelectQuery,string myConnectionString) { SqlConnection myConnection = new SqlConnection(myConnectionString); SqlCommand myCommand = new SqlCommand(mySelectQuery, myConnection); myCommand.Connection.Open(); SqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection); while(myReader.Read()) { Console.WriteLine(myReader.GetString(0)); } myReader.Close(); myConnection.Close(); } CommandBehavious: cung cấp một thông báo về tập kết quả của câu truy vấn và ảnh hưởng của nó trên cơ sở dữ liệu. Các thành phần của CommandBehavious Tên thành phần Diễn tả CloseConnection Khi command thực thi, ñối tượng connection ñược ñóng khi ñối tượng DataReader ñược ñóng Default Câu truy vấn có thể trả về nhiều tập kết quả. Việc thực thi có thể tác ñộng ñến trạng thái của cơ sở dữ liệu. Mặc ñịnh khi gọi phương thức ExecuteReader là ExecuteReader(CommandBehavious.Default) KeyInfo Truy vấn trả về thông tin cột và khoá chính. Truy vấn ñược thực thi không cần bất kỳ thao tác khoá trên các mẫu tin ñược chọn SchemaOnly Truy vấn trả về thông tin cột và việc thực thi không tác ñộng ñến trạng thái của cơ sở dữ liệu SequentialAccess Cung cấp cho DataReader một cách giữ các mẫu tin chứa những cột với giá tị binary lớn. Thay vì phải load tất cả các dòng, SequentialAccess cho phép DataReader load tất cả dữ liệu như là một luồng. Sau ñó bạn có thể sử dụng phương thức GetBytes hay GetChars ñể chỉ ra vị trí byte bắt ñầu ñọc , và giới hạn kích thước bô ñệm cho giá trị trả về. SingleResult Truy vấn trả về một tập kết quả ñơn. Việc thực thi của
Created by THÁI NGỌC DUY MSDN based-written.
50 4/12/2007
SingleRow
truy vấn có thể ảnh hưởng ñến trạng thái của Database Truy vấn trả về một dòng ñơn. Việc thực thi của truy vấn có thể tác ñộng ñến trạng thái của database. Ta cũng có thể chỉ ra SingleRow khi thực thi truy vấn mà trả về nhiều tập kết quả. Trong trường hợp này, nhiều tập kết quả vẫn ñược trả về nhưng mỗi tập kết quả chỉ có một dòng ñơn
e. ExecuteScalar Thực thi truy vấn, trả về cột ñầu tiên của dòng ñầu tiên trong tập kết quả trả về của truy vấn, những cột hay những dòng thêm vào ñược bỏ qua. f. ExecuteXmlReader Gửi CommandText tới Connection và xây dựng ñối tượng XmlReader III.4 ðối tượng DataReader Như ñã ñề cập trước, lợi ích của việc dùng Dataset là cho phép ta kết nối ngắt ñoạn với dữ liệu nguồn, chúng ta có thể thao tác dataset trên ứng dụng của chúng ta và sau ñó cập nhật những thay ñổi xuống cơ sở dữ liệu. ðối với những ứng dụng chạy lâu dài thì ñây là hướng giải quyết tốt. ðối với ứng dụng Wed, bạn thường sử dụng những thao tác ngắn với từng yêu cầu (thông thường là chỉ ñể hiển thị dữ liệu). Thông thường bạn không cần giữ dataset. ðối với trường hợp này bạn có thể dùng DataReader. Có 2 loại DataReader là OldDbDataReader và SqlDataReader Một SqlDataReader cung cấp một cách truy xuất dữ liệu forward-only, read – only. ðể dùng SqlDataReader bạn khai báo một SqlCommand thay vì một SqlDataAdapter. SqlCommand cung cấp một phương thức ExecuteReader mà trả về một SqlDataReader. Cũng chú ý là bạn nên mở và ñóng kết nối SqlConnection một cách rõ ràng khi bạn dùng SqlCommand. Sau khi gọi phương thức ExecuteReader, SqlDataReader có thể bound ñến một server control của ASP.NET SqlConnection myConnection = new SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes"); SqlCommand myCommand = new SqlCommand("select * from Authors", myConnection); myConnection.Open();
SqlDataReader dr = myCommand.ExecuteReader(); ... myConnection.Close(); Bạn sử dụng phương thức Read của ñối tượng DataReader ñể lấy một dòng từ kết quả của truy vấn, bạn có thể truy cập các cột của dòng bằng cách truyền vào tên của cột hay index. Bạn phải luôn luôn gọi phương thức Close klhi bạn không còn sử dụng DataReader. Chú ý là trong khi có một DataReader ñang mở, Connection ñang sử dụng ñộc quyền bởi DataReader. Bạn sẽ không ñược phép thực thi bất kỳ câu lệnh cho Connection, cho dù bạn tạo một DataReader khác, mãi cho ñến khi DataReader ñầu ñược ñóng Nếu nhiều tập kết quả ñược trả về, DataReader cung cấp phương thức NextResult ñể tương tác xuyên qua thứ tự tập kết quả
Created by THÁI NGỌC DUY MSDN based-written.
51 4/12/2007
// select nhiều bảng SqlCommand myCMD = new SqlCommand("SELECT CategoryID, CategoryName FROM Categories;" + "SELECT EmployeeID, LastName FROM Employees", nwindConn); nwindConn.Open(); SqlDataReader myReader = myCMD.ExecuteReader(); do { Console.WriteLine("\t{0}\t{1}", myReader.GetName(0), myReader.GetName(1)); while (myReader.Read()) Console.WriteLine("\t{0}\t{1}", myReader.GetInt32(0), myReader.GetString(1)); } while (myReader.NextResult()); // Gọi phương thức NextResult myReader.Close(); nwindConn.Close(); Các thuộc tính của Class SqlDataReader Thuộc tính FieldCount IsClosed
Tác dụng Trả về số cột của dòng hiện tại Trả về True khi ñối tượng ñang ñóng, ngược lại trả về False RecordsAffected Trả về số dòng bị ảnh hưởng khi gọi phương thức ExecuteReader của command Các phương thức của ñối tượng Phương thức Close GetBoolean GetByte GetFloat GetInt16, GetInt32 GetName Read
Tác dụng ðóng ñối tượng SqlDataReader Lấy giá trị của cột chỉ ñịnh theo kiểu Boolean Lấy giá trị của cột chỉ ra theo kiểu Byte GetDouble, GetChar GetString Lấy tên của cột chỉ ñịnh Chuyển ñầu ñọc tới record kế tiếp
[C#] public void ReadMyData(string myConnString) { string mySelectQuery = "SELECT OrderID, CustomerID FROM Orders"; SqlConnection myConnection = new SqlConnection(myConnString); SqlCommand myCommand = new SqlCommand(mySelectQuery,myConnection); myConnection.Open(); SqlDataReader myReader;
Created by THÁI NGỌC DUY MSDN based-written.
52 4/12/2007
myReader = myCommand.ExecuteReader(); // Always call Read before accessing data. while (myReader.Read()) { Console.WriteLine(myReader.GetInt32(0) + ", " + myReader.GetString(1)); } // always call Close when done reading. myReader.Close(); // Close the connection when done with it. myConnection.Close(); } Command Dataset ðể cho phép trang của bạn truy cập ñến những class mà bạn cần ñể thực hiện việc truy cập dữ liệu SQL, bạn phải import 2 namespace là System.Data và System.Data.SqlClient <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %> ðể thực hiện một câu truy vấn ñến cơ sở dữ liệu Sql, ta tạo một SqlConnection ñến cơ sở dữ liệu bằng một chuỗi kết nối, và sau ñó ñặt 1 ñối tượng SqlDataAdapter dùng ñể chứa câu truy vấn ñó. ðể thao tác ñối tượng Dataset với kết quả từ câu truy vấn ñó, bạn gọi phương thức Fill của command SqlConnection myConnection = new SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes"); SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors", myConnection); DataSet ds = new DataSet(); myCommand.Fill(ds, "Authors");
Khi thực hiện một command mà không yêu cầu dữ liệu trả về như insert, update, delete, bạn cũng dùng một SqlCommand. Command ñược thực hiện bằng phương thức ExcuteNonQuery, nó sẽ trả về số dòng bị ảnh hưởng. Chú ý là kết nối phải ñược mở khi bạn dùng SqlCommand SqlConnection myConnection = new SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes"); SqlCommand myCommand = new SqlCommand( "UPDATE Authors SET phone='(800) 555-5555' WHERE au_id = '12345-6789'", myConnection); myCommand.Connection.Open(); myCommand.ExecuteNonQuery(); myCommand.Connection.Close(); Ví dụ sử dụng DataGrid MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView; MyDataGrid.DataBind();
Created by THÁI NGỌC DUY MSDN based-written.
53 4/12/2007
Hay MyDataGrid.DataSource=ds; MyDataGrid.DataMember="Authors"; MyDataGrid.DataBind(); Bạn cũng có thể bind trực tiếp ñến SqlDataReader, trong trường hợp này bạn chỉ có thể hiển thị dữ liệu <script language="C#" runat="server"> protected void Page_Load(Object sender, EventArgs e) { SqlConnection myConnection = new SqlConnection("server=(local)\\NetSDK;database=pubs;Trusted_Connection=yes"); SqlCommand myCommand = new SqlCommand("select * from Authors", myConnection); myConnection.Open(); SqlDataReader dr = myCommand.ExecuteReader(); MyDataGrid.DataSource = dr; MyDataGrid.DataBind(); myConnection.Close(); } Thực hiện một câu lệnh có tham số Bạn cũng có thể sử dụng một câu lệnh select có tham số bằng cách sử dụng ñối tượng SqlDataAdapter. Ví dụ sau chỉ ra cách bạn có thể thay ñổi giá trị dữ liệu ñược public void GetAuthors_Click(Object sender, EventArgs E) { String selectCmd = "select * from Authors where state = @State"; SqlConnection myConnection = new SqlConnection("server=(local)\\NetSDK;database=pubs;Trusted_Connection=yes"); SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd, myConnection); myCommand.SelectCommand.Parameters.Add(new SqlParameter("@State", SqlDbType.NVarChar, 2)); myCommand.SelectCommand.Parameters["@State"].Value = MySelect.Value; DataSet ds = new DataSet(); myCommand.Fill(ds, "Authors"); MyDataGrid.DataSource= ds.Tables["Authors"].DefaultView; MyDataGrid.DataBind();
Created by THÁI NGỌC DUY MSDN based-written.
54 4/12/2007
} Thực hiện câu lệnh Insert vào cơ sở dữ liệu ðể chèn một dòng vào cơ sở dữ liệu, bạn có thể chèn một form ñơn giản cho phép người dùng nhập vào, sau ñó thực thi câu lệnh insert trong sự kiện submit. Bạn sử dụng collection Parameters của ñối tượng command. Chúng ta nên thực hiện câu lệnh insert này trong khối try catch ñể tránh trường hợp trùng khoá <script language="C#" runat="server"> SqlConnection myConnection; protected void Page_Load(Object Src, EventArgs E) { myConnection = new SqlConnection("server=(local)\\NetSDK;database=pubs;Trusted_Connection=yes"); if (!IsPostBack) BindGrid(); } public void AddAuthor_Click(Object sender, EventArgs E) { if (au_id.Value == "" || au_fname.Value == "" || au_lname.Value == "" || phone.Value == "") { Message.InnerHtml = "ERROR: Null values not allowed for Author ID, Name or Phone"; Message.Style["color"] = "red"; BindGrid(); return; } String insertCmd = "insert into Authors (au_id, au_lname, au_fname, phone, address, city, state, zip, contract) values (@Id, @LName, @FName, @Phone, @Address, @City, @State, @Zip, @Contract)"; SqlCommand myCommand = new SqlCommand(insertCmd, myConnection); myCommand.Parameters.Add(new SqlParameter("@Id", SqlDbType.NVarChar, 11)); myCommand.Parameters["@Id"].Value = au_id.Value; myCommand.Parameters.Add(new SqlParameter("@LName", SqlDbType.NVarChar, 40)); myCommand.Parameters["@LName"].Value = au_lname.Value; myCommand.Parameters.Add(new SqlParameter("@FName", SqlDbType.NVarChar, 20)); myCommand.Parameters["@FName"].Value = au_fname.Value;
Created by THÁI NGỌC DUY MSDN based-written.
55 4/12/2007
myCommand.Parameters.Add(new SqlParameter("@Phone", SqlDbType.NChar, 12)); myCommand.Parameters["@Phone"].Value = phone.Value; myCommand.Parameters.Add(new SqlParameter("@Address", SqlDbType.NVarChar, 40)); myCommand.Parameters["@Address"].Value = address.Value; myCommand.Parameters.Add(new SqlParameter("@City", SqlDbType.NVarChar, 20)); myCommand.Parameters["@City"].Value = city.Value; myCommand.Parameters.Add(new SqlParameter("@State", SqlDbType.NChar, 2)); myCommand.Parameters["@State"].Value = state.Value; myCommand.Parameters.Add(new SqlParameter("@Zip", SqlDbType.NChar, 5)); myCommand.Parameters["@Zip"].Value = zip.Value; myCommand.Parameters.Add(new SqlParameter("@Contract", SqlDbType.NVarChar,1)); myCommand.Parameters["@Contract"].Value = contract.Value; myCommand.Connection.Open(); try { myCommand.ExecuteNonQuery(); Message.InnerHtml = "Record Added " + insertCmd.ToString(); } catch (SqlException e) { if (e.Number == 2627) Message.InnerHtml = "ERROR: A record already exists with the same primary key"; else Message.InnerHtml = "ERROR: Could not add record, please ensure the fields are correctly filled out"; Message.Style["color"] = "red"; } myCommand.Connection.Close(); BindGrid(); } public void BindGrid() {
Created by THÁI NGỌC DUY MSDN based-written.
56 4/12/2007
SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors", myConnection); DataSet ds = new DataSet(); myCommand.Fill(ds, "Authors"); MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView; MyDataGrid.DataBind(); } Updated dữ liệu <script language="C#" runat="server"> SqlConnection myConnection; protected void Page_Load(Object Src, EventArgs E) { myConnection = new SqlConnection("server=(local)\\NetSDK;database=pubs;Trusted_Connection=yes"); if (!IsPostBack) BindGrid(); } public void MyDataGrid_Edit(Object sender, DataGridCommandEventArgs e) { MyDataGrid.EditItemIndex = (int)e.Item.ItemIndex; BindGrid(); } public void MyDataGrid_Cancel(Object sender, DataGridCommandEventArgs e) { MyDataGrid.EditItemIndex = -1; BindGrid(); } public void MyDataGrid_Update(Object sender, DataGridCommandEventArgs e) { String updateCmd = "UPDATE Authors SET au_id = @Id, au_lname = @LName, au_fname = @FName, phone = @Phone, " + "address = @Address, city = @City, state = @State, zip = @Zip, contract = @Contract where au_id = @Id"; SqlCommand myCommand = new SqlCommand(updateCmd, myConnection); myCommand.Parameters.Add(new SqlParameter("@Id", SqlDbType.NVarChar, 11)); myCommand.Parameters.Add(new SqlParameter("@LName", SqlDbType.NVarChar, 40));
myCommand.Parameters["@Id"].Value = MyDataGrid.DataKeys[(int)e.Item.ItemIndex]; String[] cols = {"@Id","@LName","@FName","@Phone","@Address","@City","@State","@Zip","@Co ntract"}; int numCols = e.Item.Cells.Count; for (int i=2; i
Created by THÁI NGỌC DUY MSDN based-written.
58 4/12/2007
Message.InnerHtml = "Record Updated " + updateCmd; MyDataGrid.EditItemIndex = -1; } catch (SqlException exc) { if (exc.Number == 2627) Message.InnerHtml = "ERROR: A record already exists with the same primary key"; else Message.InnerHtml = "ERROR: Could not update record, please ensure the fields are correctly filled out"; Message.Style["color"] = "red"; } myCommand.Connection.Close(); BindGrid(); } public void BindGrid() { SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors", myConnection); DataSet ds = new DataSet(); myCommand.Fill(ds, "Authors"); MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView; MyDataGrid.DataBind(); } Xoá dữ liệu <script language="C#" runat="server"> SqlConnection myConnection; protected void Page_Load(Object sender, EventArgs e) { myConnection = new SqlConnection("server=(local)\\NetSDK;database=pubs;Trusted_Connection=yes"); if (!IsPostBack) BindGrid(); } public void MyDataGrid_Delete(Object sender, DataGridCommandEventArgs e) { String deleteCmd = "DELETE from Employee where emp_id = @Id";
Created by THÁI NGỌC DUY MSDN based-written.
59 4/12/2007
SqlCommand myCommand = new SqlCommand(deleteCmd, myConnection); myCommand.Parameters.Add(new SqlParameter("@Id", SqlDbType.NVarChar, 11)); myCommand.Parameters["@Id"].Value = MyDataGrid.DataKeys[(int)e.Item.ItemIndex]; myCommand.Connection.Open(); try { myCommand.ExecuteNonQuery(); Message.InnerHtml = "Record Deleted " + deleteCmd; } catch (SqlException) { Message.InnerHtml = "ERROR: Could not delete record"; Message.Style["color"] = "red"; } myCommand.Connection.Close(); BindGrid(); } public void BindGrid() { SqlDataAdapter myCommand = new SqlDataAdapter("select * from Employee", myConnection); DataSet ds = new DataSet(); myCommand.Fill(ds, "Employee"); MyDataGrid.DataSource=ds.Tables["Employee"].DefaultView; MyDataGrid.DataBind(); } Sử dụng Stored procedure <script language="VB" runat="server"> Sub Page_Load(Sender As Object, E As EventArgs) Dim DS As DataSet Dim MyConnection As SqlConnection Dim MyCommand As SqlDataAdapter MyConnection = New SqlConnection("server=(local)\NetSDK;database=northwind;Trusted_Connection=ye s")
Created by THÁI NGỌC DUY MSDN based-written.
60 4/12/2007
MyCommand = New SqlDataAdapter("Ten Most Expensive Products", MyConnection) MyCommand.SelectCommand.CommandType = CommandType.StoredProcedure DS = new DataSet() MyCommand.Fill(DS, "Products") MyDataGrid.DataSource=DS.Tables("Products").DefaultView MyDataGrid.DataBind() End Sub
Ví du mẫu using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace WebApplication1 { /// <summary> /// Summary description for WebForm1. /// public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.DataGrid MyDataGrid; protected System.Web.UI.HtmlControls.HtmlInputButton Button2; protected System.Web.UI.WebControls.DropDownList MySelect; protected System.Web.UI.WebControls.Button Button3; protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here //AccessData(); }
Created by THÁI NGỌC DUY MSDN based-written.
61 4/12/2007
private void AccessData() { SqlConnection nwindConn=new SqlConnection(); nwindConn.ConnectionString= "user id=sa;password=;initial catalog=northwind;data source=azsw0131;Connect Timeout=30"; SqlCommand myCMD = new SqlCommand("SELECT CategoryID, CategoryName FROM Categories;" + "", nwindConn); nwindConn.Open(); SqlDataReader myReader = myCMD.ExecuteReader(); do { //Console.WriteLine("\t{0}\t{1}", myReader.GetName(0), myReader.GetName(1)); Page.Response.Write(myReader.GetName(0)+ " " + myReader.GetName(1)+ "\t"); while (myReader.Read()) //Console.WriteLine("\t{0}\t{1}", myReader.GetInt32(0), myReader.GetString(1)); Page.Response.Write( myReader.GetInt32(0)+ " " + myReader.GetString(1)+ "\t"); } while (myReader.NextResult()); myReader.Close(); nwindConn.Close(); } private void AccessData1() { SqlConnection myConnection = new SqlConnection("user id=sa;pwd=;server=azsw0131;database=pubs;Trusted_Connection=n o"); SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors where state=@state", myConnection); myCommand.SelectCommand.Parameters.Add(new SqlParameter("@state",SqlDbType.NVarChar,2)); myCommand.SelectCommand.Parameters["@state"].Value=My Select.SelectedIndex; DataSet ds = new DataSet(); myCommand.Fill(ds, "Authors");
private void BindData1() { SqlConnection myConnection = new SqlConnection("user id=sa;pwd=;server=azsw0131;database=pubs;Trusted_Connection=n o"); SqlCommand myCommand1 = new SqlCommand("select state from Authors", myConnection); myConnection.Open(); SqlDataReader dr1=myCommand1.ExecuteReader(); MySelect.Items.Add("CA"); MySelect.Items.Add("US"); //MySelect.DataBind(); dr1.Close(); myConnection.Close(); } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Button2.ServerClick += new System.EventHandler(this.Button2_ServerClick); this.Button3.Click += new System.EventHandler(this.Button3_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { AccessData(); } private void Button2_ServerClick(object sender, System.EventArgs e) {
BÁO CÁO KẾT QỦA NGHIÊN CỨU A. Mục ñích nghiên cứu: Tìm hiểu phương pháp triển khai một ứng dụng Web trong Visual Studio.NET, bao gồm: - Các công cụ hỗ trợ triển khai. - Sử dụng các công cụ ñóng gói ứng dụng ASP.NET B. Báo cáo chi tiết: I. Phương pháp triển khai một ứng dụng trong Visual Studio.NET: 1. Nhng tính năng c bn v trin khai mt ng d ng trong .NET Framework: .NET Framework cung cấp một số tính năng cơ bản ñể dễ dàng thực thi một ứng dụng. Những tính năng này bao gồm: - Các ứng dụng không tác ñộng Tính năng này cung cấp việc cô lập ứng dụng và vô hiệu hoá sự xung ñột DLL - Mặc ñịnh là các thành phần riêng: Mặc ñịnh, các thành phần ñược triển khai tới thư mục của ứng dụng và chỉ hiện hữu với ứng dụng ñó - ðiểu khiển sự chia sẻ code - Version cùng tồn tại: Các version của cùng một thành phần hoặc ứng dụng có thể cùng tồn tại, bạn có thể chọn version ñể sử dụng - Tái tạo và triển khai bằng XCOPY: Các thành phần tự mô tả và tự chứa ñựng có thể ñược triển khai mà không cần ñăng ký registry hay chịu sự phụ thuộc nào - Dễ dàng cập nhật: Admin có thể sử dụng các host, ví dụ như ASP.NET, ñể cập nhật DLLs, thậm chí các máy tính từ xa. - Tích hợp với Microsoft Windows Installer: - Dễ dàng triển khai: Phân phối phần mềm dễ dàng, bao gồm cả sử dụng Active Directory - Code cục bộ: ðịnh danh dựa trên code hơn là dựa vào user, cách giải quyết ñược ñặt bởi admin. 2. ðóng gói và trin khai ng d ng . NET Framework: ðóng gói: .NET Framework cung cấp một số tùy chọn sau cho việc ñóng gói ứng dụng:
Created by THÁI NGỌC DUY MSDN based-written.
64 4/12/2007
- Assembly ñơn hoặc bộ sưu tập các assembly: Với tùy chọn này, việc ñóng gói tạo ra file .dll hoặc . exe - Tập tin CAB(cabinet): Tạo thành file nén ñể giảm thời gian phân phối hoặc download - Gói Microsoft Windows Installer hoặc theo một ñịnh dạng installer khác: Tạo thành file .msi ñể sử dụng trong Windows Installer hoặc một file khác sử dụng bởi một installer nào ñó.
Phân phối: .NET Framework cung cấp một số tùy chọn sau cho việc phân phối ứng dụng: - Sử dụng XCOPY hoặc FTP: Bởi vì những ứng dụng Common Language Runtime là tự mô tả và không cần ñăng ký registry, bạn có thể sử dụng XCOPY hoặc FTP ñể copy ứng dụng tới một thư mục thích hợp, và ứng dụng có thể chạy từ thư mục ñó. - Sử dụng code download: Nếu bạn phân phối ứng dụng qua Internet, bạn có thể download code vào máy và chạy ứng dụng ñó. - Sử dụng các chương trình cài ñặt (ví dụ như Windows Installer 2.0): Windows Installer 2.0 có thể cài ñặt, sửa chửa, hoặc xoá các assembly của Microsoft .NET Framework ở nơi lưu giữ assembly toàn cục và trong các thư mục riêng. 3. Gii thi u Microsoft Windows Installer: Triển khai là quá trình phân phối một ứng dụng hoặc một component hoàn chỉnh ñể cài ñặt vào các máy khác. Trong VS.NET, sự triển khai dựa vào kỹ thuật Microsoft Windows Installer. ðây là nhưng công cụ tạo installers cho các ứng dụng hoặc components Windows-based hoặc Web-based Microsoft Window Installer: MWI là một dịch vụ cài ñặt và cấu hình, nó là một phần của Windows 2000, Windows Me, Windows XP. Windows Installer dựa trên mô hình data-driven cung cấp tất cả dữ liệu của quá trình cài ñặt và sự chỉ dẫn trong ñóng gói. Với Windows Installer, mỗi computer lưu giữ một CSDL lưu trữ thông tin những ứng dụng ñã ñược cài ñặt bao gồm files, registry keys và components. Khi một ứng dụng uninstall, thì CSDL này kiểm tra sự phụ thuộc của các ứng dụng khác tới các files, registry keys, components này trước khi thực hiện uninstall. Windows Installer còn cung cấp khả năng tự sửa chửa (self-repair) cho phép ứng dụng tự ñộng cài ñặt lại khi bị mất hoặc thiếu file. Các công cụ triển khai ứng dụng trong VS.NET ñược xây dựng dựa trên nền tảng của Windows Installer, cung cấp nhiều khả năng triển khai và bảo trì ứng dụng 4. Trin khai ng d ng: Triển khai là quá trình mà bạn phân phối một ứng dụng hoặc component hoàn chỉnh ñể cài ñặt vào các máy khác. Trước khi bạn triển khai một giải pháp, bạn cần phải cho Visual Studio biết cái gì cần triển khai, nơi triển khai và cách triển khai nó. Bạn làm ñiền này bằng cách thêm một hoặc nhiều dự án triển khai vào trong giải pháp của bạn. Mỗi dự án triển khai chỉ rõ những dòng lệnh ñể cài ñặt các files và components vào một máy. ðể phân phối ứng dụng, bạn thường tạo một dự án triển khai cách biệt cho mỗi tầng trong ứng dụng. Ví dụ như một ứng dụng 3 tầng cần 3 dự án triển khai, một cho dữ liệu, một cho bussiness logic và một cho client.
Assemblies: Các components thì ñược ñóng gói trong các assemblies. Assemblies là các khối ñược xây dựng của các ứng dụng .NET có thể dùng lại, có thể thay ñổi phiên bản, và tự mô tả. Một assembly là một collection của các
Created by THÁI NGỌC DUY MSDN based-written.
65 4/12/2007
kiểu(type) và resource mà chúng ta xây dựng ñể làm việc với nhau và tạo thành các nhóm chức năng. Một assembly cung cấp Common Language Runtime với các thông tin cần ñể nhận ra sự thi hành các kiểu. Một assembly ñơn giản nhất là một bộ thực thi ñơn chứa tất cả các thông tin cần thiết cho việc triển khai và phiên bản ứng dụng, một kiểu thì không tồn tại bên ngoài bối cảnh của 1 assembly.
Các thao tác trong triển khai: Tạo hoặc thêm một dự án triển khai: Những dự án triển khai cho phép bạn chỉ rõ nơi và cách mà giải pháp sẽ triển khai suốt và sau quá trình phát triển. Một giải pháp có thể có nhiều dự án triển khai. Mỗi dự án có thể ñộc lập về cấu hình. ðể tạo mới một dự án triển khai, thực hiện các bước sau: a. Chọn File Add New Project b. Trong hộp thoại Add New Project, chọn danh mục Setup and Deployment Projects c. Chọn kiểu dự án triển khai mà bạn muốn. Các kiểu này bao gồm: - Merge Module Project: ðóng gói các component ñể có thể chia sẻ với nhiều ứng dụng. - Setup Project: Xây dựng bộ cài ñặt cho ứng dụng Windows-based. - Web Setup Project: Xây dựng bộ cài ñặt cho ứng dụng Web. - Cab Project: Tạo một file Cabinet ñể có thể download trên trình duyệt Web. ðể thêm một dự án triển khai ñã có sẳn vào giải pháp: a. Chọn File Add Existing Project. b. Trong hộp thoại Add Existing Project, browse ñến vị trí của dự án triển khai và chọn Open. Tạo hoặc thêm một dự án Setup: Dự án Setup dùng ñể tạo ra file Windows Installer (.msi) dùng ñể phân phối ứng dụng ñể cài ñặt tới máy khác hoăc Web Server. Có 2 loạt dự án Setup: Dự án Setup tiêu chuẩn tạo ra bộ cài ñặt ñể cài ñặt ứng dụng Windows vào máy khác, dự án Web Setup tạo bộ cài ñặt ñể cài ñặt ứng dụng Web vào Web Server. ðể tạo mới một dự án Setup: a. Chọn File Add New Project. b. Trong hộp thoại Add New Project, chọn danh mục Setup and Deployment Projects. c. Chọn Setup Project cho dự án Setup tiêu chuẩn, Web Setup Project cho dự án Web Setup. ðể thêm một dự án Setup ñã có sẵn vào giải pháp: a. Chọn File Add Existing Project. b. Trong hộp thoại Add Existing Project, browse tới vị trí của dự án Setup và chọn Open. Tạo mới hoặc thêm một dự án Merge Module: Dự án Merge Module ñược dùng ñể ñóng gói các files hoặc components dùng ñể chia sẻ giữa các ứng dụng. Nó tạo ra file Merge Module (.msm) và bao gồm các files, tài nguyên, mục vào registry(registry entries) và Setup Logic cho component. File .msm có thể trộn (merged) với các dự án triển khai khác, ñảm bảo sự cài ñặt component truy cập nhiều ứng dụng. ðể tạo mới một dự án Merge Module:
Created by THÁI NGỌC DUY MSDN based-written.
66 4/12/2007
a. Chọn File Add New Project b. Trong hộp thoại Add New Project, chọn Setup and Deployment Projects. c. Chọn Merge Module Project. ðể thêm một dự án Merge Module ñã có sẵn vào giải pháp: a. Chọn File -> Add -> Existing Project. b. Trong hộp thoại Add Existing Project, browse tới vị trí của dự án Merge Module và chọn Open. Tạo mới hoặc thêm một dự án CAB: Dự án CAB dùng ñể tạo file cabinet (.cab), dùng ñể download các components tới một trình duyệt Web. ðể tạo mới một dự án CAB: a. Chọn File Add New Project. b. Trong hộp thoại Add New Project, chọn Setup and Deployment Projects. c. Chọn Cab Project. ðể thêm một dự án CAB ñã có sẳn vào giải pháp: a. Chọn File Add Existing Project. b. Trong hộp thoại Add Existing Project, browse tới vị trí của dự án CAB và chọn Open. ðặt các thuộc tính cho dự án triển khai: Các dự án triển khai có 2 loại thuộc tính: Thuộc tính dự án chung và thuộc tính cấu hình phụ thuộc. Thuộc tính chung ñươc ñặt trong của sổ Properties và áp dụng cho tất cả cấu hình dự án, ñể ñặt thuộc tính cấu hình phụ thuộc, sử dụng hộp thoại Deployment Properties, thuộc tính này áp dụng cho 1 cấu hình dự án riêng. ðể ñặt thuộc tính cấu hình phụ thuộc: a. Chọn View -> Property Pages. b. Chọn một cấu hình từ danh sách các cấu hình (Configuration list). c. Chọn một category trong danh sách các categories. Thuộc tính của category ñược chọn sẽ hiển thị Thêm các items vào dự án triển khai: ðể tạo bộ cài ñặt, bạn cần phải chỉ rõ những gì chứa trong bộ cài ñặt và nơi mà nó sẽ cài ñặt vào máy. ðể làm ñiều này chúng ta thêm các items vào dự án triển khai. Các loại items chúng ta có thể thêm vào dự án triển khai bao gồm: Project outputs, files, Merge Modules và các components. ðể thêm một Project output hoặc file vào dự án triển khai: a. Chọn File System Editor: Một dự án triển khai bao gồm 6 trình soạn thảo (editor), ñó là: File System Editor, Registry Editor, File Types Editor, User Interface Editor, Custom Action Editor và Launch Conditions Editor. ðối với dự án Merge Module thì không có User Interface Editor, dự án CAB thì không có một editor nào. Khi một dự án triển khai ñược thêm vào giải pháp thì File System Editor ñược hiển thị mặc ñịnh. ðể mở một trình soạn thảo: - Chọn dự án triển khai trong Solution Explorer
Created by THÁI NGỌC DUY MSDN based-written.
67 4/12/2007
- Chọn View Editor và nhấp chuột vào tên của trình soạn thảo mà bạn muốn mở. b. Chọn 1 folder trên máy ñích nơi mà item sẽ ñược cài ñặt. Bạn có thể tạo mới hoặc xoá các folder trên máy ñích. Mặc ñịnh thì File System Editor hiển thị một tập chuẩn các folder ñại diện cho cấu trúc các folder trên máy ñích. Có 2 loại folder là Special folder và Custom folder: - Special folders là những folder trong File System Editor ñại diện cho những folder ban ñầu trong Windows. Sử dụng Special folder trong dự án triển khai cho phép bạn chọn folder ñích trong máy ñích mà không cần biết ñường dẫn thực sự của nó. - Custom folders là các folder ñặc biệt ñại diện cho các folder trong máy ñích. Khác với Special folders, Custom folder không phụ thuộc vào các folder có sẳn, nó cho phép bạn tạo mới một folder trong quá trình cài ñặt. ðể thêm một Special folder: - Trong Folder List của File System Editor, chọn File System on Target Machine. - Trong menu Action, chọn Add Special Folder, nhấp chọn loạI Special folder. ðể thêm một Custom folder: - Trong Folder List của File System Editor, chọn File System on Target Machine. - Trong menu Action, chọn Add Special Folder, nhấp chọn Custom Folder hoặc Web Custom Folder. - Gõ vào tên của custom folder. ðể thêm một Subfolder: - Chọn một folder trong File System Editor - Trong menu Action, chọn Add Folder - Gõ vào tên của folder ðể xoá một folder: - Chọn 1 folder và chọn Delete trong menu Edit c.
Trong menu Action, chon Add Project Output (hoặc File). Chọn item cần thêm trong hộp thoại.
ðể thêm một Merge Module hoặc component vào dự án triển khai: a. Chọn dự án triển khai trong Solution Explorer. b. Trong menu Project, chọn Add Merge Module (hoặc Component). Chọn item cần thêm trong hộp thoạI Thêm và xoá các icons: Icons ñược cài ñặt và kết hợp với ứng dụng ở máy ñích trong suốt quá trình cài ñặt. Bạn có thể chọn các icon xuất hiện trong cửa sổ Windows Explorer của máy ñích, bạn cũng có thể chọn icon xuất hiện trong hộp thoạI Add/Remove Programs. ðể làm ñiều này, ta thiểt lập thuộc tính Icon hoặc AddRemoveProgramsIcon. ðể thêm một Icon vào ứng dụng: a. Tạo một shortcut cho ứng dụng trong File System Editor, bằng cách: - Trong File System Editor, chọn file hoặc folder bạn muốn tạo shortcut. Chú ý khi tạo shortcut cho Special folder, phải gán thuộc tính AlwaysCreate của folder = True.
Created by THÁI NGỌC DUY MSDN based-written.
68 4/12/2007
- Trong menu Action, chọn Create Shortcut to. Shortcut xuất hiện trong File List. - Chọn shortcut, và chọn menu Edit Cut. - Trong Folder List, chọn folder muốn hiển thị shortcut, chọn Edit Paste. Xoá shortcut bằng cách chọn shortcut trong File List và chọn Edit Delete. b. Chọn shortcut trong File System Editor c. Trong cửa sổ Properties, chọn thuộc tính Icon Browse. d. Trong hộp thoại Icon, chọn Browse. e. Trong hộp thoại Select item in project, chọn folder và chọn file chứa Icon. ðể thêm một Icon Add/Remove Programs vào ứng dụng: a. Chọn dự án Setup hoặc Web Setup trong Solution Explorer. b. Trong cửa sổ Properties, chọn thuộc tính AddRemoveProgramsIcon Browse. c. Trong hộp thoại Icon, chọn Browse d. Trong hộp thoại Select item in project, chọn folder và chọn file chứa Icon. ðể xoá một Icon: Trong cửa sổ Properties, chọn thuộc tính Icon hoặc AddRemoveProgramsIcon, sau ñó chọn None trong danh sách.
Các phương thức khác của việc triển khai: Có một số phương thức khác của việc triển khai một ứng dụng. Trong hầu hết các trường hợp, các công cụ triển khai cung cấp nhiểu bộ cài ñặt mạnh. Tuy nhiên, trong vài trường hợp ñơn giản thì các phương thức có thể thích hợp.
IV.
Lệnh Copy Project: ðối với dự án Web, lệnh Copy Project ñược hiển thị trong menu Project. Copy Project là một cách ñơn giản ñể sao chép nội dung dự án tới Web Server, nhưng nó không tự ñộng cấu hình thư mục IIS (Internet Information Service). Mặc ñịnh thì lênh Copy Project tạo một ứng dụng Web mới ở Server ñích và chỉ copy những file yêu cầu ñể chạy ứng dụng. ðể sử dụng lệnh Copy Project thì FrontPage Server Extensions phải ñược cài ñặt trên Server ñích. Những bước cơ bản ñể copy một dự án vào server: a. Trong menu Project, chọn Copy Project. b. Chọn thư mục dự án ñích. c. Chọn phương thức truy cập Web. d. Chọn file cần copy Lệnh XCOPY: Lệnh XCOPY là một cách ñơn giản ñể copy một dự án hoặc một ứng dụng từ vị trí này tới vị trí khác. XCOPY không ñăng ký vị trí của assemblies, và với ứng dụng Web nó không tự ñộng cấu hình thư mục IIS Third-party Installation Tools: Các công cụ này ủng hộ các tính năng của Windows Installer, không ñược ủng hộ bởi sự triển khai trong Visual Studio.
Triển khai ứng các ứng dụng ứng WEB Projects: 1. Làm vi c vi WEB Projects:
Created by THÁI NGỌC DUY MSDN based-written.
69 4/12/2007
Các ứng dụng Web ASP.NET và các dịch vụ Web XML cho phép bạn tạo ra các ứng dụng ñể nâng cao năng lực của World Wide Web. Các loại dự án này ñược chạy trên một Web Server, chuyển và nhận thông tin thông qua các giao thức chuẩn như HTTP và XML. Sử dụng Web Projects, bạn có thể tạo ñược mọi thứ từ Web site truyền thống phục vụ những trang HTML ñể nâng cao tính năng của các ứng dụng kinh doanh chạy trên mạng intranet hoặc Internet… Visual Basic và Visual C# bao gồm các template cho phép bạn tạo ra 3 loại dự án Web-based: - ASP.NET Web Application template: Lập trình ứng dụng Web với các designer ñể tạo ra các Web Forms page kết hợp các tính năng của ASP.NET - ASP.NET Web Server template: Một ứng dụng cung cấp khả năng trao ñổi thông báo giữa các trang Web sử dụng các giao thức như HTTP, XML, XSL, SOAP và WSDL. - Empty Web Project template: Một ứng dụng Web rỗng mà bạn có thể tùy chỉnh 2. Biên d ch và trin khai ng d ng WEB Projects: Visual Studio cung cấp một cơ cấu ñơn giản ñể triển khai các ứng dụng tới các máy cục bộ hoặc các máy remote. Bạn có thể cài ñặt ứng dụng bằng cách ñơn giản là sao chép chúng vào các thư mục ứng dụng ñã ñược chỉ rõ hoặc bằng cách sử dụng nhiều dự án triển khai chuyên dụng và có thể cấu hình ñược Khi sử dụng Visual Studio.Net ñể xây dựng các ứng dụng Web ASP.NET, bạn sử dụng một mô hình triển khai tổng quát, dự án sẽ ñược biên dịch và các file kết quả sẽ ñược triển khai. Web Forms code trong class file (.aspx.vb hoặc là . aspx.cs) ñược biên dịch vào một file .dll. File này sau ñó sẽ triển khai tới Server mà không có source code nào. Khi một yêu cầu trong trang ñược nhận, file .dll sẽ ñược thực thi. Biên dịch và triển khai: Giả sử bạn có một ứng dụng Web ASP.NET ñơn giản gọi là WebApplication1 bao gồm: - Một Web Forms page tên là WebForm1.aspx - Một số module thêm vào chứa business logic gọi là BusinessLogic1(.vb hoặc .cs) và BusinessLogic2(.vb hoặc .cs). Sau khi bạn hiệu chỉnh và biên dịch dự án: - Tất cả các file trong dự án ñược lưu lại từ lần build cuối cùng. - File WebForm1.aspx và các file mặc ñịnh của dự án ñược copy vào Web server. File Class WebForm1(.aspx.vb hoặc .aspx.cs), component BusinessLogic1 và component BusinessLogic2 ñược biên dịch trong file .dll, file này ñược copy mặc ñịnh vào thư mục \Bin của thư mục ảo Triển khai một ứng dụng ASP.NET: - ðóng gói thành file chạy .exe hoặc file .dll - Phân phối: Sử dụng XCOPY hoặc FTP Bạn có thể sử dụng XCOPY hoặc FTP ñể triển khai một ứng dụng ASP.NET tới server. Bạn có thể chạy một phiên bản của ứng dụng bên cạnh phiên bản khác, bạn có thể update ứng dụng mà không phải ñóng ứng dụng. Common Laguage Runtime chạy một ứng dụng ñồng thời với các ứng dụng khác mà không có sự xung ñột về DLL Triển khai các ứng dụng XML Web Services:
Created by THÁI NGỌC DUY MSDN based-written.
70 4/12/2007
Triển khai một ứng dụng XML Web Service bao gồm việc sao chép file .asmx và các assembly khác ñược sử dụng bởi XML Web Service (nhưng không phải là thành phần của .NET Framework) tới Web server. VD: Giả sử bạn có một XML Web Service tên là StockServices. ðể triển khai XML Web Service, bạn tạo một thư mục ảo trên Web server và ñặt file .asmx vào thư mục ñó. Một cách triển khai ñiển hình gồm cấu trúc thư mục sau:
\Inetpub \WWWRoot \StockServices StockServices. Asmx \Bin Assembly sử dụng bởi XML Web Services không phải là thành phần của .NET Framework. Các mục ñược triển khai tới Web Server khi công bố một XML Web Service:
7.1
Mục
7.2
Thư mục ứng dụng Web
Tập tin <MyXMLWebSevice>.asmx Tập tin <MyXMLWebService>.disco
Tập tin Web.config Thư mục \Bin
Mô tả
Thư mục gốc của XML Web Service. Các file còn lại ñược ñặt trong thư mục này. Thư mục này có thể Gõ dấu là một ứng dụng Web IIS. URL ñể client gọi XML Web Service Cơ chế discovery của XML Web Service(file này là tùy chọn, không ñược tự ñộng tạo ra bởi XML Web Service) (Tùy chọn) Nếu bạn muốn ghi ñè các thiểt lập mặc ñịnh vể cấu hình, bạn có thể bao gồm file Web.config Lưu giữ các file nhị phân của XML Web Service. Nếu lớp XML Web Service không có cùng file .asmx thì assembly chứa lớp phải là thư mục \Bin
3. Ví d trin khai ng d ng WEB Project: Ví dụ sau ñây chúng ta sẽ tạo một ứng dụng Web Forms ñơn giản sử dụng Visual Basic, và tạo bộ cài ñặt ñể triển khai ứng dụng tới Web server. Tạo ứng dụng Web Forms: Trong menu File, chọn New Project Trong hộp thoại New Project, chọn Visual Basic Projects trong ô Project Types và chọn ASP.NET Web Application trong ô Templates. Gõ http://localhost/WebApp1 vào ô Location. Dự án ñược thêm vào Solution Explorer và Web Forms Designer ñược mở Chọn tab Web Forms trong Toolbox và chọn Button kéo vào Web Form. Nhấp ñúp Button và thêm sự kiện handler cho(even handler) Button. Trong even handler, gõ vào ñoạn mã sau:
8
Button1.Text = “abc” ðiều này sẽ làm thay ñổI text hiển thị trên Button1 khi nó ñược click Trong menu Build, chọn Build WebApp1
Created by THÁI NGỌC DUY MSDN based-written.
71 4/12/2007
Tạo dự án triển khai (Deployment project): Trong menu File, chọn Add Project New Project. Trong hộp thoại Add New Project, chọn Setup and Deployment Projects trong ô Project Type và chọn Web Setup Project trong ô Templates. Gõ WebDeploy vào ô Name. Dự án ñược thêm vào Solution Explorer, và File Systems Editor ñược mở. Trong cửa sổ Properties, chọn thuộc tính ProductName và gõ vào WebApp1.
Thêm thông tin dự án WebApp1 vào dự án triển khai: Trong File Systems Editor, chọn thư mục Web Application. Chọn menu Action Add Project Output. Trong hộp thoại Add Project Output Group, chọn WebApp1 từ danh sách drop-down Project. Chọn Primary Output và nhóm Content Files từ danh sách drop-down và click OK.
ðặt thuộc tính cho Installer: Chọn thư mục WebApplication. Trong cửa sổ Properties, ñặt giá trị xyz cho thuộc tính VirtualDirectory. Trong cửa sổ Properties, ñặt giá trị cho thuộc tính DefaultDocument là WebForm1.aspx. Trong menu Build, chọn Build WebDeploy.
Triển khai ứng dụng tới Web server trong máy của bạn: Trong Solution Explorer, chọn dự án WebDeploy. Chọn Install từ menu Project. ðể truy nhập ứng dụng Web ñã ñược triển khai, mở Internet Explorer gõ vào ñịa chỉ http://localhost/xyz. Trong trang Web hiện lên, bạn sẽ thấy text của button thay ñổi khi click vào nó
Triển khai ứng dụng tới Web server trong máy khác: Trong Windows Explorer, chỉ tới thư mục của dự án và tìm Installer ñã ñược build. ðường dẫn mặc ñịnh sẽ là: \documents and settings\yourloginname\ My Documents\Visual Studio Projects\WebDeploy\project configuration\WebDeploy.msi. Project Configuration mặc ñịnh là Debug. Sao chép file WebDeploy.msi và tất cả các file và thư mục con trong thư mục vào Web server của máy ñích Trong máy Web server, nhấp ñúp file Setup.exe ñể chạy installer. Lưu ý là bạn phải có Install permissions ñể chạy installer, và bạn phải có IIS permissions ñể cài ñặt vào Web server ðể truy cập ứng dụng Web ñã ñược triển khai, mở Internet Explorer, gõ vào ñịa chỉ http:// [ComputerName]/xyz.
Uninstall ứng dụng:
Created by THÁI NGỌC DUY MSDN based-written.
72 4/12/2007
Trong Windows Control Panel, nhấp ñúp Add/Remove Programs Trong hộp thoại Add/Remove Programs, chọn WebApp1 và chọn Remove. ðể uninstall từ máy của bạn, chọn Project Uninstall
4. Làm vi c vI các Editor trong d án Setup: Một dự án triển khai có tất cả 6 editor là: File System Editor, Registry Editor, File Type Editor, User Interface Editor, Custom Actions Editor và Launch Conditions Editor. a. File System Editor: Cho phép bạn thêm Project outputs, files và các items khác vào dự án triển khai và ñịnh nghĩa nơi nó ñược cài ñặt. Mặc ñịnh thì File System Editor một tập chuẩn các thư mục phù hợp với cấu trúc thư mục chuấn trên máy ñích. Bạn có thể thêm một thư mục con vào thư mục nào ñó, chọn thư mục ñặt biệt từ danh sách hoặc thêm một folder vào vị tri top-level. Khi bạn chọn một thư mục hoặc một item trong File System Editor thì một vài thuộc tính liên quan tới nó sẽ ñược hiển thị, bạn có thể chỉnh sửa các thuộc tính này trong cửa sổ Properties. - Thêm Project outputs: • Trong menu Action, chọn Add Project outputs • Trong hộp thoại Add Project Output Group, chọn project từ danh sách Projects. • Chọn loại output từ danh sách output, bạn có thể chọn nhiều loại output từ danh sách output. • Bạn có thể tùy chọn cấu hình từ danh sách Configuration. • ðể xoá Project output thì chọn một project output và chọn Delete trong menu Edit. - Thêm files: • Chọn một folder trong File System Editor. • Trong menu Action, chọn Add File • Trong hộp thoại Add Files, chỉ ñường dẫn ñến file mà bạn muốn thêm vào và chọn nó • ðể xoá file thì chọn file và chọn Delete trong menu Edit. - ðặt ñiều kiện cài ñặt cho 1 file: • Chọn một file trong File System Editor • Trong cửa sổ Properties, chọn thuộc tính Condition và ñặt ñiều kiện vào thuộc tính này - Thêm và xoá các Assemblies: • Chọn một folder trong File System Editor • Trong menu Action, chọn Add Component • Trong hộp thoại Component Selector, chỉ ñường dẫn tới Assembly và chọn nó • ðể xoá một Assembly ta chọn nó rồi chọn Delete trong menu Edit. b. Registry Editor: Cho phép bạn tạo các khóa registry và giá trị của nó ñể add vào registry trong máy ñích. - Thêm và xoá Registry Keys trong Registry Editor: • Chọn một key node trong Registry Editor • Trong menu Action, chọn New Key
Created by THÁI NGỌC DUY MSDN based-written.
73 4/12/2007
• ðặt tên cho key và sửa ñổi các thuộc tính khác của key trong cửa sổ Properties nếu cần thiểt • ðể xoá một key trong Registry Editor, chọn một key và chọn Delete trong menu Edit. - Thêm và xoá Registry Values trong Registry Editor: • Chọn một key node (không phải là top-level key) trong Registry Editor • Trong menu Action, chọn New String Value, Binary Value hoặc DWORD Value. • ðặt tên cho value • Trong cửa sổ Properties, Gõ vào giá trị value trong thuộc tính Value. • ðể xoá một registry value, ta chọn một value và chọn Delete trong menu Edit - Tạo một Default Registry Value: • Chọn tên value trong Registry Editor • Trong menu File, chọn Rename • Chọn Delete trong menu Edit • Nhấn Enter, giá trị ñược thay bằng “(Default)” - Import Registry Files vào Registry Editor • Chọn node Registry on Target Machine trong Registry Editor • Trong menu Action, chọn Import • Trong hộp thoại Import Registry File, chỉ ñường dẫn tớI registry file và chọn Open c. File Types Editor: Dùng ñể thiết lập sự kểt hợp file trong máy ñích, bằng cách kểt hợp phần mở rộng của file với ứng dụng và chỉ ra các hoạt ñộng cho phép với mỗi loại file. - Thêm, xoá Document Types và Associated File Extensions trong File Types Editor: • ðể thêm một Document Type, chọn node File Types on Target Machine trong File Types Editor. • Trong menu Action, chọn Add File Type • Gõ tên mô tả cho File Type mới • ðể kết hợp phần mở rộng của file, chọn một node Document Type trong File Types Editor. • Trong cửa sổ Properties, chọn thuộc tính Extensions và gõ vào phần mở rộng. • ðể kết hợp một File thực thi, chọn node Document Type trong File Types Editor • Trong cửa sổ Properties, click nút Ellipsis bên cạnh thuộc tính Command • Trong hộp thoại Select Item in project, click nút Add File • Chọn một file thực thi kết hợp với file type. • ðể xoá một Document Type, chọn nó và chọn Delete trong menu Edit - Thêm và xoá Actions trong File Type Editor • Chọn node File Type trong File Types Editor • Trong menu Action, chọn Add Action • Gõ vào tên cho action, ñây là tên action hiển thị trong context menu của file • Trong cửa sổ Properties, chọn thuộc tính Verb và gõ vào ñộng từ. ðây là tên ñược dùng ñể lập trình cho ứng dụng thực thi code khi action ñuợc gọi
Created by THÁI NGỌC DUY MSDN based-written.
74 4/12/2007
- Chỉ rõ Default Action trong File Types Editor: • Chọn 1 node Document Type trong File Types Editor • Trong menu Action, chọn Set As Default - Thay ñổi Display Order của Action trong File Types Editor • Chọn 1 node Document Verb trong File Types Editor • Trong menu Action, chọn Move Up hoặc Move Down d. User Interface Editor:
ñược ñịnh nghĩa trước trình cài ñặt.
Dùng ñể chỉ rõ và ñặt các thuộc tính cho các hộp thoại ñược hiển thị trong quá User Inteface Editor là một cây có 2 section là Install và Admin. Phần Install chứa các hộp thoại ñược hiển thị khi end user chạy cài ñặt ứng dụng. Phần Admin chứa các hộp thoại ñược hiển thị khi người quản trị hệ thống upload bộ cài ñặt lên mạng. Những hộp thoại ñược ñịnh nghĩa trước ñược chia thành 3 loại: Các hộp thoại Start ñược hiển thị trước khi quá trình cài ñặt bắt ñầu (dùng ñể tập hợp thông tin người dùng hay thay ñổi ñường dẫn mà ứng dụng ñược cài vào). Hộp thoại Progess, và các hộp thoại End ñược hiển thị khi ứng dụng ñã cài ñặt thành công. - Thêm và xoá Installation Dialog Boxes trong User Interface Editor • ðể thêm một dialog box, chọn node Start, Progess hoặc Finish trong phần Install của User Interface Editor. • Trong menu Action, chọn Add Dialog. • Trong hộp thoại Add Dialog, chọn một dialog box mà bạn muốn thêm vào • ðể thay ñổi thứ tự hiển thị của Dialog box, chọn một node dialog box • Trong menu Action, chọn Move Up hoặc Move Down. • ðể xoá một Dialog box, chọn một Dialog box trong User Interface Editor và chọn Delete trong menu Edit - Thay ñổi Dialog box: • ðể thay ñổi các thuộc tính của Dialog box, chọn một node dialog box • Trong cửa sổ Properties, chỉnh sửa những thuộc tính của dialog box e. Custom Actions Editor: Cho phép bạn chỉ rõ những thực thi ñược thêm vào máy ñích vào cuối quá trình cài ñặt. Custom Actions ñược biên dịch thành file .dll hoặc .exe hoặc ñược thêm vào Project như là một script hoặc assembly trước khi nó có thể thêm vào dự án triển khai. Action chỉ có thể chạy vào cuốI quá trình cài ñặt. Custom Actions Editor có chứa 4 folder tương ứng với mỗi giai ñoạn của quá trình cài ñặt: Install, Commit, Rollback
Created by THÁI NGỌC DUY MSDN based-written.
75 4/12/2007
và Uninstall. Custom action ñược chạy trong các giai ñoạn này. - Thêm và xoá Custom Actions trong Custom Actions Editor: • ðể thêm một Custom Action, chọn một folder trong Custom Actions Editor • Trong menu Action, chọn Add Custom Action • Trong hộp thoại Select item in Project, chọn một folder và chọn file .dll. file .exe hoặc project output mà có chứa custom action • ðể thay ñổi thứ tự thực thi, chọn một Custom Action trong Custom Actions Editor • Trong menu Action, chọn Move Up hoặc Move Down • ðể xóa một custom action, chọn nó trong Custom Actions Editor và chọn Delete trong menu Edit - Thêm Predefined Custom Action trong Custom Actions Editor: • ðể thêm một Installation Component vào dự án triển khai, chọn một folder trong Custom Actions Editor. • Trong menu Action, chọn Add Custom Action • Trong hộp thoại Select item in Project, mở folder chứa installation component và chọn primary output. f.
Launch Conditions Editor: Cho phép bạn chỉ rõ ñiều kiện cần giúp cho quá trình cài ñặt ñược thành công. Ví dụ như bạn muốn kiểm tra phiên bản của hệ ñiều hành, tìm kiếm file… - Thêm một File Launch Condition: • Chọn node Requirements on Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add File Launch Condition • Chọn node Search for File. Trong cửa sổ Properties, chọn thuộc tính FileName và gõ vào tên file cần tìm. • Chọn thuộc tính Folder và gõ vào tên của Folder bắt ñầu tìm kiếm (ví dụ như [ProgramFilesFolder] hoặc C:\Program Files\MyProgram) • Bạn có thể tùy chọn các thuộc tính khác như depth (số cấp thư mục tìm kiếm), date, size và version. • Chọn node Condition, trong cửa sổ Properties, chọn thuộc tính Message và gõ vào thông báo hiển thị khi file không ñược tìm thấy - Thêm .NET Framework Launch Condition: • Chọn node Requirements on Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add .NET Framework Launch Condition • Chọn node Condition, trong cửa sổ Properties, thuộc tính Message chứa một thông báo chuẩn là [VSDNETMSG], bạn có thể thay thể giá trị này bằng một chuỗi thông báo khác. - Thêm một Registry Launch Condition: • Chọn node Requirements on Target Machine trong Launch Conditions Editor
Created by THÁI NGỌC DUY MSDN based-written.
76 4/12/2007
-
-
-
-
Created by THÁI NGỌC DUY MSDN based-written.
• Trong menu Action, chọn Add Registry Launch Condition • Chọn node Search for RegistryEntry. Trong cửa sổ Properties, chọn thuộc tính Root và chọn node registry cần tìm • Chọn thuộc tính RegKey và gõ vào tên của khoá registry cần tìm • Bạn cũng có thể tùy chọn thuộc tính Value ñể tìm một giá trị trong khoá registry • Chọn node Condition. Trong cửa sổ Properties, chọn thuộc tính Message và gõ vào thông báo hiển thị nểu Registry entry không ñược tìm thấy. Thêm một Windows Installer Launch Condition: • Chọn node Requirements on Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add Windows Installer Launch Condition • Chọn node Search for Component. Trong cửa sổ Properties, chọn thuộc tính ComponentId và gõ vào giá trị ID của Component cần tìm • Chọn node Condition. Trong cửa sổ Properties, chọn thuộc tính Message và gõ vào thông báo hiển thị khi Component ID không ñưọc tìm thấy Thêm một Internet Information Services Launch Condition: • Chọn node Requirements on Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add Internet Information Services Launch Condition • Chọn node Condition. Trong cửa sổ Properties, giá trị mặc ñịnh của thuộc tính Condition là REGISTRYVALUEn >= “#5”, có nghĩa là giá trị chứa trong registry key phải >=4 (IIS 4.0). Nếu bạn muốn tìm version khác thì thay ñổi giá trị thuộc tính này. • Bạn có thể tùy chọn thuộc tính Message, nó chứa một giá trị mặc ñịnh là [VSDIISMSG], bạn có thể thay thế nó nếu cần Thêm một File Search trong Launch Conditions Editor: • Chọn node Search Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add File Search • Trong cửa sổ Properties, gõ tên file vào thuộc tính FileName mà bạn muốn tìm • Bạn có thể tùy chọn nơi tìm kiếm và các thuộc tính tìm kiếm • ðể xoá một File Search, chọn nó ở trong Launch Conditions Editor và chon Delete trong menu Edit. Thêm một Registry Search trong Launch Conditions Editor: • Chọn node Search Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add Registry Search • Trong cửa sổ Properties, ñặt các thuộc tính Root và RegKey cho registry key mà bạn muốn tìm • Bạn có thể tùy chọn thuộc tính Value ñể tìm một giá trị nào ñó
77 4/12/2007
-
-
-
-
Created by THÁI NGỌC DUY MSDN based-written.
• ðể xoá một Registry Search, chọn nó trong Launch Conditions Editor và chọn Delete trong menu Edit. Thêm một Windows Installer Search trong Launch Conditons Editor: • Chọn node Search Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add Component Search • Trong cửa sổ Properties, ñặt giá trị cho thuôc tính ComponentId (số GUID) mà bạn muốn tìm • ðể xoá một Windows Installer Search, chọn nó trong Launch Conditions Editor và chọn Delete trong menu Edit Thêm một Launch Condition cho Microsoft Data Access Components: • Chọn node Requirements on Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add Registry Launch Condition • Chọn node Search for RegistryEntry1. Trong cửa sổ Properties, chọn thuộc tính RegKey và gõ vào Software\Microsofr\DataAccess • Gõ vào giá trị vsdrrHKLM cho thuộc tính Root • Gõ vào giá trị FullInstallVer cho thuộc tính Value • Gõ vào giá trị MDACSEARCH cho thuộc tính Property • Chọn node Condition1 trong Launch Conditions Editor, trong cửa sổ Properties, Gõ vào giá trị MDACSEARCH >= “2.6” • Chọn thuộc tính Message và gõ vào MDAC version 2.6 or higher must be installed prior to installing this application. You can install MDAC from the Microsoft Web site http://www.microsoft.com Thêm một Launch Condition trong Launch Conditions Editor: • Chọn node Launch Condition trong Launch Conditions Editor • Trong menu Action, chọn Add Launch Condition • Gõ vào tên cho condition • Trong cửa sổ Properties, gõ vào ñiều kiện cho thuộc tính Condition • Chọn thuộc tính Message, và gõ vào nộI dung thông báo khi ñiều kiện trả về false. • ðể xoá một Launch Condition, chọn nó trong Launch Conditions Editor và chọn Delete trong menu Edit Sử dụng Registry Launch Condition ñể chỉ ra Target Directory • Chọn node Requirements on Target Machine trong Launch Conditions Editor • Trong menu Action, chọn Add Registry Launch Condition • Chọn node Search for RegistryEntry. Trong cửa sổ Properties, chọn registry root trong thuôc tính Root
78 4/12/2007
• Gõ vào tên của registry key trong thuộc tính RegKey • Gõ vào giá trị registry trong thuộc tính Value • Gõ vào tên cho thuộc tính Property, ví dụ như SearchForIE • Chọn node Condition. Trong cử sổ Properties, chọn thuộc tính Condition và gõ vào ñiều kiện tìm kiếm • Chọn thuộc tính Message, và gõ vào thông báo hiển thị nếu giá trị registry không ñược tìm thấy • Trong menu View, chọn Editor File System • Chọn node File System on Target Machine trong File System Editor • Trong menu Action, chọn Add Special Folder hoặc Custom Folder • Trong cửa sổ Properties, chọn thuộc tính DefaultLocation và gõ vào giá trị chỉ vị trí (Giá trị của thuộc tính Property ở trên: [SearchForIE]) 5. Ví d s d ng Custom Action ñ to database trong quá trình cài ñt: Trong ví dụ sau, chúng ta sẽ sử dụng custom action và thuộc tính CustomActionData ñể tạo CSDL và các bảng trong quá trình cài ñặt. a. Tạo một Installer Class: • Trong menu File, chọn New Project • Trong hộp thoại New Project, chọn Visual C# Projects trong khung Project Type và chọn Class Library trong khung Templates. Gõ vào DBCustomAction trong ô Name và nhấn OK. • Trong menu Project, chọn Add New Item • Trong hộp thoại Add New Item, chọn Installer Class. Gõ vào DBCustomAction trong ô Name. b. Tạo một ñối tượng Data Connection: • Trong Server Explorer, chọn Data Connections, nhấp phảI chuột và chọn Add Connection • Trong hộp thoại Data Link Properties, nhập vào Server name, user name và password. Trong ô database, gõ vào master và ñánh dấu chọn Allows saving password • Kéo Connection vừa tạo và thả nó vào phần thiết kế của DBCustomAction.cs ñể tạo ñối tượng sqlConnection1 c. Tạo file text chứa câu lệnh SQL ñể tạo Database: • Trong Solution Explorer, chọn project DBCustomAction. Trong menu Project, chọn Add New Item • Trong hộp thoại Add New Item, chọn Text File. Gõ vào sql.txt trong ô Name (phải gõ chữ thường) • Gõ nội dung sau vào file sql.txt: CREATE TABLE [dbo].[Employees] ( [Name] [char] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [Rsvp] [int] NULL , [Requests] [nvarchar] (4000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) ON [PRIMARY]; ALTER TABLE [dbo].[Employees] WITH NOCHECK ADD CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED
Created by THÁI NGỌC DUY MSDN based-written.
79 4/12/2007
( [Name] ) ON [PRIMARY]; • Trong Solution Explorer, chọn sql.txt. Trong cửa sổ Properties, ñặt giá trị cho thuộc tính BuildAction là Embedded Resource d. Thêm code vào installer class ñể ñọc file text: • Trong Solution Explorer, chọn project DBCustomAction.cs. Trong menu View, chọn Code • Thêm vào câu lệnh sau vào phần ñầu của module: using System.IO; using System.Reflection; • Thêm ñoạn code sau vào class: private string GetSql(string name) { try { //Get the current assembly Assembly Asm= Assembly.GetExecutingAssembly(); //Resources are named using a qualified name Stream Strm =Asm.GetManifestResourceStream(Asm.GetName().Name + "." + name); //Read the contents of the embedded file StreamReader reader=new StreamReader(Strm); return reader.ReadToEnd(); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show("In GetSQL: " + ex.Message ); throw ex; } } private void ExecuteSql(string DatabaseName,string sql) { System.Data.SqlClient.SqlCommand Command= new System.Data.SqlClient.SqlCommand(sql, sqlConnection1); Command.Connection.Open(); Command.Connection.ChangeDatabase(DatabaseN ame); try { Command.ExecuteNonQuery(); } finally { //Finally, block are a great way to ensure that the //connection is always closed Command.Connection.Close(); }
Created by THÁI NGỌC DUY MSDN based-written.
80 4/12/2007
} protected void AddDBTable(string strDBName) { try { //create the database ExecuteSql("master","CREATE DATABASE " + strDBName); //create the tables ExecuteSql(strDBName,GetSql("sql.txt")); } catch (Exception ex) { //report any errors and abort System.Windows.Forms.MessageBox.Show("In exception handler: " + ex.Message); throw ex; } } public override void Install(System.Collections.IDictionary stateSaver ) { base.Install(stateSaver); AddDBTable(this.Context.Parameters["dbname"]); } • Trong menu Project, chọn Add Reference.., chọn System.Windows.Forms.dll, nhấn Select và nhấn OK. • Trong menu Build, chọn Build DBCustomAction. e. Tạo một dự án triển khai: • Trong menu File, chọn Add Project New Project • Trong hộp thoại Add Project, chọn Setup and Deployment Projects trong khung Project Type và chọn Web Setup Project trong ô Templates. Gõ vào DBCustomAction Installer trong ô Name. • Trong cửa sổ Properties, gõ vào DB Installer cho thuộc tính ProductName. • Trong File System Editor, chọn thư mục Web Application Folder. Trong menu Action, chọn Add Project Output • Trong hộp thoại Add Project Output Group, chọn primary output cho project DBCustomAction f.
Tạo một custom installation dialog: • Chọn project DBCustomAction Installer trong Solution Explorer. Trong menu View, chọn Editor User Interface • Trong User Interface Editor, chọn node Start ngay dưới node Install. Trong menu Action, chọn Add Dialog • Trong hộp thoại Add Dialog, chọn dialog Textboxes (A) • Trong menu Action, chọn Move Up, lặp lại cho tới khi Textboxes (A) ñứng trước node Installation Folder • Trong cửa sổ Properties, chọn thuộc tính BannerText và gõ vào Specfy Database Name.
Created by THÁI NGỌC DUY MSDN based-written.
81 4/12/2007
• Chọn thuộc tính BodyText và gõ vào: This dialog allows you to specify the name of the database to be created on the database server. • Chọn thuộc tính Edit1Label và gõ vào Name of DB: • Chọn thuộc tính Edit1Property và gõ vào CUSTOMTEXTA1. • ðặt giá trị false cho các thuộc tính Edit2Visible, Edit3Visible và Edit4Visible. g. Tạo Custom Action: • Chọn project DBCustomAction Installer trong Solution Explorer. Trong menu View, chọn Editor Custom Actions • Trong Custom Action Editor, chọn node Install. Trong menu Action, chọn Add Custom Action • Trong hộp thoại Select item in project, nhấp ñúp thư mục Web Application Folder • Chọn Primary output from DBCustomAction(Active) • Trong cửa sổ Properties, chọn thuộc tính CustomActionData và gõ vào /dbname=[CUSTOMTEXTA1] • Trong menu Build, chọn Build DBCustomActionInstaller. h. Install ứng dụng vào chính máy của bạn: • Chọn project DBCustomAction Installer trong Solution Explorer. Trong menu Project, chọn Install. i.
Triển khai ứng dụng ở một máy khác: • Trong Windows Explorer, tìm tới thư mục của project và tìm file ñã cài ñặt • Copy file DBCustomAction Installer.msi và các file, thư mục con khác vào một máy khác • Khi ñã copy xong, chạy file Setup.exe ở máy vừa ñược chép vào
j.
Uninstall ứng dụng: • Mở Control Panel Add/Remove Programs • Trong hộp thoại Add/Remove Programs, chọn DBCustomAction Installer và click Remove. (ðể Uninstall trong chính máy của bạn, trong menu Project, chọn Uninstall)
CÁC PHƯƠNG PHÁP LƯU TRỮ TRẠNG THÁI. Nội dung: - Tổng quan về các phương pháp lưu trữ trạng thái trong ASP.NET. - ASP.NET Application. - Managing Application State. - Managing Session State. - ViewState. - Cách cấu hình thẻ <sessionState> trong file web.config. Created by THÁI NGỌC DUY MSDN based-written.
82 4/12/2007
-
Cấu hình web server chạy trên nhiều server (ñáp ứng yêu cầu của nhiều client truy cập cùng lúc).
I.
Tổng quát về các phương pháp lưu trữ trạng thái trong Web: ........................................................... I.1 Các tuỳ chọn phía Client:......................................................................................................... I.1 Các tuỳ chọn phía server: ........................................................................................................ II. ASP.NET Application:...................................................................................................................... II.1 ASP.NET Application là gì? ....................................................................................................... II.1 Tạo một Application: ............................................................................................................... II.1 Thời gian sống của một Application: ......................................................................................... II.1 Các chú ý về luồng (thread): ................................................................................................... III. Managing Application State: ........................................................................................................ III.1 Application State:.................................................................................................................... III.1 Sử dụng:................................................................................................................................ IV. Managing Session State: ............................................................................................................. IV.1 Xác ñịnh một session: ............................................................................................................. IV.1 Lưu trữ Session State:............................................................................................................. IV.1 Sử dụng:................................................................................................................................ V. Managing Client-side Cookies:........................................................................................................ VI. ViewState: ................................................................................................................................ VI.1 Khái niệm: ............................................................................................................................ VI.1 Sử dụng:............................................................................................................................... VI.1 Các hạn chế của ViewState:.................................................................................................... VI.1 Làm tăng hiệu suất khi sử dụng ViewState:.............................................................................. VI.1 Disabling ViewState: .............................................................................................................. VII. Cấu hình tag <sessionState> trong file web.config:...................................................................... VII.1 Khái niệm: ............................................................................................................................ VII.1 Sử dụng:............................................................................................................................... VIII. Cách cấu hình cho web server chạy trên nhiều server: ................................................................
9
Tổng quát về các phương pháp lưu trữ trạng thái trong Web: - Ta cần lưu trữ các thông tin có trong trang web do người sử dụng cung cấp ñể sử lí trong một số trường hợp cần thiết. ASP.NET cung cấp rất nhiều phương pháp ñể lưu trữ data trong quá trình hoạt ñộng của trang web. Việc chọn lựa phương pháp nào là tuỳ thuộc vào ứng dụng web của ta và nên dựa vào một số tiêu chí ñánh giá sau: + Số lượng thông tin cần lưu trữ nhiều hay ít? + Các client có chấp nhận các cookies (có thể chiếm chổ trong bộ nhớ của họ) không? + Người phát triển trang web muốn lưu thông tin ở client hay server? + Hiệu suất của trang web mà bạn mong ñợi (tốc ñộ). ASP.NET cung cấp rất nhiều tuỳ chọn cho việc lưu trữ data ở các phía client và server. - Các tuỳ chọn phía Client: + Sử dụng các thuộc tính ViewState. + Sử dụng các trường ẩn (hidden field). + Sử dụng Cookies. Created by THÁI NGỌC DUY MSDN based-written.
83 4/12/2007
-
+ Sử dụng QueryString Các tuỳ chọn phía server: + Application State + Session state + Database Sau ñây là các mô tả về các tuỳ chọn trên. 9.1
Các tuỳ chọn phía Client:
Việc lưu trữ data ở phía client không làm tốn nhiều tài nguyên của server. Do lưu trữ ở client nên sẽ không ñược an toàn về mặt data nhưng hiệu suất của server sẽ cao do các yêu cầu về tài nguyên sẽ không quá cao. Tuy nhiên do phải gửi data về client ñể lưu nên sẽ bị hạn chế về số lượng data mà ta gửi ñi. View State: -
-
-
Mỗi trang web trong ASP.NET tồn tại sẵn một thuộc tính là ViewState dùng ñể chứa các giá trị của một trang. Ta có thể dùng ViewState ñể lưu một giá trị nào ñó của một trang. Ưu ñiểm: + Không yêu cầu tài nguyên của server. + Cài ñặt ñơn giản. + Tự ñộng ghi nhớ trạng thái trang và control. + Làm tăng khả năng bảo mật do dữ liệu ñược ghi ñã ñược mã hoá. Khuyết ñiểm: + Hiệu suất thấp, bởi vì các giá trị ñược lưu giữ trong chính trang ñang sử dụng nó do ñó nếu data lớn sẽ làm cho trang bị chậm khi hiển thị hay trao ñổi data với server. + Bảo mật. ViewState ñược lưu trữ trong các field ẩn trong trang. Mặc dù ñã ñược biến ñổi ñịnh dạng (mã hoá) nhưng nó vẩn có thể bị phá hoại.
Hidden fields: -
-
-
Ta có thể lưu trữ thông tin trên các trường ẩn của trang web. Nên sử dụng các trường ẩn khi có nhu cầu lưu các thông tin nhỏ nhưng có tần suất thay ñổi nhiều từ phía client. ASP.NET cung cấp control HtmlInputHiden cho các trường này. Khi sử dụng các trường ẩn thì phải dùng phương thức Post ñể chuyển dữ liệu Ưu ñiểm: + Không yêu cầu tài nguyên từ server. + ðược hỗ trợ rộng rãi từ hầu hết các trình duyệt (browser) và client. + Cài ñặt ñơn giản. Khuyết ñiểm: + Tính bảo mật. Các trường ẩn có thể bị nhìn thấy khi view source của trang. + Bị hạn chế về cấu trúc lưu trữ. Không thể lưu trữ một cấu trúc trong các field ẩn trừ khi ta phải ghép lại thành một chuổi và có cơ chế phân tích ngược trở lại thích hợp.
Created by THÁI NGỌC DUY MSDN based-written.
84 4/12/2007
+ Hiệu suất. Giống như View State do lưu trữ cùng với trang. Cookies: -
-
Cookies ñược dùng ñể lưu trữ các thông tin nhỏ thường xuyên thay ñổi phía client. Các thông tin này sẽ ñược truyền cùng với yêu cầu về cho server. Ưu ñiểm: + Không yêu cầu tài nguyên phía server. Cookies ñược lưu trữ phía client và ñược ñọc từ server khi yêu cầu gửi ñi + ðơn giản. Cookies có cấu trúc dựa trên text và các khoá là các text. + Có thể cấu hình thời gian tồn tại. Cookies có thể mất khi phiên trình duyệt kết thúc hay có thể tồn tại trên máy client. Khuyết ñiểm: + Hạn chế về kích thước. Hầu hết các trình duyệt hạn chế kích thước của Cookies là 4096 bytes, nhưng cũng có một số trình duyệt mới hỗ trợ 8192 bytes. + Client có thể cấu hình ñể không cho phép các cookies ghi xuống máy của họ. Do ñó ta không thể sử dụng Cookie. + Tính bảo mật. Cookies là mục tiêu ñể phá hoại. Người sử dụng có thể chỉnh sửa cookies trên máy của họ dẩn ñến các khả năng về bảo mật và các ứng dụng dựa trên cookies có thể bị hỏng. More Introduction to Web Application Security + Tính lâu dài. Các cookies thường ñược dùng cho từng user, nội dung sẽ khác nhau ñối với các user. Trong hầu hết trường hợp việc ñịnh danh (identification) sẽ ñược chú trọng hơn là ñịnh quyền (authentication), do ñó chỉ lưu trữ một số thông tin như user name, acount name hoặc GUID ñể xác ñịnh các user.
Query String: -
-
-
Query String là các thông tin ñược nối vào sau chuổi URL của trang web. Ta có thể dùng query string ñể submit dữ liệu về một trang nào ñó thông qua URL. Query String cung cấp cách thức ñơn giản ñể truyền thông tin giữa các trang với nhau nhưng không ñọc các thông tin này từ một trang ñược submit cho server. Ưu ñiểm: + Không yêu cầu tài nguyên server. + ðược hổ trợ rộng rãi. + Cài ñặt ñơn giản. ASP.NET cung cấp các phương thức hỗ trợ ñầy ñủ ñể làm việc với Query String: HttpRequest.Params. Khuyết ñiểm: + Tính bảo mật. Thông tin trong query string hiện trực tiếp lên giao diện của trình duyệt (ñi kèm với ñịa chỉ URL). + Hạn chế về kích thước. Hầu hết trình duyệt chỉ hỗ trợ tối ña 255 kí tự cho URL.
Tuỳ chọn View State
Dùng khi Ta cần lưu trữ thông tin ñược giữ lại cho chính trang ñó.
Created by THÁI NGỌC DUY MSDN based-written.
85 4/12/2007
Hidden fields
Cookies Query string
9.2
Ta cần lưu trữ thông tin có kích thước nhỏ cho một trang ñể gửi lại cho trang ñó hay cho các trang khác và vấn ñề bảo mật không ñược chú ý. Ta chỉ có thể dùng hidden field cho các trang ñược submit về server. Ta cần lưu trữ các thông tin nhỏ trên máy client và vấn ñề bảo mật không ñược chú ý nhiều. Dùng khi chuyển một lượng nhỏ thông tin giữa các trang và vấn ñề bảo mật không ñược quan tâm.
Các tuỳ chọn phía server:
Việc lưu trữ thông tin phía server làm tăng khả năng bảo mật hơn phía server nhưng nó sẽ yêu cầu nhiều hơn tài nguyên của server có thể dẫn tới nhiều vấn ñề khi thông tin lưu trữ lớn. ASP.NET cung cấp một vài các tuỳ chọn ñể lưu trữ data trên server. Application State: -
-
-
-
ASP.NET cung cấp các phương thức lưu trữ thông tin toàn cục cho toàn ứng dụng thông qua lớp HttpApplicationState. Các biến Application state là toàn cục cho ứng dụng ASP.NET. Ta có thể lưu trữ các thông tin lên các biến Application state ñể sau ñó xử lý bởi server. Dữ liệu trong các biến Application State ñược chia sẽ cho nhiều session và thường không ñổi. Ta cần phải có các chuyển ñổi kiểu thích hợp trước khi sử dụng các giá trị trong các biến application. Ưu ñiểm: + Dễ cài ñặt. + Có phạm vi toàn cục. Các biến Application ñược truy suất trong tất cả các trang của ứng dụng do ñó giá trị lưu trữ trong các biến application là duy nhất cho toàn ứng dụng trái với việc lưu trữ thông tin trong session state hay trong các trang riêng lẽ. Khuyết ñiểm: + Phạm vi toàn cục. Tính toàn cục ñôi khi cũng là một bất lợi. Các biến lưu trữ trên application state chỉ toàn cục cho process mà application ñó ñang chạy và mỗi process của application sẽ có một giá trị khác nhau. Do ñó ta không thể dựa trên application state ñể lưu trữ các giá trị duy nhất hay cập nhật trên các ứng dụng ñược cấu hình chạy trên nhiều server hay nhiều process khác nhau. + Tính bền vững. Các thông tin lưu trữ sẽ bị mất nếu web server sử lí nó bị ngưng chạy hay trục trặc. + Yêu cầu tài nguyên. Application state dùng bộ nhớ của server nên có khả năng ảnh hưởng ñến hiệu suất của server cũng như của ứng dụng. Việc thiết kế và cài ñặt tốt các biến Application có thể làm tăng hiệu suất của ứng dụng. Ví dụ, ñặt những thứ thường sử dụng, những dữ liệu tương ñối tĩnh trong application state có thể làm tăng hiệu suất vì làm giảm một lượng lớn
Created by THÁI NGỌC DUY MSDN based-written.
86 4/12/2007
yêu cầu truy suất database. Tuy nhiên có một sự cân bằng về hiệu suất. Khi thông tin lưu trữ nhiều thì sẽ làm giảm hiệu suất của server và ứng dụng. Bộ nhớ sử dụng cho các biến Application sẽ không ñược giải phóng cho tới khi nào mà nội dung biến thay ñổi hoặc bị xoá. Do ñó các biến application chỉ nên dùng khi thao tác với các biến dữ liệu nhỏ và ít khi thay ñổi. Session State: -
-
-
ASP.NET cung cấp các phương thức ñể thao tác với các biến mức phiên (session) thông qua lớp HttpSessionState. Dữ liệu ở các biến này chỉ có nghĩa cho từng session. Dữ liệu lưu trữ trong session ñược quản lí bởi server, có thời gian sống ngắn và chỉ ñại diện cho từng session riêng biệt. Ưu ñiểm: + Dễ dàng cài ñặt. + Các event của session rõ ràng. Ta có thể bắt các event của session ñể sử lí trong chương trình. + Tính lâu bền. Dữ liệu ñặt trên các biến session có thể vẫn tồn tại sau khi IIS restart hay tiến trình hiện tại restart bởi nếu data ñược lưu trữ ở một tiến trình khác (ta cần cấu hình lại file web.config ñể có ñược chức năng trên). Nhưng khi client ñóng trình duyệt thì dữ liệu sẽ mất. + Khả năng chạy trên nhiều cấu hình khác nhau của web server. Có thể dùng trên web server cấu hình trên nhiều server hay nhiều tiến trình. + Session state làm việc với các trình duyệt không hỗ trợ cookies, mặc dù session state làm việc dựa trên cookies (ñể lưu trữ và truyền session ID giữa server và client). Khuyết ñiểm: + Hiệu suất. Các biến session state tồn tại trong bộ nhớ cho ñến khi chúng bị thay thế hoặc xoá bỏ và do ñó có thể làm giảm hiệu suất của server. Các biến session state chứa những khối data lớn có thể ảnh hưởng ñến quá trình load dữ liệu của server.
Database: -
Trong một số trường hợp, ta có nhu cầu dùng các hỗ trợ database ñể quản lý các state trên trang web. Thông thường việc hỗ trợ database thường ñược dùng kết hợp với các cookies và các session state. Một vài web site thương mại ñiện tử sử dụng cơ sở dữ liệu quan hệ ñể lưu trữ các thông tin vì các lí do: + Tính bảo mật (Security) + Tính cá nhân (Personalization) + Tính nhất quán (consistency) + Tính khai thác dữ liệu (Data mining) Tính bảo mật (Security): Client cung cấp tên account và password ñể ñăng nhập vào một site trên trang logon. Sau ñó site sẽ tìm kiếm trên database xem cilent ñó có ñược phép ñăng nhập vào site hay không?. Nếu tìm thấy user ñó trên database web site sẽ tạo một cookies chứa một số ñịnh danh duy nhất cho user ñó trên máy của client. Site sẽ gán quyền truy cập cho client. Tính cá nhân (Personalization): với các thông tin bảo mật, site của chúng ta có thể phân biệt từng user bằng cách ñọc các cookies trên máy client.
Created by THÁI NGỌC DUY MSDN based-written.
87 4/12/2007
Thông thường các thông tin trong database chứa các phần liên quan ñến client (ñược xác ñịnh bởi một số ñịnh danh duy nhất ID). Mối liên hệ giữa ID trên cookies với database ñược coi như là tính các nhân. Site của ta có thể nghiên cứu các thông tin mà client thường quan tâm thông qua ID trên cookies và ñặt các thông tin ñó vào trang web khi user trở lại lần nữa. Tính nhất quán (consistency): nếu bạn tạo một web site thương mại, bạn cần theo dõi các lần giao dịch của hàng hoá và dịch vụ trên site của bạn. Các thông tin ñó có thể ñược lưu một cách ñáng tin cậy xuống database và ñược tham chiếu tới các user ID tương ứng. Các thông tin này có thể ñược dùng ñể xác ñịnh xem việc mua bán ñã hoàn tất hay chưa, hay là nên huỷ bỏ. Các thông tin này cũng có thể ñược dùng ñể báo cho người sử dụng biết trạng thái của các ñơn hàng của họ trên site của ta. Tính khai thác dữ liệu (data mining): các thông tin về site của ta, về các khách hàng viếng thăm, các lần giao dịch sản phẩm có thể ñược lưu một cách ñáng tin cậy vào database. Phòng phát triển kinh doanh có thể dùng các thông tin thu thập ñược từ site ñể quyết ñịnh việc sản xuất các sản phẩm cho năm tới hay chính sách phân phối cho phù hợp. Phòng kinh doanh có thể tìm hiểu các thông tin về người sử dụng trên site của ta. Các kỹ sư và các phòng hỗ trợ có thể muốn xem các lần giao dịch và ghi chú các khu vực nào mà sản phẩm của ta có thể ñược phát triển (có số lượng sản phẩm tiêu thụ mạnh). Hầu hết các hệ quản trị cơ sở dữ liệu quan hệ như MS SQL ñều hổ trợ một tập các công cụ ñể khai thác các dữ liệu ñó. - Ưu ñiểm: + Tính bảo mật. Việc truy cập database thông thường rất an toàn, yêu cầu rất khắc khe về việc thẩm ñịnh ñịnh quyền. + Dung lượng. Ta có thể lưu các thông tin tuỳ ý xuống database. + Sự ổn ñịnh. Các thông tin có thể lưu trữ bao lâu là do ta quyết ñịnh. + Toàn vẹn dữ liệu và an toàn. Các database bao gồm rất nhiều yếu tố ñể quản lý tốt dữ liệu bao gồm các trigger, các ràng buột toàn vẹn,… Bằng cách lưu giữ các thông tin về các giao dịch trên database, ta có thể dễ dàng phục hồi từ các lỗi dễ dàng. + Khả năng truy cập. Dữ liệu ñược lưu trữ trên database có thể ñược truy suất bằng các công cụ hổ trợ sẵn. + Hỗ trợ rộng rãi. - Khuyết ñiểm: + Phức tạp. Sử dụng các hỗ trợ về database sẽ phức tạp hơn về việc cấu hình phần cứng và phần mềm + Hiệu suất. Việc xây dựng một CSDL không tốt có thể dẫn ñến vô số vấn ñề. Việc ñể quá nhiều truy vấn trên database có thể làm bất lợi ñến hiệu suất của server. Tuỳ chọn Application state
Session state
Dùng khi Lưu trữ các thông tin ít khi thay ñổi, các thông tin toàn cục ñược dùng bởi nhiều user, vấn ñề bảo mật không ñược quan tâm. Không nên lưu trữ một lượng lớn thông tin lên các biến Application. Lưu trữ các thông tin có thời gian sống ngắn riêng biệt cho từng phiên và vấn ñề bảo mật ñược quan tâm.
Created by THÁI NGỌC DUY MSDN based-written.
88 4/12/2007
Database support
Không lưu trữ dữ liệu lớn trên các biến session. Chú ý là các ñối tượng session state ñược tạo và ñược duy trì trong suốt thời gian của mổi session trong ứng dụng. Trong các ứng dụng có nhiều user, ñiều này có thể chiếm ñáng kể tài nguyên của server. Lưu trữ một lượng lớn thông tin, quản lí các giao tác (transaction), các thông tin cần lưu khi application và session restart. Việc khai thác dữ liệu ñem lại lợi ích và bảo mật là một vấn ñề.
Link : mshelp://MS.VSCC/MS.MSDNVS/vbcon/html/vbconChoosingServerStateOption.htm
10 -
ASP.NET Application: ðó là tổng quan về các tuỳ chọn ta có thể dùng ñể lưu trữ trạng thái của dữ liệu trên trang web. Sau ñây ta chỉ tìm hiểu về các tuỳ chọn cho server. Trước khi tìm hiểu chi tiết về các cách thức lưu trữ thông tin của người sử dụng khi họ thao tác với các trang web của một site nào ñó ta cần tìm hiểu các khái niệm như: ASP.NET Application là gì? Tạo một application. Thời gian sống của một Application. Các chú ý về luồng (thread) 10.1
-
ASP.NET Application là gì?
ASP.NET ñịnh nghĩa một Application như là một tập các files, các pages, các handlers, các modules, và các executable code có thể ñược gọi ñể chạy trong phạm vi của một thư mục ảo (Virtual Directories) trên một Web application Server. 10.2
Tạo một Application:
Khi ta tạo một ứng dụng Web bằng ASP.NET là ta ñã bắt ñầu tạo một Application. File global.asax: - Dùng ñể sử lí các event của ñối tượng Application, và Session như: Start, End … - File này ñược ñặt ở thư mục gốc của Web Application trong IIS. Global.asax mở rộng từ HttpApplication và ñược ASP.NET phân tích và dịch tự ñộng vào .NET framework lần ñầu tiên khi có bất kì yêu cầu truy suất nào từ client. - File Global.asax ñược cấu hình ñặc biệt ñể ngăn không cho client truy suất trực tiếp nội dung file hay download hay view source của file ñó. - Môi trường soạn thảo ASP.NET ñã hổ trợ sẳn các event của các ñối tượng trên ta chỉ cần mở code của file Global.asax là có thể viết code cho các event ñó. -
10.3
-
Thời gian sống của một Application:
Một application ñược tạo lần ñầu tiên khi có một yêu cầu ñược gởi tới server. Khi ñó event ñầu tiên là Application_Start, các instances của HttpApplication ñược tạo ñể sử lí các yêu cầu ñến khi instance cuối cùng ñược sử lí xong thì phát event Application_End.
Created by THÁI NGỌC DUY MSDN based-written.
89 4/12/2007
Chú ý các phương thức Init và Dispose của ñối tượng HttpApplication ñược gọi mổi khi có một yêu cầu client.
-
10.4
Các chú ý về luồng (thread):
Nếu ta sử dụng các object mức Application thì cần phải lưu ý là ASP.NET sử lí các yêu cầu ñồng thời do ñó các object Application có thể ñược truy suất bởi nhiều client, và tại mỗi thời ñiểm một số command có thể ñược truy suất ñồng thời bởi nhiều client ñiều này nguy hiểm nếu command ñó liên quan ñến việc cập nhật dữ liệu. Ví dụ không nên viết -
Nên dùng cơ chế lock và unlock của object Application <% Application.Lock(); Application["counter"] = (Int32)Application["counter"] + 1; Application.Unlock();
%> -
Như vậy sẽ an toàn hơn vì trước khi thao tác update thì biến này ñã bị khoá và client khác không thể truy suất ñược, khi thao tác xong thì biến ñược mở khoá và các client khác có thể truy suất bình thường.
Tóm lại: ASP.NET Application bao gồm mọi thứ trong một thư mục ảo của web server. Thời gian sống của một ASP.NET application bắt ñầu từ sự kiện Application_Start và kết thúc bằng sự kiện Application_End. Việc truy cập vào một object mức Application phải ñảm bảo an toàn cho việc truy suất ña luồng (multithread). Link : http://localhost/quickstart/aspplus/
11
Managing Application State: Việc quản lí trạng thái của trang web bao gồm các mục: 11.1
-
-
-
Application State:
Các biến mức Application là các biến toàn cục ñược ñưa ra bởi ASP.NET. Ta phải luôn luôn quan tâm ñến tầm ảnh hưởng của việc lưu trữ dữ liệu lên các biến Application. Bộ nhớ dùng ñể lưu trữ các biến Application. Bộ nhớ ñược sử dụng bởi các biến này sẽ không bị giải phóng khi giá trị của chúng thay ñổi hay ñược xoá ñi. Do ñó cần quan tâm ñến việc sử dụng các biến Application, không nên sử dụng các biến có nhu cầu bộ nhớ lớn ví dụ dùng biến ñể lưu trữ một recordset có kích thước 10MB. ðối với các trường hợp này nên sử dụng Cache. Các tác ñộng của việc truy cập và lưu trữ các biến Application ñồng thời trong môi trường ña luồng. Trong môi trường ña luồng (nhiều client truy suất trang web cùng một lúc) ta phải chú ý là dữ liệu có thể ñược yêu cầu truy suất ñồng thời cùng một lúc, do ñó khi lập trình bạn phải ñảm bảo ñược là không có sự ñụng ñộ hay chồng chéo dữ liệu giữa các client với nhau, phải có cơ chế ñồng bộ hoá dữ liệu với nhau. ASP.NET hỗ trợ 2 phương thức là : Lock và Unlock ñể giải quyết vấn ñề này.
Created by THÁI NGỌC DUY MSDN based-written.
90 4/12/2007
-
-
-
-
Thời gian sống của Application cũng ảnh hưởng ñến các thông tin lưu trong các biến mức Application. ASP.NET application hay web server có thể bị hỏng bất cứ lúc nào trong quá trình ñang chạy (bị hỏng , do web server ñang ñược update, ...). Các dữ liệu lưu trữ trong các biến Application là không bền vững, dữ liệu sẽ bị mất nếu host ñang quản lí nó bị huỷ (ngưng chạy). Nếu muốn lưu trữ các giá trị này lâu dài phải lưu xuống database hay các thiết bị lưu trữ khác. Khi ta restart IIS thì các giá trị trong biến Application bị mất ñi (nếu ta chạy trang nào có yêu cầu truy suất giá trị các biến này sẽ bị lỗi) ñiều này cũng xảy ra khi ta stop IIS và sau ñó start lại IIS (trong quá trình stop thì giá trị vẩn truy suất ñược chỉ lỗi khi start trở lại) Các biến mức Application không ñược chia sẽ thông qua các ứng dụng web như: một web application chạy trên nhiều server, một web application ñược sử lí bởi nhiều tiến trình trên một server. Các biến toàn cục mức Application chỉ toàn cục trong ngữ cảnh của tiến trình ñang chạy ứng dụng. Do ñó ta không thể dựa trên các biến toàn cục mức ứng dụng ñể lưu trữ các giá trị có tác dụng làm mốc chung cho toàn ứng dụng như: biến ñếm … trên các loại ứng dụng web trên. Khi cần sử lí với các dữ liệu lớn nên sử dụng Cache sẽ có hiệu quả tốt hơn. 11.2
-
Sử dụng:
Các biến Application ñược dùng trong các trang, các lệnh bắt sự kiện, file Global.asax
Mô tả Dùng ñể ghi giá trị cho một biến mức application. Giá trị ñược lưu có thể là chuổi, số hay là một lớp (ñối tượng) nhưng ñối tượng này phải có thuộc tính serializable. Dùng lấy Lấy giá trị Var1 = Application[“var2”]; giá trị của của một Var1: tên biến chứa một biến biến mức mức application. giá trị lấy ñược. Var2: tên biến chứa application, giá trị cần lấy. cần thực hiện một số việc ép Ghi giá trị lên biến
Cú pháp Application["var"] = value; Var: tên biến cần lưu xuống application. Value: giá trị cuả biến.
Created by THÁI NGỌC DUY MSDN based-written.
Ví dụ Application["Name"] = "Thanh";
string name; name = Application["Name"].ToString();
91 4/12/2007
kiểu cần thiết. -
ASP.NET cung cấp một lớp ñể làm việc với các biến Application State: HttpApplicationState. Lớp này bao gồm các phương thức và các thuộc tính như sau:
Thuộc tính AllKeys
Kiểu dữ liệu string[] (mảng chuổi)
Loại Get
Contents
HttpApplicationState
Get
Count
Int
Get
Item
HttpApplicationState
Get/set
Keys
KeysCollection
Get
StaticObjects
HttpStaticObjectsCol lection
get
Created by THÁI NGỌC DUY MSDN based-written.
Mô tả Dùng lấy tất cả các tên biến mức application của một trang. Chỉ lấy các key dựa vào các key này ta sẽ lấy ñược giá trị. Lấy về một ñối tượng application của trang hiện tại.
Lấy tổng số biến (ñối tượng) ñang ñược lưu trong Application. Mặc ñịnh là 0. Dùng lấy về một biến (ñối tượng) application và thiết lập giá trị cho biến. Trong C# tương ñương toán tử []
string temp; //Get giá trị của biến Ho temp = Application["Ho"].ToString() ; //Let giá trị của biến Ho Application["Ho"] = "Pham"; Lấy về một tập các HttpApplicationState app = Application ; khoá (tên biến) của ñối tượng Application int n; //khai báo biến ñể chứa tập hiện tại. Phải tham chiếu ñến namespace: các key System.Collection NameObjectCollectionBase. s.Specialized KeysCollection keyCol; // lấy tập các key keyCol = app.Keys; // lấy tổng số key hiện có n = keyCol.Count; for(int i=0;i"); Lấy tất cả các object HttpStaticObjectsCollection ñược khai báo bởi tag PageObjs = Trong ñó protocol name có các giá trị sau : Giá trị Diễn giải HttpGet Thêm hay xoá phương thức HTTP GET HttpPost Thêm hay xoá phương thức HTTP POST
Created by THÁI NGỌC DUY MSDN based-written.
214 4/12/2007
HttpSoap Thêm hay xoá phương thức HTTP SOAP Documentation Thêm phương thức ñặc biệt Documentation. Khi ta gọi trực tiếp trang .asmx, ASP.NET chạy trang giúp ñỡ cung cấp các phương thức. Ví dụ:
ðể ñơn giản cho việc phát triển ứng dụng bên client sử dụng Web Service, VS.NET cung cấp chức năng Web Reference. Một Web Reference là một class proxy tự sinh mà mô tả các phương thức của Web Service mà ta tham chiếu tới. Khi 1 ứng dụng client khởi tạo một instance của lớp proxy trên thì ứng dụng ñó có thể gọi các phương thức của Web Service như là một thành phần sẵn có. Việc thêm Web Reference ñã ñược thực hiện trong ví dụ trên. Nếu một ứng dụng có chứa một Web Reference tới Web Service mà ñã bị chỉnh sửa trên Server, chúng ta nên cập nhật lại tham chiếu trong project. Trong trường hợp ñó trình tiện ích sẽ tự ñộng phát sinh lại code cho lớp proxy mà nó sẽ cập nhật lại toàn bộ những thay ñổi trên server. Các bước tiến hành cập nhật: Trong Frame Solution Explorer, truy xuất thư mục Web Reference và chọn Web reference cụ thể mà muốn cập nhật. Click chuột phải trên tham chiếu và chọn Update Web Reference, khi ñó Web Reference của chúng ta ñã cập nhật. Cập nhật ñịa chỉ của Web Reference: Mỗi Web Reference trong project tương tác với lớp proxy thông qua việc truy xuất các phương thức trên Web Service. Chúng ta có thể sử dụng Thuộc tính URLBehavior của Web Reference ñể ñiều khiển lớp proxy tham chiếu ñến 1 Web Service. Thuộc tính này có 2 giá trị: Static: lớp proxy sử dụng ñịa chỉ cố ñịnh ñể tham chiếu ñến Web Sevice. ðịa chỉ này ta cung cấp cho Web Reference khi tạo mới 1 tham chiếu. Dynamic: Ứng dụng nhận ñược ñịa chỉ URL của Web Service khi thực thi chương trình từ file web.config. Khi ta xét giá trị này thì VS.NET thêm vào tập tin web.config các xác lập cho ñịa chỉ URL. Ví dụ:
Created by THÁI NGỌC DUY MSDN based-written.
Khi có bất kỳ sự thay ñổi nào về URL ta chỉ thay ñổi value trong xác lập này. Tài liệu MSDN: help://MS.VSCC/MS.MSDNVS/vsintro7/html/vxconWebReferences.htm
31
ms-
Bảo mật Web Service: III.21 Windows Authentication và Authorization (Xác nhận quyền truy cập từ Windows và chứng nhận quyền truy cập vào tài nguyên Server): III.21.1. Web Service(file .asmx): Chúng ta có thể sử dụng chế ñộ chứng thực Windows như một trang .aspx
bình thường ñể bảo mật cho trang .asmx của mình. ðể thiết lập chế ñộ Windows Authentication, ta vào IIS thiết lập các thuộc tính cho thư mục ứng dụng của mình như sau: Chọn thư mục ứng dụng của Web Service, mở hộp thoại Properties -> chọn tab Directory Security -> Click chọn nút Edit, chương trình sẽ hiển thị hộp thoại Authentication Methods như hình dưới ñây, ta chọn các mục như hình vẽ
Sau khi thiết lập các thông số cho Windows Authentication, ñể cho phép các user có quyền truy cập vào Web Service của mình, chúng ta phải thiết lập các thông số cấu hình trong tập tin web.config, thí dụ như sau :
<system.web> Created by THÁI NGỌC DUY MSDN based-written.
216 4/12/2007
<system.web> <deny roles="BUILTIN\Power Users"/> Trong tập tin cấu hình này, ta phải chỉ file .asmx mà ta muốn cấp quyền truy cập và các quyền cho user, roles. Cuối cùng ta phải thiết lập cấu hình cho file .asmx mà ta bảo mật như sau: Vào IIS Manager, chọn tập tin .asmx, mở hộp thoại Properties, chọn tab File Security, sau ñó ta chọn nút Edit, chương trình hiển thị hộp thoại Authentication Methods giống như ở trên, ta chỉ chọn check Basic authentication. Ví dụ: http://azsw0188/TestWebServices/MathService.asmx
III.21.2. Web Service client: ðể truy xuất ñược thông tin từ Web Service, ta phải cung cấp sự uỷ nhiệm hợp lệ (set to valid windows credentials) cho máy mà ta cần truy xuất. Ví dụ:
private void Page_Load(object sender, System.EventArgs e) { // Khởi tạo 1 instance của MathService localhost.MathService m = new localhost.MathService(); // set to valid Windows credentials on the Web service's computer or domain m.Credentials =new System.Net.NetworkCredential("administrator",""); // Lấy DataSet từ Web Service DataSet myData = m.GetTitleAuthors(); if (!Page.IsPostBack) {
Authors_DataGrid.DataSource=myData.Tables["Authors"].Def aultView; Authors_DataGrid.DataBind(); } } Created by THÁI NGỌC DUY MSDN based-written.
Headers(Xác nhận quyền truy cập tuỳ chọn và chứng nhận quyền truy cập vào tài nguyên Server sử dụng Soap Headers): Chế ñộ xác thực windows(windows authentication) chỉ làm việc hiệu quả bên kịch bản của mạng nội bộ trong trường hợp bạn xác thực quyền của 1 user nào ñó trong domain của bạn.Tuy nhiên trên Internet, chắc chắn rằng bạn muốn xác thực và phân quyền tuỳ chọn chẳng hạn như phân quyền ở SQL server chẳng hạn. Trong trường hợp ñó bạn nên truyền 1 giấy uỷ nhiệm tuỳ chọn(custom credentials) như username và password vào cho web service và cho nó ñiều khiển xác thực và phân quyền cho user ñó. Cách tiện lợi ñể truyền những thông tin xác thực trên cùng với yêu cầu cho Web Service là sử dụng SOAP Headers. Cụ thể như sau: Bên phía Web Service, trong project Web Service của chúng ta, ta ñịnh nghĩa một class mà kế thừa từ class SoapHeader với 2 thuộc tính username và password, sau ñó khai báo một trường public thuộc kiểu ñịnh nghĩa trên trong class Web service của chúng ta .
Ví dụ: //ðịnh nghĩa một class kế thừa SoapHeader public class AuthHeader: SoapHeader { public string Username; public string Password; } // class kế thừa từ WebService [WebService(Description="Test Soap Headers", Namespace="http://MyWebService.com/")] public class TestSOAPHeader : System.Web.Services.WebService { // Khai báo 1 field thuộc kiểu AuthHeader ñịnh nghĩa ở trên. public AuthHeader sHeader; // ðịnh nghĩa 1 phương thức WebSevice [WebMethod(Description="This method requires a custom soap header set by the caller")] [SoapHeader("sHeader", Required=true)] public string HelloWorld() { if (sHeader==null) return "ERROR: Vui lòng cung cấp user name và password!"; string usr=sHeader.Username; string psw=sHeader.Password ; //Kiểm tra quyền truy cập if (AuthenticateUser(usr,psw)) { return "Bạn ñã ñăng nhập thành công! Xin chúc mừng bạn!"; }
Created by THÁI NGỌC DUY MSDN based-written.
218 4/12/2007
return "User và Password không hợp lệ!"; } // Hàm kiểm tra Username và Password private bool AuthenticateUser(string user, string passw) { //Có thể truy vấn từ database ñể xáx nhận quyền if ((user=="Thanh") && (passw=="TNT")) { return true; } return false; } }
Bên phía client, khi gọi sử dụng Web Service ta thực hiện:
1. Tạo 1 instance của class mà mô ta 3 Soap Headers. Ví dụ: localhost.AuthHeader h =new localhost.AuthHeader();
2. Gán các giá trị cho Soap Headers: h.Username=txtUsername.Text.ToString(); h.Password= txtPassword.Text.ToString();
3. Khởi tạo 1 instance của proxy class: localhost.TestSOAPHeader m =new localhost.TestSOAPHeader();
4. Gán ñối tượng Soap Headers cho biến của class proxy mô tả Soap Headers m.AuthHeaderValue=h;
5. Gọi phương thức từ class proxy mà tham chiếu tới Web Service ñể nhận kết quả trả về. lblResult.Text=m.HelloWorld().ToString();
Kết luận: Web Service là một công nghệ hoàn toàn mới trong VS.NET, nó cho phép chúng ta xây dựng các ứng dụng web mà có thể lập trình ñể gọi sử dụng chúng bằng bất cứ ngôn ngữ gì và chạy trên bất cứ hệ ñiều hành nào mà có thể truy cập XML Web Service.