You are on page 1of 236

1 Yêu cầu hệ thống của ASP.NET.

• 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 để 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 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.
3 Ứng dụng ASP.NET.
3.1 Khái quát.

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 Tập tin Global.asax.

3.2.1 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ó.
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.

3.3 Làm việc với thực thể HttpApplication.

 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.
}
</script>

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.

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.
}
</script>

Chú ý:
 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.
3.3.2 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:

<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.
}
</script>

Chú ý:
 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.

3.4 Sử dụng các Module trong tập tin Global.asax.

3.4.1 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() {
// Session clean-up code goes here.
}
void Application_OnAuthenticateRequest(Object Source, EventArgs
Details) {
// Authentication code goes here.
}
</script>

Chú ý:
 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.
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.

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.

 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à camel-case,
đ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
<configuration> and <configuration>. 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 <configSections> and
</configSections>. 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
<configSections> 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 <configSections>. 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.
- 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.
<configuration>
<configSections>
<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" />
</configSections>

<appSettings>
<add key="dsn" value="localhost;uid=MyUserName;pwd=;" />
<add key="msmqserver" value="server\myqueue" />
</appSettings>

<sessionState cookieless="true" timeout="10" />


</configuration>

- 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.
<configuration>
<configSections>
<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>

<sectionGroup name="system.web">
<section name="authorization"
type="System.Web.Configuration.AuthorizationConfigHandler,
System.Web, Version=1.0.3300.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a" />
<section name="sessionState"
type="System.Web.SessionState.SessionStateSectionHandler,
System.Web, Version=1.0.3300.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
allowDefinition="MachineToApplication" />
</sectionGroup>
</configSections>

<system.net>
<! — Net Class Settings would go here. -->
</system.net>
<system.web>
<authorization>
<allow users="*" /> <!-- Allow all users -->
<!-- Allow or deny specific users.
allow users="[comma separated list of users]"
roles="[comma separated list of roles]"/>
<deny users="[comma separated list of users]"
roles="[comma separated list of roles]"/>
-->
</authorization>
<sessionState
sqlConnectionString="data source=127.0.0.1;
user id=sa;password="
cookieless="false"
timeout="10"
/>
</system.web>
</configuration>

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 <appSettings> 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 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:
<configuration>
<configSections>
<sectionGroup name="myGroup">
<sectionGroup name="nestedGroup">
<section name="mySection"
type="System.Configuration.NameValueSectionHandler,
System, Version=1.0.3300.0, Culture=neutral,
PublicKeyToken=9b35aa32c18d4fb1 />
</sectionGroup>
</configSections>

<myGroup>
<nestedGroup>
<mySection>
<add key="key_one" value="1" />
<add key="key_two" value="2" />
</mySection>
</nestedGroup>
</myGroup>
</configuration>
- 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"] + "<br>");
Response.Write("The value of key_two is " + config["key_two"] + "<br>");

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 đủ)

<configuration>
<system.web>
<authentication>
<forms>
<credentials>
<passport>
<authorization>
<allow>
<deny>
<browserCaps>
<result>
<use>
<filter>
<case>
<clientTarget>
<add>
<remove>
<clear>
<compilation>
<compilers>
<compiler>
<assemblies>
<add>
<remove>
<clear>
<customErrors>
<error>
<globalization>
<httpHandlers>
<add>
<remove>
<clear>
<httpModules>
<add>
<remove>
<clear>
<httpRuntime>
<identity>
<machineKey>
<pages>
<processModel>
<securityPolicy>
<trustLevel>
<sessionState>
<trace>
<trust>
<webServices>
<protocols>
<add>
<remove>
<clear>
<serviceDescriptionFormatExtensionTypes>
<add>
<remove>
<clear>
<soapExtensionTypes>
<add>
<soapExtensionReflectorTypes>
<add>
<soapExtensionImporterTypes>
<add>
<WsdlHelpGenerator>
</webServices>
</system.web>
</configuration>

Element Description
<system.web> Chỉ đơn vị cấu hình cao nhất cho ASP.NET
configuration section.
<add> for <assemblies> 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)
<add> for <clientTarget> Adds an alias for a specific user agent to an
internal collection of user agent aliases.
<add> for <httpHandlers> Adds a reference to an assembly to use
during compilation of a dynamic resource.
<add> for <httpModules> Adds a reference to an assembly to use
during compilation of a dynamic resource.
<add> for <protocols> Adds a transmission protocol that the .NET
Framework can use to decrypt data sent
from a client browser in the HTTP request.
<add> for Adds a service description format extension
<serviceDescriptionFormatExtensionTypes> to run within the scope of the configuration
file.
<add> for <soapExtensionTypes>, Adds a SOAP extension to run with all
<soapExtensionImporterTypes>, and XML Web services within the scope of the
<soapExtensionReflectorTypes> configuration file.
<allow> Allows access to a resource.
<assemblies> Specifies ASP.NET compilation processing
directives.
<authentication> Configures ASP.NET authentication
support.
<authorization> Configures ASP.NET authorization support.
<browserCaps> Configures the settings for the browser
capabilities component.
<case> Allows pattern matching to stop after
processing the first successful match out of
a number of alternatives.
<clear> Removes all references to items appropriate
to the parent tag.
<clientTarget> Adds aliases for specific user agents to an
internal collection of user agent aliases.
<compilation> Contains all the compilation settings used
by ASP.NET.
<compiler> Defines a new compiler option.
<compilers> Specifies the compilers that the ASP.NET
application supports.
<credentials> 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.
<filter> Allows multiple rules to be applied in
sequence.
<forms> Configures an ASP.NET application for
custom forms-based authentication.
<globalization> Configures the globalization settings of an
application.
<httpHandlers> Maps incoming URL requests to
IHttpHandler classes.
<httpModules> Adds, removes, or clears HTTP modules
within an application.
<httpRuntime> Configures ASP.NET HTTP runtime
settings. This section can be declared at the
machine, site, application, or subdirectory
level.
<identity> Controls the application identity of the Web
application.
<machineKey> 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.
<pages> Identifies page-specific configuration
settings.
<passport> Specifies the page to redirect to if the page
requires authentication and the user has not
signed on with Microsoft Passport
authentication.
<processModel> Configures the ASP.NET process model
settings on Internet Information Services
(IIS) Web server systems.
<protocols> Specifies the transmission protocols that
ASP.NET can use to decrypt data sent from
a client browser in the HTTP request.
<remove> for <assemblies> Removes a reference to an assembly.
<remove> for <clientTarget> Removes an alias for a specific user agent
from an internal collection of user agent
aliases.
<remove> for <httpHandlers> Removes a verb/path mapping to an
HttpHandler class.
<remove> for <httpModules> Removes a reference to an HttpModule
class. The value of <remove> must exactly
match that of a previous <add> directive.
<remove> for <protocols> Removes a single protocol from a specific
application's list of supported HTML
encoding protocols.
<remove> for Removes a single service description format
<serviceDescriptionFormatExtensionTypes> extension type from within the scope of the
configuration file.
<result> 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.
<trace> 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.

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.
 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
ms-
help://MS.VSCC/MS.MSDNVS/vbcon/html/vbconadopreviousversi
onsofado.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 đó.
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
 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
MarshalByValueCompon
ent)
DataSetName Thiết lập hay trả về tên của DataSet hiện hành
DefaultViewManager
DesignMode
EnforceConstraints
ExtendedProperties
HasErrors
Locale
Namespace Thiết lập hay trả về namespace của DataSet
Prefix
Relations 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
Sites
Tables 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


// 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() {
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);
// 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
}
// 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();
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"));
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){
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 =
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ừ Lấy giá trị chỉ ra liệu
InternalDataCollectionBa InternalDataCollectionBase là chỉ đọc hay
se) không
IsSynchronized(kế thừa Lấy giá trị chỉ ra liệu
từ InternalDataCollectionBase được đồng bộ hay
InternalDataCollectionBa không
se)
Item 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 để
InternalDataCollectionBa đồng bộ collection
se)
 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 Lấy một Enumerator cho collection
từ
InternalDataCollectionBa
se)
GetHastCode(kế thừa từ
Object)
GetType(kế thừa từ Lấy kiểu của thể hiện hiện tại
object)
IndexOf Lấy chỉ số trong collection của một đối tượng
DataTable cụ thể
Remove Xoá một đối tượng DataTable cụ thể trong
collection
RemoveAt Xoá một đối tượng DataTable ở một vị trí cụ thể
ToString(kế thừa tử Trả về một chuỗi trình bày bởi đối tượng hiện
Object) 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
Property Description
CaseSensitive 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
ChildRelation Lấy tập hợp các quan hệ con của DataTable này
Columns Trả về tập hợp column có trong bảng này
Constraints Trả về tập hợp các constraint được lưu giữ bởi bảng này
Container(kế thừa Trả về Container của thành phần
từ
MarshalByValueCo
mponent)
Dataset Trả về Dataset chứa bảng này
DefaulView Trả về cách nhìn tuỳ chọn của bảng
DesignMode(kế Lấy giá trị cho biết liệu thành phần đang trong chế độ thiết kế
thừa từ hay không
MarshalbyValueCo
mponent)
DisplayExpression 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
ExtendedProperties Trả về tập hợp thông tin người dùng một cách tuỳ chọn
HashErrors 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
Locale
MinimumCapacity
Namespace 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
ParentRelations Trả về tập các quan hệ cha cho DataTable này
Prefix
PrimaryKey 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
Rows Trả về tập hợp các dòng thuộc về bảng này
Site
TableName Trả về hay thiết lập tên của DataTable
 Public method

Method Description
AcceptChanges Đả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
BeginInit 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
BeginLoadData tắt những thông báo, chỉ mục và ràng buộc trong khi
load dữ liệu
Clear Xoá dữ liệu của DataTable
Clone 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
Compute 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 Copy tất cả cấu trúc và dữ liệu của DataTable này
Dispose(kế thừa từ Giải phóng tài nguyên được sử dụng bởi
MarshalbyValueCo MarshalValueComponent
mponent)
EndInit Kết thúc việc khởi tạo DataTable mà được dùng trên form
hoặc được dùng bởi thành phần khác. Việc khởi tạo xảy
ra lúc chạy
EndLoadData Bật các thông báo, chỉ mục và các ràng buộc sau khi đã
load dữ liệu
Equals(kế thưà từ Xác định liệu 2 thể hiện của đối tượng có bằng nhau
Object) không
GetChanges 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
GetErrors Trả về một mảng DataRow mà chứa lỗi
GetHashCode(kế
thừa từ Object)
GetService(kế thừa
từ
MarshalByValueCo
mponent)
GetType(kế thừa từ Trả về kiểu dữ liệu của thể hiện hiện tại
Object)
ImportRow Sao chép một DataRow vào một DataTable
LoadDataRow 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
NewRow tạo một DataRow mới với cùng lược đồ của bảng
RejectChanges 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
Reset Thiết lập lại DataTable về trạng thái ban đầu của nó
Select Trả về một mảng đối tượng DataRow
ToString
 Public Event
Event Description
ColumnChanged Xảy ra khi sau khi một giá trị của DataColumn
được thay đổi trong DataRow
ColumnChanging Xảy ra khi một giá trị của DataColumn đang bị
thay đổi trong DataRow
Dispose(kế thừa từ
MarshalByValueCompon
ent)
RowChanged Xảy ra sau khi một DataRow được thay đổi
thành công
RowChanging Xảy ra khi một DataRow đang thay đổi
RowDeleted Xảy ra sau khi một dòng trong bảng được xoá
RowDeleting Xảy ra 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.
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.
ms-
help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatadatacolumncollectio
nclasstopic.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
MarshalByValueCompon
ent)
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
MarshalByValueCompon chế độ thiết kế hay không
ent)
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
Maxlength Thiết lập hay trả về chiều dài tối đa của dữ liệu của
cột
Namespace Thiết lập hay trả về không gian tên của
DataColumn
Ordinal Trả về vị trí của cột trong DataColumnCollection
Prefix
ReadOnly Thiết lập hay trả về giá trị cho biết dữ liệu cột là chỉ
đọc hay không
Site(kế thừa từ Thiết lập hay trả về site của thành phần
MarshalByValueCompon
ent)
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.1. 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.2. Đối tượng DataRow
II.1.5.2.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.2.2. Các thành phần của đối tượng DataRow
 Public properties
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 Xác định liệu hai thể hiện của đối tượng có bằng nhau hay
từ 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ế Trả về kiểu của thể hiện hiện tại
thừa 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.2.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);

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.
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);
}
ms-
help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatadatarelationclassto
pic.htm
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
ChildKeyConstrain Trả về ForeignKeyConstraint cho quan hệ
t
ChildTable Trả về bảng con của quan hệ
DataSet Trả về Dataset chứa DataRealtion này
ExtendedProperti Trả về tập hợp mà lưu trữ những thuộc tính tuỳ chọn
es
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
ParentKeyConstra Trả về UniqueConstraint mà chắc rằng những giá trị
int 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\

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

III.1 Đối tượng Connection


- 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
 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)
III.2 DataAdapter
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:
III.2.2. Các thành phần của DataAdapter
 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 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/frlrfsystemdatacommondataadap
terclassfilltopic.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");
// 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
ms-
help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatacommandbehavio
rclasstopic.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
);

• 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
ms-
help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdatacommondbdat
aadapterclassfilltopic.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;
}
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ề:
 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";
SqlCommand myCommand = new SqlCommand(mySelectQuery);
myCommand.CommandTimeout = 15;
myCommand.CommandType = CommandType.Text;
}
 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ả Ví dụ


CommandText nhận hoặc trả về câu lệnh T-Sql hay Mycommand.CommandText=”Select *
thủ tục để thực thi from NhanVien”
CommandTimeout nhận hay trả về thời gian chờ thực thi Mycommand.CommandTimeout=20
CommandType nhận hay trả về giá trị cho biết loại Mycommand.CommandType=
commandtext được gán(các giá trị CommandType.Text
StoredProcedure, TableDirect,Text.
Mặc định là Text)
Connection nhận hay trả về SqlConnection mà myCommand.Connection = new
command sử dụng 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)
{
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 truy vấn có thể ảnh hưởng đến trạng thái của
Database
SingleRow 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ả

// 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 Tác dụng


FieldCount Trả về số cột của dòng hiện tại
IsClosed Trả về True khi đối tượng đang đóng, ngược lại trả
về False
RecordsAffect Trả về số dòng bị ảnh hưởng khi gọi phương thức
ed ExecuteReader của command
 Các phương thức của đối tượng

Phương Tác dụng


thức
Close Đóng đối tượng SqlDataReader
GetBoolean Lấy giá trị của cột chỉ định theo kiểu Boolean
GetByte Lấy giá trị của cột chỉ ra theo kiểu Byte
GetFloat GetDouble, GetChar
GetInt16, GetString
GetInt32
GetName Lấy tên của cột chỉ định
Read 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;
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 =
'123-45-6789'",
myConnection);

myCommand.Connection.Open();
myCommand.ExecuteNonQuery();
myCommand.Connection.Close();

Ví dụ sử dụng DataGrid
MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView;
MyDataGrid.DataBind();

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
<html>
<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();
}

</script>

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();
}

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á
<html>
<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;

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 = "<b>Record Added</b><br>" +
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()


{
SqlDataAdapter myCommand = new SqlDataAdapter("select * from
Authors", myConnection);

DataSet ds = new DataSet();


myCommand.Fill(ds, "Authors");

MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView;
MyDataGrid.DataBind();
}

</script>

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.Add(new SqlParameter("@FName",
SqlDbType.NVarChar, 20));
myCommand.Parameters.Add(new SqlParameter("@Phone",
SqlDbType.NChar, 12));
myCommand.Parameters.Add(new SqlParameter("@Address",
SqlDbType.NVarChar, 40));
myCommand.Parameters.Add(new SqlParameter("@City",
SqlDbType.NVarChar, 20));
myCommand.Parameters.Add(new SqlParameter("@State",
SqlDbType.NChar, 2));
myCommand.Parameters.Add(new SqlParameter("@Zip",
SqlDbType.NChar, 5));
myCommand.Parameters.Add(new SqlParameter("@Contract",
SqlDbType.NVarChar,1));

myCommand.Parameters["@Id"].Value =
MyDataGrid.DataKeys[(int)e.Item.ItemIndex];

String[] cols =
{"@Id","@LName","@FName","@Phone","@Address","@City","@State","@Zip
","@Contract"};

int numCols = e.Item.Cells.Count;


for (int i=2; i<numCols-1; i++) //skip first, second and last column
{
String colvalue =((TextBox)e.Item.Cells[i].Controls[0]).Text;

// check for null values in required fields


if (i<6 && colvalue == "")
{
Message.InnerHtml = "ERROR: Null values not allowed for Author
ID, Name or Phone";
Message.Style["color"] = "red";
return;
}

myCommand.Parameters[cols[i-1]].Value = colvalue;
}

//append last row, converting true/false values to 0/1


if (String.Compare(((TextBox)e.Item.Cells[numCols-1].Controls[0]).Text,
"true", true)==0)
myCommand.Parameters["@Contract"].Value = "1";
else
myCommand.Parameters["@Contract"].Value = "0";

myCommand.Connection.Open();

try
{
myCommand.ExecuteNonQuery();
Message.InnerHtml = "<b>Record Updated</b><br>" +
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();
}

</script>
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";

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 = "<b>Record Deleted</b><br>" + 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();
}

</script>
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_Connecti
on=yes")
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

</script>
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.
/// </summary>
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();
}
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_Connect
ion=no");
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=MyS
elect.SelectedIndex;
DataSet ds = new DataSet();
myCommand.Fill(ds, "Authors");

MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView;
MyDataGrid.DataBind();
myConnection.Close();
}
private void BindData1()
{
SqlConnection myConnection = new SqlConnection("user
id=sa;pwd=;server=azsw0131;database=pubs;Trusted_Connect
ion=no");
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.
/// </summary>
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)
{
AccessData1();
}

private void Button3_Click(object sender, System.EventArgs e)


{
BindData1();
}
}
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

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. Những tính năng cơ bản về triển khai một ứ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à triển 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:
- 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. Giới 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. Triển 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 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:


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
- 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.
- Trong menu Action, chọn Create Shortcut to<Name>.
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.

 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.

IV. Triển khai ứng các ứng dụng ứng WEB Projects:
1. Làm việc với WEB Projects:
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à triển 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:
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 Mô tả


Thư mục ứng dụng Web 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.
Tập tin <MyXMLWebSevice>.asmx URL để client gọi XML Web Service
Tập tin <MyXMLWebService>.disco 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ập tin Web.config (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
Thư mục \Bin 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ụ triển 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

 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:


 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 vớI 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
• Đặ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
- 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:
Dùng để chỉ rõ và đặt các thuộc tính cho các hộp
thoại được định nghĩa trước được hiển thị trong
quá trình cài đặt.
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 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
• 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 đó
• Để 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
• 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 để tạo 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
(
[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(DatabaseName);
try
{
Command.ExecuteNonQuery();
}
finally
{
//Finally, block are a great way to ensure that the
//connection is always closed
Command.Connection.Close();
}
}

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.
• 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.
- 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).

1 Yêu cầu hệ thống của ASP.NET.....................................................................1


Windows 2000 Server or Advanced Server with Service Pack 2 ..................1
Windows XP Professional or 64-Bit Edition...................................................1
MDAC 2.7 for Data.......................................................................................1
Internet Information Services.......................................................................1
2 Giới thiệu về ASP.NET....................................................................................2
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.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
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
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
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 để 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
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.........................................3
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:................................................................................................3
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. ........3
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..................................................................................3
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.........3
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...................3
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 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....................................4
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)..................................................4
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....................................................4
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).................................................4
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ơ đồ...............................................................................4
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.............................................................................................................................4
3 Ứng dụng ASP.NET........................................................................................5
3.1 Khái quát.................................................................................................5
3.2 Tập tin Global.asax.................................................................................5
3.2.1 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ó.........................................................................................................5
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................................................................6
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...........6
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...................................................................................................6
3.3 Làm việc với thực thể HttpApplication.....................................................6
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.....6
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............................................................6
3.3.1 Lập trình lại (Overriding) phương thức Init và Dispose....................................6
3.3.2 Quản lý những sự kiện của thực thể HttpApplication.......................................8
3.4 Sử dụng các Module trong tập tin Global.asax........................................8
3.4.1 Khái quát...........................................................................................................8
3.4.2 Quản lý HTTP Module Events..........................................................................8
3.5 Tổng kết................................................................................................10
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.....10
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.............................................................10
3.5.3 Có thể lập trình lại (overriding) phương thức Init() và Dispose()...................10
3.5.4 Có thể viết mã để giải quyết các sự kiện mức ứng dụng (Application)..........10
3.5.5 Có thể viết mã để xử lý các yêu cầu mức module (sesstion)...........................10
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.......................................................................................................................10
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.........10
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........................................................................................10
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ỏ.......................................................................................10
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......................10
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ỏ...................................................................................................10
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: .........................................................................................................................10
3.5.13 Khi một client kết nối vào Server sự kiện Start() (Session_Start) sẽ phát ra.
..................................................................................................................................10
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........................................................................10
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).............................................................11
3.6 Tham khảo lớp HttpApplication.............................................................11
3.7 Tham khảo Giao diện IHttpModule........................................................11
4 Cấu hình ASP.NET.......................................................................................11
4.1 Khái qúat ..............................................................................................11
4.2 Định dạng của tập tin cấu hình trong ASP.NET.....................................12
5 Truy cập những thiết lập cấu hình của ASP.NET..........................................14
6 Tạo những Configuration Sections mới........................................................14
7 Sơ đồ thiết lập cấu hình của ASP.NET..........................................................16
TRUY CẬP DỮ LIỆU TRONG MÔI TRƯỜNG .NET.............................................20
I. Giới thiệu về ADO.NET ............................................................................21
I.1. Tổng quan về ADO.NET ........................................................................21
ms-
help://MS.VSCC/MS.MSDNVS/vbcon/html/vbconadopreviousversionsofado.ht
m................................................................................................................. 23
I.1 Cấu trúc của ADO.NET...........................................................................23
I.1.1. XML và ADO.NET ...............................................................................23
I.1.2. ADO.NET Component ........................................................................23
I.1.3. Chọn lựa DataReader hay Dataset.....................................................24
II. Đối tượng Dataset .....................................................................................24
II.1 DataTableCollection ............................................................................34
II.1.1. Khái niệm ............................................................................................34
II.1.2. Thành phần của DataTable collection .................................................34
Count.......................................................................................................................34
II.1.3. Đối tượng DataTable ............................................................................35
II.1.4. DataColumnCollection ........................................................................38
II.1.4.1. Khái niệm .........................................................................................38
II.1.4.2. Đối tượng DataColumn .....................................................................38
II.1.4.2.1. Khái niệm ......................................................................................38
II.1.4.2.2. Các thành phần của đối tượng DataColumn ..................................39
II.1.4.2.3. Ví dụ...............................................................................................39
II.1.5. DataRowCollection ..............................................................................40
II.1.5.1. Khái niệm..........................................................................................40
II.1.5.2. Đối tượng DataRow............................................................................40
II.1.5.2.1. Khái niệm.......................................................................................40
II.1.5.2.2. Các thành phần của đối tượng DataRow .......................................40
II.1.5.2.3. Ví dụ...............................................................................................41
II.2 DataRelationCollection ..........................................................................42
II.2.1. Khái niệm ............................................................................................42
II.2.2. Đối tượng DataRelation........................................................................42
II.3 Extendedproperties.................................................................................43
7.1 Mục....................................................................................................... 76
7.2 Mô tả.....................................................................................................76
8 Button1.Text = “abc”..................................................................................77
9 Tổng quát về các phương pháp lưu trữ trạng thái trong Web:.....................95
9.1 Các tuỳ chọn phía Client:......................................................................96
9.2 Các tuỳ chọn phía server:.....................................................................98
10 ASP.NET Application:...............................................................................101
10.1 ASP.NET Application là gì?.................................................................101
10.2 Tạo một Application:.........................................................................101
10.3 Thời gian sống của một Application:.................................................101
10.4 Các chú ý về luồng (thread):.............................................................102
11 Managing Application State:....................................................................102
11.1 Application State:..............................................................................102
11.2 Sử dụng:............................................................................................103
12 Managing Session State:.........................................................................109
12.1 Xác định một session:.......................................................................109
12.2 Lưu trữ Session State:.......................................................................110
12.3 Sử dụng:............................................................................................111
13 Managing Client-side Cookies:................................................................116
14 ViewState:...............................................................................................117
14.1 Khái niệm:.........................................................................................117
14.2 Sử dụng:............................................................................................118
14.3 Các hạn chế của ViewState:..............................................................119
14.4 Làm tăng hiệu suất khi sử dụng ViewState:......................................119
14.5 Disabling ViewState:.........................................................................119
15 Cấu hình tag <sessionState> trong file web.config:...............................120
15.1 Khái niệm:.........................................................................................120
15.2 Sử dụng:............................................................................................121
16 Cách cấu hình cho web server chạy trên nhiều server:...........................122
17 ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrfpropertiespg.htm........130
19 II./ Các phương thức trong C# :...............................................................130
19.2 Cách Sử dụng HTML Server Control ....................................................198
20 Thêm một HTML server control vào Web Form có hai cách................199
21 Sau đây là chúng ta đi khảo sát chi tiết những thuộc tính và các sự kiện
cho các control này...................................................................................200
22 Còn những điều mình chưa biết và sự thiếu sót cho phần này xin các bạn
đóng góp và ghi lại ở dưới đây. ................................................................203
22.1 So sánh giữa hai loạI Web server control và HTML server control........203
23 Web server control............................................................................................203
24 HTML server control.........................................................................................204
24.1 Các chứa năng chuyển dữ liệu giữ control và server hoặc giữa control với
control (giữ hai control)................................................................................204
25 Web Services là gì ?................................................................................212
26 Kiến trúc tổng quát của Web Service:.....................................................213
27 Cách tạo một ứng dụng Web Service và gọi sử dụng nó trong VS.NET:. .214
III.5 Cách tạo 1 Web Service:........................................................................214
III.6 Cách gọi sử dụng 1 Web Service từ client:............................................215
28 Attribute của Web Service: .....................................................................217
III.7 WebMethod: .........................................................................................217
III.8 WebService: .........................................................................................218
III.9 WebServiceBinding: (Phần này khó hiểu qúa, em viết lạI cho dễ hiểu). 218
III.10 SoapDocumentMethod:.......................................................................219
III.11 SoapDocumentService: Đây là một attribute dùng để áp đặt cho 1 XML
Web Service nhằm mục đích định dạng mặc định cho Soap request và Soap
response của các phương thức web. Bao gồm các thuộc tính:w..................222
III.12 SoapRpcMethod: .................................................................................223
III.13 SoapRpcService: Cho phép chúng ta thiết lập những giá trị mặc định
kiểu encoding cho các phương thức web của XML Web Service. Chú ý rằng
một XML Web Service không thể cài đặt cả 2 attribute SoapDocumentService
và SoapRpcService. Bao gồm các thuộc tính:..............................................223
III.14 SoapHeader: Áp dụng attribute này cho 1 phương thức Web Service hay
1 lớp proxy mà nó có thể xử lý 1 SoapHeader cụ thể. Sau đây là những bước
nhận và xử lý 1 Soap Header:......................................................................223
III.15 SoapExtension: Soap Extension cho phép chúng ta có thể tăng thêm
khả năng của Web Service bằng cách hiệu chỉnh các Soap message đi và đến
từ Web Service và từ client gọi Web Service. Để hiểu 1 soap extension làm
việc như thế nào, chúng hãy tìm hiểu vòng đời của 1 XML Web Service qua sơ
đồ sau: Chuỗi những sự kiện xuất hiện khi một phương thức Web được
gọi như sau:..................................................................................................225
III.15.1. Tạo 1 class kế thừa từ lớp SoapExtension:......................................226
III.15.2. Lưu 1 tham chiếu tới stream mà mô tả Soap message sẽ tạo:........226
III.15.3. Khởi tạo những thông số cho Soap extension. ................................227
III.15.4. Xử lý các Soap message dựa vào các SoapMessageStage:.............227
III.15.5. Cấu hình Soap extension để chạy với Web Service:........................228
III.16 MatchAttribute: Text pattern matching cho phép 1 XML Web Service tác
động lên 1 nội dung HTML tồn tại thông qua việc phân tích nó sử dụng các
biểu thức tổng quát(regular expressions). Bao gồm các thuộc tính:............229
29 Phương thức của Web Service:................................................................229
III.17 Cú pháp:..............................................................................................229
III.18 Diễn giải:.............................................................................................230
30 Gọi sử dụng Web Service từ clients:........................................................230
III.19 Giao thức gọi Web Service:..................................................................230
III.20 Tham chiếu đến Web Service:.............................................................231
31 Bảo mật Web Service:.............................................................................232
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):................232
III.21.1. Web Service(file .asmx):..................................................................232
III.21.2. Web Service client:..........................................................................234
III.22 Custom Authentication và Authorization with Soap 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):....................................................................234
32 Kết luận:..................................................................................................236

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.
+ 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.1Cá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.
+ 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 Dùng khi


View State Ta cần lưu trữ thông tin được giữ lại cho chính trang đó.
Hidden fields 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.
Cookies 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.
Query string 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.

9.2Cá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 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. 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 Dùng khi


Application Lưu trữ các thông tin ít khi thay đổi, các thông tin toàn cục
state đượ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.
Session state 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.
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.
Database support 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 : ms-
help://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.
- 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
<%
Application["counter"] = (Int32)Application["counter"] + 1;
%>
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.
- 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

Cú pháp Mô tả Ví dụ
Ghi giá trị Application["var"] =
Dùng để Application["Name"] = "Thanh";
lên biến value; ghi giá trị
Var: tên biến cần cho một
lưu xuống biến mức
application. application.
Value: giá trị cuả Giá trị
biến. đượ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.
Lấy giá trị Var1 = Dùng lấy string name;
name =
của một Application[“var2”]; giá trị của Application["Name"].ToString();
biến mức Var1: tên biến chứa một biến
application. giá trị lấy được. mứ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
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 Kiểu dữ liệu Loại Mô tả Ví dụ


AllKeys string[] (mảng chuổi) Get Dùng lấy tất cả các HttpApplicationState app =
tên biến mức Application;
application của một string[] arrAppKey = new
trang. Chỉ lấy các key string[app.Count];
dựa vào các key này arrAppKey = app.AllKeys;
ta sẽ lấy được giá trị.
Contents HttpApplicationState Get Lấy về một đối tượng HttpApplicationState app;
application của trang app = Application.Contents
hiện tại. string[] arrAppKey = new
string[app.Count];
arrAppKey = app.AllKeys;
Count Int Get Lấy tổng số biến (đối
tượng) đang được lưu
trong Application.
Mặc định là 0.
Item HttpApplicationState Get/set Dùng lấy về một biến string temp;
(đối tượng) //Get giá trị của biến Ho
application và thiết temp =
lập giá trị cho biến. Application["Ho"].ToString
Trong C# tương ;
đương toán tử [] //Let giá trị của biến Ho
Application["Ho"] = "Pham
Keys KeysCollection Get Lấy về một tập các HttpApplicationState app =
khoá (tên biến) của Application ;
đối tượng Application int n;
hiện tại. Phải tham //khai báo biến để chứa tập
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<n;i++)
Response.Write
(keyCol.Get(i) + "<br>");
StaticObjects HttpStaticObjectsCol get Lấy tất cả các object HttpStaticObjectsCollection
lection được khai báo bởi tag PageObjs =
<object> ở mức Application.StaticObjects;
application trong file if(PageObjs.Count>0)
Global.asax. {

...
}
IsReadOnly Protected bool Get/set Xem tại : ms-
help://MS.VSCC.200
3/MS.MSDNQTR.20
03APR.1033/cpref/ht
ml/frlrfsystemcollecti
onsspecializednameo
bjectcollectionbasecla
ssisreadonlytopic.htm

Phương
Tham số Kiểu trả về Mô tả Ví dụ
thức
Add String Void Thêm một biến (đối tượng) vào HttpApplicationState app
name,object tập hợp application state hiện tại. Application;
value // ghi vào biến Ho
Name: tên app.Add("Ho","Pham");
(khoá) của biến // ghi vào biến Ten
(đối tượng) app.Add("Ten","Thanh");
được thêm vào
tập hợp.
Value: giá trị
của biến.
Clear Void Void Xoá bỏ tất cả các biến hiện có // tạo đối tượng Applicati
trong tập hợp Application. HttpApplicationState app
Application;
// xoá bỏ tất cả các biến
hiện có
app.Clear();
Equals Object obj Bool So sánh đối tượng hiện tai với đối
Obj: đối tượng tượng khác. Phương thức này kế
cần so sánh thừa từ đối tượng Object.
Get Int index object Trả về một biến trong tập các // lấy đối tượng Applicati
Index: chỉ số biến Application hiện tại. Ta có HttpApplicationState app
của biến muốn thể đưa vào tên biến hay chỉ số Application ;
lấy. của biến. object myObj;
String name // gán giá trị cho một biến
Name: tên biến Ho
muốn lấy. app["Ho"] = "Pham";
Chỉ sử dụng // lấy biến Ho vào biến
một trong 2 myObj
tham số trên myObj = app.Get("Ho");
// xuất ra
Response.Write(myObj.T
String() + "<br>");
// ---- output : Pham
GetEnume Void IEnumerator Dùng liệt kê tất cả các khoá của // lấy đối tượng Applicati
rator các biến trong tập hợp HttpApplicationState app
Application. Ta không thể dựa Application ;
vào các biến nhận được để thay // biến giữ tập các khoá tr
đổi giá trị của các biến tương ứng về
trong tập Application. Phải tham IEnumerator iEnum;
chiếu đến namespace: // khởi tạo giá trị cho 2 bi
System.Collections.Speciali là Ho và Ten
zed.
app["Ho"] = "Pham";
app["Ten"] = "Thanh";
// lấy các khoá có trong tậ
hợp
iEnum =
app.GetEnumerator();
while(iEnum.MoveNext()

Response.Write(iEnum.C
rent.ToString() + "<br>")
// ---- > output : Ho
// Ten
GetHashC Void Int Trả về mã băm (hash code) của
ode đối tượng hiện tại. Xem thêm :
ms-
help://MS.VSCC.2003/MS.MSD
NQTR.2003APR.1033/cpref/htm
l/frlrfsystemobjectclassgethashco
detopic.htm
GetKey Int index String Trả về tên của biến được lưu // lấy đối tượng Applicati
Index: Chỉ số trong tập hợp Application State HttpApplicationState app
của biến ứng với chỉ số của biến đó. Giá Application ;
application state trị trả về không phải là giá trị của string nameObj;
cần lấy. biến. // khởi tạo giá trị cho 2 bi
là Ho và Ten
app["Ho"] = "Pham";
app["Ten"] = "Thanh";
for(int i=0 ; i<app.Count
i++)
{
// lấy tên biến
nameObj =
app.GetKey(i);

Response.Write(nameObj
"<br>");
}
// ----- > output : Ho
// Ten
GetObject SerializationInf Xem thêm tại : ms-
Data o info, help://MS.VSCC.2003/MS.MSD
StreamingConte NQTR.2003APR.1033/cpref/htm
xt context l/frlrfsystemcollectionsspecialize
dnameobjectcollectionbaseclassg
etobjectdatatopic.htm
GetType Void Type Trả về kiểu dữ liệu hiện tại của // lấy đối tượng Applicati
đối tượng Application state hiện HttpApplicationState app
hành. Application ;
// khai báo biến kiểu Type
Type typeName;
// khởi tạo giá trị cho 2
biến_u108 ?à Ho và Ten
app["Ho"] = "Pham";
app["Ten"] = "Thanh";
// lấy kiểu
typeName =
app.GetType();
Response.Write(typeNam
ToString() + "<br>");
// ---- > output:
System.Web.HttpApplica
onState
Lock Void Void Khoá việc truy cập tới biến hiện
tại. Sử dụng khi có nhu cầu cập
nhật giá trị của biến. Sử dụng với
UnLock()
OnDeseria Object sender Void Xem thêm tại : ms-
lization help://MS.VSCC.2003/MS.MSD
NQTR.2003APR.1033/cpref/htm
l/frlrfsystemcollectionsspecialize
dnameobjectcollectionbaseclasso
ndeserializationtopic.htm
Remove String name Void Huỷ bỏ một biến khỏi tập hợp
Name: tên của Application State thông qua tên
biến cần huỷ bỏ biến.
RemoveAl Void Void Huỷ bỏ tất cả các biến hiện có
l trong tập hợp Application State.
Phương thức này sẽ gọi phương
thức Clear().
RemoveAt Int index Void Huỷ bỏ một biến khỏi tập hợp
Index: chỉ số Application State thông qua chỉ
của biến cần số của biến.
huỷ bỏ
Set String name, Void Cập nhật lại giá trị của một biến
object value thông qua tên của biến.
Name: tên của
biến cần cập
nhật giá trị.
Value: giá trị
mới của biến
ToString Void String Kế thừa từ đối tượng object. Trả
về chuổi đại diện cho đối tượng
hiện tại. Trong trường hợp này
trả về kiểu dữ liệu của đối tượng
Application State.
Unlock Void Void Cho phép truy cập trở lại biến // lấy đối tượng Applicati
application state đã bị khoá bằng HttpApplicationState app
phương thức Lock() Application ;
// khoá lại để cập nhật giá
trị
app.Lock();
// cập nhật
app["Ho"] = "Pham";
app["Ten"] = "Thanh";
// mở khoá
app.UnLock();

- Ngoài ra còn có các phương thức để bắt các event được tạo sẵn cho đối tượng
Application được định nghĩa trong tập tin Gobal.asax.cs.

Event Tham số Mô tả
Application_Start Object sender, EventArgs e Event này
Sender: đối tượng kiểu phát sinh
System.Web.HttpApplicationFactory khi trang
E: đối tượng kiểu System.EventArgs web được
gọi chạy lần
đầu tiên.
Trong event
này các đối
tượng
Response,
Session,
Request
chưa được
khởi tạo bởi
ASP.NET
do đó nếu
sử dụng sẽ
bị lổi, chỉ sử
dụng được
đối tượng
Application.
Application_BeginRequest Object sender, EventArgs e Event này
Sender: đối tượng kiểu phát sinh
ASP.Global_asax. khi client
E: đối tượng kiểu System.EventArgs gửi một yêu
cầu đến
server.
Application_AuthenticateRequest Object sender, EventArgs e Event này
Sender: đối tượng kiểu phát sinh
ASP.Global_asax. khi chứng
E: đối tượng kiểu System.EventArgs thực client
gửi yêu cầu
có được cấp
quyền hay
không.
Application_Error Object sender, EventArgs e Event này
chưa bắt
được.
Application_End Object sender, EventArgs e Event này
phát sinh
khi ứng
dụng kết
thúc.Client
cuối cùng
thoát khởi
ứng dụng
hay khi ta
restart IIS.

Ví dụ:

12 Managing Session State:


12.1 Xác định một session:
- Mỗi một phiên trên ASP.NET được định danh và theo dõi bằng một chuổi có 120
bits (16 kí tự)(Session ID) gồm các kí tự ASCII hợp lệ cho phép trong chuổi
URL. Session ID được tạo bằng một thuật toán đặc biệt để đảm bảo rằng nó được
tạo ngẫu nhiên và không bị trùng nhau do đó những người sử dụng có ý đồ xấu sẽ
không thể dựa vào một session ID để tính ra một session ID khác hiện có.
- Chuổi Session ID được truyền giữa client và server thông qua cookies hoặc chuổi
URL được thay đổi để nhúng session ID kèm theo tuỳ theo ta cấu hình ứng dụng
của mình. Việc cấu hình được thực hiện trong file Global.asax.cs trong tag
<sessionState>. Khi ta đặt thuộc tính cookieless = “false” thì sessionID không
hiện kèm theo địa chỉ URL, khi cookieless = “true” thì sessionID hiện kèm theo
địa chỉ URL.
12.2 Lưu trữ Session State:
- ASP.NET cung cấp một mô hình đơn giản và dễ sử dụng để lưu trữ dữ liệu bất kì
và các object trong nhiều yêu cầu web khác nhau.
- Thay vì giữ các object trực tiếp, chế độ .NET state server đơn giản lưu trữ các
session state trong bộ nhớ. Trong chế độ này tiến trình (process) đang làm việc
giao tiếp trực tiếp với State server. Trong chế độ SQL, các session state lưu trữ
trong CSDL SQL và tiến trình làm việc giao tiếp trực tiếp với SQL. Các tiến trình
làm việc của ASP.NET có thể cải tiến các dịch vụ lưu trữ đơn giản này bằng cách
serializing và lưu tất cả object trong một tập các session của client tại đầu cuối
của mỗi yêu cầu. Khi client trở lại trang web lần nữa, các tiến trình ASP.NET có
liên quan lấy các object này từ state server và de-serializes các object đó thành các
instance sau đó đặt chúng vào các tập hợp session mới được đưa ra cho các yêu
cầu.
- Các chế độ của session state bao gồm:
+ Off: không hỗ trợ session state.
+ Inproc: các session state được lưu trữ cục bộ. Đây là chế độ mặc định.
Cách lưu trữ này giống với ASP. Các thông tin được giữ trong tiến trình của ứng
dụng đang chạy, khi tiến trình khởi động lại thì các giá trị này sẽ mất. Ưu điểm
của chế độ này là hiệu suất cao. Việc truy suất các giá trị của session sẽ nhanh
hơn so với 2 chế độ bên dưới.
+ StateServer: các session state được lưu trữ trên server ở xa. Để chạy
được chế độ này thì server phải chạy dịch vụ aspnet_state.exe. Và cuối cùng là
phải thiết lập lại các cấu hình trong file Web.config ở tag <sessionState>. Các
thông tin của session sẽ được lưu trong một tiến trình khác với tiến trình đang
chạy ứng dụng ASP.NET nhưng cũng vẫn nằm trong bộ nhớ chứ không được lưu
lên database do đó sẽ bị mất nếu restart lại máy. Các thông tin lưu trong session
vẫn không bị mất khi ta restart hay stop IIS lại. Thông tin bị mất khi ta đóng trình
duyệt và mở lại để truy cập vào các thông tin đã lưu trước đó.
+ SQLServer: để chạy được mode này trên server phải chạy thêm một
đoạn script để tạo một database trong SQL, các session state được lưu trên
database này trên SQL. Đối với bản .NET 2002 chỉ cung cấp đoạn script để tạo
table trên database tempdb do đó không thể giữ lại các thông tin khi restart SQL
Server. Bản .NET 2003 cung cấp đoạn script để tạo table trên database ASPState
do đó sẽ không bị mất dữ liệu.
- Các mode trên được cấu hình trong file Web.config. Mỗi mode sẽ có một số thuộc
tính kèm theo để cấu hình cho đúng. Chi tiết sẽ được nêu trong phần sau.
- Bằng cách phân biệt rõ ràng dữ liệu trong các session của ứng dụng tạo ra nó
(session), ASP.NET cung cấp rất nhiều điểm mới mà phiên bản ASP không hỗ
trợ:
+ Có thể phục hồi khi Application bị down, bởi vì bộ nhớ dùng cho các
session state không nằm trong tiến trình của ASP.NET hay nằm trên cơ sở dữ
liệu.
+ Phân vùng một ứng dụng thông qua nhiều tiến trình làm việc.
+ Phân vùng ứng dụng cho các ứng dụng được cấu hình chạy trên nhiều
server (web farm).
+ Phần cấu hình chi tiết sẽ được trình bày ở phần sau.
12.3 Sử dụng:
- ASP.NET cung cấp lớp HttpSessionState để làm việc với các biến session trong
một site.
- Lớp HttpSessionState gồm các phương thức và thuộc tính sau:

Thuộc tính Kiểu giá trị Loại Mô tả Ví dụ


CodePage Int Get/set Lấy hoặc thiết lập mã trang cho // lấy đối tượng Sesion
phiên hiện tại. Thuộc tính này HttpSessionState ses =
được cung cấp để tương thích Session;
với các phiên bản ASP trước, int n;
ASP.NET không lưu CodePage // các biến này được dung
trong session state. Nên dung toàn bộ các ví dụ bên dưới
Response.ContentEncoding.C n = ses.CodePage;
odePage
// hay n =
Response.ContentEncodin
odePage;
Response.Write(n.ToStrin
+ "<br>");
// ---- > output: 65001
Contents HttpSessionState Get Trả về đối tượng session hiện
tại.
Count int get Trả về tổng số biến hiện có ses["Ho"] = "Pham";
trong session. Mặc định là 0 ses["Ten"] = "Thanh";
n = ses.Count;
// hay n =
Response.ContentEncodin
odePage;
Response.Write(n.ToStrin
+ "<br>");
// ---- > output: 2
IsCookieless Bool Get Cho biết session hiện tại có ID bool ret;
được nhúng trong địa chỉ URL ret = ses.IsCookieless;
hay nhúng trong cookie. Liên Response.Write(ret.ToStri
quan đến việc ta đặt thuộc tính + "<br>");
cookiesless trong tag // ---- > output: False do ta
<sessionState> ở file không đặt cookiesless =
Global.asax. TRUE
TRUE: được nhúng trong địa chỉ
URL
FALSE: trong cookie
IsNewSessio Bool Get Trả về giá trị cho biết session có bool ret;
n được tạo với yêu cầu hiện tại ret = ses.IsNewSession;
hay không. Response.Write(ret.ToStri
+ "<br>");
// ---- > output: TRUE
IsReadOnly Bool Get Trả về giá trị cho biết session có bool ret;
phải là chỉ đọc hay không?. ret = ses.IsReadOnly;
TRUE: read-only Response.Write(ret.ToStri
+ "<br>");
IsSynchroniz Bool Get Trả về giá trị cho biết việc truy bool ret;
ed cập vào tập các biến trong ret = ses.IsSynchronized;
session state có được đồng bộ Response.Write(ret.ToStri
hay không (an toàn luồng)? + "<br>");
TRUE: thread safe // ---- > output: false
Item Object Get/set Trả về một biến trong tập Sesion
State. Trong C# sử dụng toán tử
[] để thay thế.
Keys KeysCollection Get Trả về tập các khoá (tên biến) ses["Ho"] = "Pham";
hiện có trong session state. ses["Ten"] = "Thanh";
n = ses.Keys.Count;
for(int i=0;i<n;i++)

Response.Write(ses.Keys.
(i).ToString() + "<br>");
// ---- > output: Ho
// Ten
LCID Int Get/set Lấy và trả về số chỉ thông tin về n = ses.LCID;
vùng của một session. Xem Response.Write(n.ToStrin
thêm: ms- + "<br>");
help://MS.VSCC.2003/MS.MS // ---- > output: 1033 (tuỳ
DNQTR.2003APR.1033/cpref/h máy)
tml/frlrfsystemwebsessionstateht
tpsessionstateclasslcidtopic.htm
Mode SessionStateMod Get trả về chế độ của session hiện tại Response.Write(ses.Mode
e do ta thiết lập trong tập tin cấu String() + "<br>");
hình web.config ở tag // ---- > output: SQLServe
<sessionState>. Khi ta thiết lập (tuỳ thiết lập mode)
mode= Off thì không thể lấy đối
tượng session để kiểm tra được
thuộc tính này
SessionID String Get Trả về session ID của session
hiện tại.
StaticObjects HttpStaticObjects get Trả về tập các object được khai
Collection báo trong tag <object
Runat=”server”
Scope=”Session”/> trong file
Global.asax. Xem thêm : ms-
help://MS.VSCC.2003/MS.MS
DNQTR.2003APR.1033/cpref/h
tml/frlrfsystemwebsessionstateht
tpsessionstateclassstaticobjectsto
pic.htm
SyncRoot Object Get Trả về đối tượng dung để truy Response.Write(ses.SyncR
suất toàn bộ các đối tượng có .ToString() + "<br>");
trong session State. // ---- > output:
System.Web.SessionState.
pSessionState
Timeout Int Get/set Lấy hoặc thiết lập thời gian hết // thiết lập thời gian hết hạ
hạn của session (tính bằng phút). 12 phút sau mỗi lần gửi yê
Thời gian hết hạn được tính cầu
bằng thời gian ngay sau khi ses.Timeout = 12;
client gửi một yêu cầu cộng Response.Write(ses.Timeo
thêm Timeout . ToString() + "<br>");
// ---- > output: 12

Phương thức Tham số kiểu trả về Mô tả Ví dụ


Abandon Void Void Huỷ session hiện tại. Các
dữ liệu trong session này sẽ
bị mất. Gọi phương thức
này sẽ làm phát sinh event
Session_End trong file
Global.asax.
Chú ý: là event
Session_End() chỉ phát
sinh trong mode InProc
không phát sinh trong
mode StateServer và
SQLServer.
Add String name, Void Thêm một biến mới mức // thêm một biến Ho
Object value session vào tập hợp session ses.Add("Ho","Pham");
Name: tên biến state hiện tại. // thêm một biến Ten
được thêm vào ses.Add("Ten","Thanh");
session. // tương đương với
Value: giá trị // ses["Ho"] = "Pham";
của biến. // ses["Ten"] = “Thanh";
Clear Void Void Xoá tất cả các biến hiện có
trong session state.
CopyTo Array array, Void Chép tất cả các biến trong string[] arrValue = new s
Int index session state vào một // thêm một biến Ho
Array: mảng mảng. Nếu số phần tử của ses.Add("Ho","Pham");
dung để chứa mảng tính từ vị trí index // thêm một biến Ten
các khoá (tên nhỏ hơn số biến hiện có ses.Add("Ten","Thanh");
biến) trả về. trên mảng sẽ gây ra lỗi. ses.CopyTo(arrValue,0);
Index: chỉ số để n = ses.Count;
bắt đầu chép for(int i=0;i<n;i++)
vào trên của Response.Write( arrV
mảng array alue(i).ToString() + "<br
(không phải chỉ // ---- > output: Ho
số của các biến // Ten
trong session
state)
Equals Object Bool So sánh 2 object. Xem
thêm : ms-
help://MS.VSCC.2003/MS.
MSDNQTR.2003APR.103
3/cpref/html/frlrfsystemobj
ectclassequalstopic.htm
GetEnumerator Void IEnumerator Lấy tập các biến trong IEnumerator enumSes;
session state thông qua một // thêm một biến Ho
giao tiếp IEnumerator ses.Add("Ho","Pham");
// thêm một biến Ten
ses.Add("Ten","Thanh");
enumSes = ses.GetEnum
while(enumSes.MoveNe

Response.Write(enumSe
oString() + "<br>");
// ---- > output: Ho
// Te
GetHashCode Void Int Trả về khoá băm của đối
tượng. Phương thức kế
thừa từ lớp Object. Xem
thêm: ms-
help://MS.VSCC.2003/MS.
MSDNQTR.2003APR.103
3/cpref/html/frlrfsystemobj
ectclassgethashcodetopic.ht
m
GetType Void Type Trả về kiểu của đối tượng. Response.Write(ses.GetT
tring() + "<br>");
// ---- > output:
System.Web.SessionStat
onState
Remove String name. Void Xoá bỏ một biến ra khỏi
Name: tên biến session state thông qua tên
cần xoá bỏ khỏi biến.
session state.
RemoveAll Void Void Xoá bỏ tất cả các biến ra
khỏi session state. Phương
thức này sẽ gọi phương
thức Clear()
ToString Void String Trả về một chuổi đại diện Response.Write(ses.ToSt
cho object "<br>");
// ---- > output:
System.Web.SessionStat
onState
RemoveAt Int index. Void Loại bỏ một biến ra khỏi
Index: chỉ số session state thông qua chỉ
của biến cần số của biến.
loại bỏ ra khỏi
session state.

- Ngoài ra còn có các event do ASP.NET cung cấp được cài đặt sẵn trong file
Global.asax.cs.

Event Tham số Mô tả
Session_Start Object sender, EventArgs e Event phát sinh
Sender:
khi có một client
System.Web.SessionState.SessionStateModule truy cập tới trang
E: System.EventArgs web.
Session_End Object sender, EventArgs e Event này phát
sinh khi hết thời
gian timeout đo ta
thiết lập trong tag
<sessionState>,
hoặc ta gọi
phương thức
Abandon().
Chú ý: event này
chỉ phát sinh khi
mode=InProc. Còn
các mode còn
lại :StateServer,
SQLServer không
phát sinh event
này.
Ví dụ:

13 Managing Client-side Cookies:


- Phương pháp lưu trữ bằng cookies là tương tự như của ASP. Các thông tin sẽ
được lưu thành một file text trên máy của client gọi là cookies. Chỉ những site nào
ghi cookies xuống thì mới có thể đọc cookies đó lên.
- ASP.NET cung cấp một lớp để làm việc với cookies là: HttpCookie với các
phương thức và thuộc tính sau:

Thuộc tính Kiểu Loại Mô tả Ghi chú


Domain String Get/set Dùng để thiết lập Thiết lập tên
hoặc lấy về tên miền để hạn chế
miền gán với chỉ truyền các
cookies. cookies của các
client trong
domain đó.
Expires Datatime Get/set Dùng thiết lập hoặc Có thể thiết lập
lấy về ngày hết hạn đến từng phút.
của cookies.
HasKeys Bool get Xác định xem Mặc định là
cookies có chứa false.
nhiều item con
không. True nếu có
nhiều, false không
chứa item con.
Item String Get/set Dùng để lấy hoặc
thiết lập giá trị cho
một item trong
trong cookies.
Trong C# dung toán
tử [] thay thế.
Name string Get/set Dùng thiết lập hoặc Mặc định là
đặt tên cho cookies. rổng trừ khi ta
khởi tạo có tên.
Path String Get/set Lấy hoặc thiết lập
đường dẩn ảo để
lưu cookies.
Secure Bool Get/set Lấy hoặc thiết lập Mặc định là
thông tin cho biết false
việc truyền cookies
có bảo mật hay
không.
Value String Get/set lấy hoặc đặt giá trị
cho cookies
Values NameValueCollection Get lấy về một tập các Dùng để gán
item con của nhiều giá trị cho
cookies hiện tại. cookies.

Phương thức Tham số Trả về Mô tả Ví dụ


HttpCookie String name Void Phương thức khởi tạo của // khởi tạo với 1 tham số là tê
Name: tên của lớp. Dùng để khởi tạo một cookie
cookies biến cookie. HttpCookie cok1 = new
HttpCookie("test1");
HttpCookie String void Phương thức khởi tạo cho // khởi tạo với 2 tham số là tê
name,string lớp đồng thời gán giá trị cookie và giá trị
value cho biến HttpCookie cok2 = new
Name: tên của HttpCookie("test2","Value")
cookies
Value: giá trị
Equals Object Bool Dùng so sánh 2 đối tượng.
Xem thêm: ms-
help://MS.VSCC.2003/MS.
MSDNQTR.2003APR.103
3/cpref/html/frlrfsystemobj
ectclassequalstopic.htm
GetHashCode Void Int trả về mã băm của đối
tượng hiện tại
GetType void type trả về kiểu của đối tượng
hiện tại. Phương thức này
kế thừa từ lớp Object.
ToString Void String trả về chuổi đại diện cho HttpCookie cok = new
cookies HttpCookie("test");
Response.Write(cok.ToStrin
+ "<br>");
// ---- > output:
System.Web.HttpCookie

Ví dụ :

14 ViewState:
14.1 Khái niệm:
- Đây là một cơ chế của ASP.NET dùng để lưu lại các vết giá trị của các server
control. Ví dụ: chuổi text hiển thị trên label control được lưu mặc định trên
viewstate. Ta có thể gán giá trị lúc thiết kế hoặc bằng code chỉ một lần lúc trang
được load, và sau mỗi lần submit trang chuổi text của label được tự động lấy ra từ
ViewStates.
- ViewState là một trong các thuộc tính có sẵn của server control. Dùng khi thiết kế
control trên web.
- ViewState là một hidden field được quản lí bởi ASP.NET framework. Khi
ASP.NET thực thi một trang, giá trị của trang và của tất cả các control được thu
thập và được định dạng thành một dòng được mã hoá và gán cho thuộc tính value
của control hidden đặc biệt trên form. Giá trị này được truyền đi theo mỗi yêu cầu
của client cho server.
- Ta cần phân biệt giữa hidden field là control HTML, và hidden field lưu giá trị
của ViewState.

Loại ID/Name Value Ví dụ


ViewState chỉ có một tên Thuộc tính Value <input type="hidden"
(name) duy nhất được mã hoá một name="__VIEWSTATE"
cho ViewState là : cách tự động mà value="dDwyMDY1OTM4NTc3Ozs+Oh/5q+
__VIEWSTATE không cần áp dụng B/cE0xL4JyWhXlmtrKjM=" />
bất cứ một phương
pháp mã hoá nào.
HTML ID do người phát Thuộc tính Value <INPUT id="txtHTMLHidden" type="hidden"
Hidden field triển trang web đặt không tự động mã value ="HTML Hidden value"/>
khi họ thiết kế hoá do đo ta có thể
trang. Có thể có thấy được chính xác
nhiều tên khác nội dung khi view
nhau. source.
- Khi sử dụng ViewState ta phải chú ý một số điểm sau đây:
+ Bắt buột phải có thẻ form phía server (<form runat=”server”/>) trên
trang aspx.
+ Một trang sẽ tự động lưu khoảng 20 bytes hoặc nhiều hơn các thông tin
vào ViewState. Do đó nếu ta không cho phép chế độ ViewState của một trang hay
của cả ứng dụng thì ta vẫn thấy một số giá trị trong thuộc tính value của tag
ViewState.
+ Trong trường hợp trang không có nhu cầu trao đổi dữ liệu với server
(trang tĩnh), ta có thể loại bỏ ViewState trong trang bằng cách bỏ đi tag <form>.
+ ViewState chỉ có tác dụng trên trang mà nó được sử dụng ta không thể
truy cập giá trị của biến trên ViewState từ một trang khác.
14.2 Sử dụng:
Cú pháp Ví dụ
Ghi giá trị xuống ViewState[“var”] = value; ViewState["T1"] = "test1";
ViewState Var: tên biến để chứa giá
trị.
Value: giá trị cần lưu
Lấy giá trị ra Var = ViewState[“Var2”]; string str;
Var: tên biến cần lưu giá str =
trị. ViewState["T1"].ToString();
Var2: tên biến chứa giá trị
cần lấy ra trong ViewState.
Ngoài ViewState còn được sử dụng khi thiết kế control cho web. Phần này sẽ nói
đến khi thiết kế web control.
14.3 Các hạn chế của ViewState:
- Trong một số trường hợp sử dụng ViewState không phải là lựa chọn tốt vì một số
lý do:
+ Khả năng lưu trữ dữ liệu lớn. Khi đó sẽ làm cho kích thước trang và kích
thước của form tăng lên khi gửi cho trình duyệt.
+ Sự an toàn dữ liệu. Mặc dù dữ liệu trong ViewState đã được mã hoá nhưng
sẽ an toàn hơn nếu dữ liệu đó client không thể xem được.
+ Hạn chế các kiểu dữ liệu ghi trong ViewState. ViewState chỉ chứa được các
kiểu dữ liệu cơ bản. Các kiểu có cấu trúc không lưu được.
14.4 Làm tăng hiệu suất khi sử dụng ViewState:
- Khi sử dụng ViewState nên lưu ý một số điểm sau:
+ Disable ViewState khi ta không có nhu cầu sử dụng. Phần sau sẽ nói rõ một
số cách để disable ViewState.
+ Không sử dụng nhiều biến trong ViewState.
+ Chỉ sử dụng ViewState trong các trường hợp cần thiết. Ví dụ ta có một trang
chỉ hiển thị một lưới chứa dữ liệu thì không nên dùng ViewState vì thông thường kích
thước dữ liệu của một lưới sẽ rất lớn do đó sẽ làm tăng kích thước của trang lên rất
nhiều.
14.5 Disabling ViewState:
Trong một số trường hợp không dùng ViewState cho một số đối tượng thì ta phải
disable thuộc tính ViewState cho đối tượng đó.
Phạm
Nơi cấu hình Mô tả Ví dụ
vi
Đối với Trong thẻ định nghĩa control Tắt chế độ <asp:datagrid
từng đó ở file aspx(html). ViewSate EnableViewState="false"
control Mở form ở chế độ thiết kế của control … />
trên (design), chọn phần xem mã hiện tại.
form html (nhấn Ctrl + Các giá trị
PageDown), tìm đến tag định của control
nghĩa control cần cấu hình, sẽ không
thêm thuộc tính được tự
EnableViewState=false. động lưu
lại trong
ViewState
cuả form.
Đối với Trong thẻ cấu hình trang. Tắt chế độ <%@ Page
một Cũng mở form ở chế độ ViewState EnableViewState="False" …
%>
trang. HTML như trên, tìm đến thẻ cho toàn
<%@Page ... > (thường ở đầu trang.
file) , thêm thuộc tính
EnableViewState=false.
Đối với Trong file web.config, mở Tắt chế độ <pages
enableViewState="false"/>
toàn file ở chế độ soạn thảo, tìm ViewState
ứng tag <pages> (nếu không thấy cho toàn
dụng. có thể thêm vào), tìm thuộc ứng dụng.
tính enableViewState (nếu
chưa có thì thêm vào) đặt giá
trị = false
(enableViewState=false).

15 Cấu hình tag <sessionState> trong file web.config:


15.1 Khái niệm:
- Việc chọn lưu các thông tin trong trang web ở đâu là do ta cấu hình trong file
web.config.
- Mở tập tin web.config ở chế độ soạn thảo trong IDE. Tìm tag <sessionState> (nếu
chưa có thì thêm vào). Sau đó ta có thiết lập các thông số sau:

Thuộc tính Giá trị Ý nghĩa


mode Chỉ nơi để lưu giữ các thông tin về session
Có thể là client hay server. Thuộc tính này
bắt buộc phải có nếu ta cấu hình tag
<sessionState>
Off Không lưu lại các session state trên trang
web.
InProc Session state được lưu trên máy client. Mo
này có lợi thế là tốc độ nhanh hơn vì không
phải kết nối database hay kết nối với máy
khác. Nhưng chỉ nên dùng để lưu những dữ
liệu nhỏ và không có nhu cầu lưu giữ lại.
StateServer Session state được lưu trên server, có thể
nằm cùng với server đang chạy ứng dụng
hay là một server nào đó trong hệ thống củ
ta.
SQLServer Session state được lưu trên SQL server.
Mode này sẽ chậm hơn 2 mode trên nhưng
có lợi thế là thông tin lưu trữ lớn và có tính
lâu dài.
cookieless Xác định xem session có sử dụng cookie đ
lưu thông tin session ID hay không.
true Session không sử dụng cookie, do đó sessi
ID sẽ đi kèm với địa chỉ URL.
Đối với session không sử dụng Cookies
(cookieless = true) thì các đường dẩn của t
tin trong trang web phải sử dụng đường dẫ
tương đối không sử dụng được đường dẫn
tuyêt đối.
false Session sử dụng cookie. Đây là giá trị mặc
định.
timeout Số nguyên Xác thời gian hết hạn của một session. Nếu
khoảng thời gian giữa 2 lần gửi yêu cầu củ
client lớn hơn timeout thì session sẽ tự độn
phát sinh event session_end. Tính bằng phú
Mặc định là 20 phút. Sau mổi lần client gử
yêu cầu thì thời gian timeout sẽ được tính
lại.
stateConnectionString chuổi chứa thông tin kết nối. Chỉ đến server và cổng để chứa các session
Cú pháp: state. Thuộc tính này có tác dụng nếu
“tcpip=server:port” mode=StateServer.
server: tên server sẽ chứa các thông
tin về session (có thể là tên máy hoặc
địa chỉ IP của máy).
Port: cổng kết nối. Mặc định là 42424

sqlConnectionString chuổi chứa thông tin kết nối. Chuổi chứa thông tin kết nối đến database
Cú pháp: chứa session state. Thuộc tính này có tác
Giống như khi ta thiết lập một chuổi dụng khi mode = SQLServer.
connectionString để kết nối đến SQL
stateNetworkTimeout Số nguyên. Dùng khi mode = StateServer. Xác định số
giây kết nối nối mạng giữa web server và
state server (server giữ trạng thái) có thể
rãnh trước khi session bị huỷ. Mặc định là
10 giây.
15.2 Sử dụng:
- Đối với mode Off và InProc thì ta không cần hiệu chỉnh tới file web.config vì
đây là các thiết lập mặc định. Do đó cơ chế lưu giữ trạng thái sẽ giống như ASP.

- Đối với mode StateServer:


+ Để chạy được chế độ này ta trước tiên ta phải cho chạy service “ASP.NET
State Service” (đây là một dịch vụ khi cài .NET Framework sẽ có). Cách chạy:
Mở cửa sổ quản lý services trên máy sẽ chứa các thông tin về session (vào menu
Start -> Programs -> Administrative Tools -> Services -> Enter). Tìm service
“ASP.NET State Service” nếu service này chưa được Start thì Start service đó.
+ Tiếp theo là thiết lập cấu hình trong file web.config: mở file web.config ->
tìm tag <sessionState> (nếu chưa có thì thêm vào) -> thiết lập thuộc tính
mode=StateServer và thiết lập thuộc tính stateConnectionString. Ví dụ
stateConnectionString=”tcpip=azweb80:42424”.
+ Ví dụ:
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
cookieless="false" timeout="20"
/>
- Đối với mode SQLServer:
+ Để chạy mode này thì không cần phải chạy service giống như trên.
+ Ta cần tạo một database trên SQL server ở máy cần lưu các thông tin. Trước
khi tạo database này ta cần khởi động service “SQL Server Agent” vì service này
quản lý một số dịch vụ của SQL cung cấp việc thực hiện các job. Mở SQL Query
Analyzer. Sau đó mở đoạn script InstallSqlState.sql (đối với .NET framework
v1.0) hoặc InstallPersistSqlState.sql (đối với .NET framework v1.1) sau đó cho
thực thi (nhấn F5).
+ Lưu ý:
+ Cả 2 đoạn script trên mặc định nằm ở vị trí: <Tên ổ đĩa>:\
[Winnt]\Microsoft.NET\Framework\version (số phiên bản của .NET framework) \
.
+ Khi chạy đoạn script InstallSqlState.sql sẽ tạo một database ASPState
nhưng các table để chứa thông tin sẽ được tạo trong database Tempdb do đó các
thông tin sẽ mất nếu ta khởi động lại SQL Server.
+ Khi chạy đoạn script InstallPersistSqlState.sql cũng tạo database
ASPState nhưng các table sẽ được tạo trên database này do đó các thông tin sẽ
không bị mất.
+ Ta cũng có thể xoá database ASPState bằng cách chạy các đoạn script
UninstallSqlState.sql và UninstallPersistSqlState.sql (tìm thấy cùng vị trí với
các file script trên) tương ứng. Nhưng trước khi chạy phải stop service “ASP.NET
State Service” nếu không sẽ bị lổi.
+ Khi thao tác với file web.config thì các tag và các thuộc tính đều phân
biệt chữ hoa và chữ thường do đó phải gõ chính xác.
+ Ví dụ:
<sessionState
mode="SQLServer"
sqlConnectionString="data source=127.0.0.1;user
id=sa;password="
cookieless="false" timeout="20"
/>

16 Cách cấu hình cho web server chạy trên nhiều server:
Phần này chưa tìm được tài liệu nên chứa trình bày được.

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

Báo cáo nghiên cứu các vấn đề xung quanh ASP.NET: Ưu điểm, HighPerformace…
Trực tiếp nghiên cứu : Trương Hiền.
Module: Hệ thống, C#.
Ngày bắt đầu:18/12/2003
Ngày hoàn thành: 31/12/2003
Ngày cập nhật: 06/01/2003
I./ Các đặc điểm mới của ASP.NET so với ASP:
ASP.NET là phiên bản mới của ASP,ngoài những ưu điểm của ASP,
ASP.NET có những đặc điểm khác và mạnh hơn so với ASP:
 Pages: sử dụng các thành phần điều khiển có khả năng hoạt động và tương tác với nhau ngay
trên trình chủ Server. Đặc điểm này giảm thiểu thời gian viết code tương tác giữa các trang.
Lập trình trong môi trường ASP.NET tương tự như lập trình trong Form, do đó các ứng dụng
của ASP.NET còn được gọi là Web Form.
 HTML Server Side Controls: các thành phần điều khiển HTML có khả năng xử lý ngay trên
trình chủ(Server) dựa trên thuộc tính và phương thức tương tự như cách thức hoạt động của
trình khách(client). Những thành phần điều khiển này còn cho phép ta kết hợp mã xử lý của
pages ASP.NET với một sự kiện nào đó phát sinh phía client được xem như đang diễn ra trên
trình server(mô hình chuyển giao- deligate).
 Rich controls: tập các điều khiển đa năng.Các Rich Controls chạy trên server và có thể tạo ra
các phần tử cũng như các đối tượng HTML phức hợp trên client (Grid, calendar,table, view,
…). Rich controls còn cho phép bạn ràng buộc dữ liệu và xử lý dữ liệu tương tự như bạn đang
viết một ứng dụng desktop thật sự. Xoá đi biên giới mô hình Client/server.
 Web Service: các dịch vụ Web. Trang ASP.NET có thể không cần hiển thị kết xuất cho client.
Chúng hoạt động như những chương trình xử lý yêu cầu ở hậu cảnh. VD trang ASP.NET nào
đó có thể là đối tượng cung cấp phương thức trả về giá trị nào đó khi nhận được yêu cầu từ
client.
 Cấu hình & phân phối: đơn giản và dễ dàng với các file cấu hình theo định dạng văn bản của
XML.Không cần phải đăng ký hệ thống khi sử dụng nữa(Quên đi regsrv32.exe!). Chúng ta
chỉ cần copy các trang ASP.NET hay các đối tượng lên máy chủ, chỉ ra vị trí của chúng và thế
là chương trình cũng như dịch vụ của chúng ta đã sẵn sàng!.
 Tự động quản lý trạng thái của đối tượng Session hay Aplication. Chúng ta có thể lưu nội
dung của Session hay Aplication của một ứng dụng đặc thù nào đó xuống một file trên đĩa sau
đó dùng lại.
 Debug, Tracing: Các công cụ debug được nâng cấp đáng kể. Mỗi trang tài liệu có thể sử dụng
một trang xử lý lỗi riêng biệt và kết xuất nội dung của biến để theo dõi ngay trong quá trình
thực thi trang. Các trình Debug được tích hợp sẵn trong môi trường đa ngôn ngữ VB.NET,C+
+,C#.
 Security management: Chúng ta có thể tận dụng các dịch vụ đăng nhập(login) tuỳ biến cho
trang tài liệu ASP.NET theo phong cách của Web hoặc cơ chế đăng nhập và dựa trên hệ thống
bảo mật của HĐH.
 Tùy biến vùng đệm trên Server (Customer Server Caching): vùng đệm của kiến trúc
ASP.NET được quản lý rất linh động. Chúng ta có thể tạo ra các vùng đệm riêng biệt chứa
một kiểu giá trị và đối tượng trong quá trình hoạt động của trang nhằm tăng tốc cho ứng dụng.
 Một tập các đối tượng phong phú: ASP.NET hỗ trợ một tập phong phú các thư viện và các đối
tượng phục vụ hầu hết những gì mà những nhà ứng dụng cần đến. Bằng những thư viện này
công việc viết ứng dụng cho Web trở nên dễ dàng hơn.VD: bạn có thể sử dụng các thành phần
đối tượng “Send mail ” để gửi nhận thư, Đối tượng mã hoá để giải mã thông tin, Web
Counter(đếm số người truy cập),ADO.NET,…
Các đối tượng nội tại khác như Request, Response, Form,
Cookies, ServerVaribles, đều được giữ lại và hoàn toàn tương thích với
ASP. Tuy nhiên, ASP.NET đã cung cấp thêm cho những đối tượng này
rất nhiều những thuộc tính và phương thức mới giúp nâng cao khả
năng xử lý các ứng dụng.
Một ứng dụng được triển khai bằng ASP.NET sẽ thừa hưởng được các
thế mạnh của ASP.NET như: tốc độ nhanh, linh động, an toàn và có tính thực
thi cao. Điều này dựa trên các ưu điểm nổi bật sau của ASP.NET(đứng ở góc
độ lập trình.):
1. Thành phần điều khiển đóng gói các chức năng thường xuyên sử dụng rất tiện lợi như: quản
lý trạng thái (State), kiểm tra dữ liệu nhập(validate), … những công việc này trứơc đây
thường phải viết rất thủ công.
2. Mã nguồn dễ dùng, dễ đọc: Mọi công việc thao tác hay xử lý không cần thiết trước đây(như
kiểm tra tính hợp lệ của dữ liệu, bảo vệ trạng thái của session,…) đều được chuyển giao cho
kiến trúc và bộ khung ASP.NET xử lý. Trang ASP.NET viết mã ít hơn, ngắn gọn hơn đồng
thời cũng thực thi nhanh hơn trang ASP do trang ASP.NET đã được biên dịch và được đưa
vào vùng đệm bộ nhớ trong suốt quá trình thực thi.
3. Với trang ASP.NET chúng ta có thể tạo trang tài liệu HTML kết xuất phía đầu cuối đẹp mắt
bằng một tập phong phú các thành phần điều khiển giao diện thân thuộc trong Windows đã
được xây dựng lại.
4. Trong ASP.NET không còn phụ thuộc vào ngôn ngữ phi định kiểu như VBScript nữa, mà nó
cho phép sử dụng ngôn ngữ trung lập.Trang ASP.NET có thể viết bằng rất nhiều ngôn ngữ lập
trình hiện đại: C++, C#, VB.NET, Perl,…
Ngoài ra, còn có những ưu điểm khác so với ASP thường: Ở trang ASP mã lệnh và giao
diện trộn lẫn với nhau. Khi phát triển những ứng dụng Web lớn, thường các dự án cần được tách
ra làm 2 phần. Một nhóm thiết kế giao diện(Web Designer) và một nhóm viết lệnh lập
trình(coder). Kết quả cuối cùng thường là một sự trộn lẫn giữa phần thiết kế giao diện và mã lệnh
ASP để tạo thành một file chương trình duy nhất. Các trang ASP của ứng dụng đó rất khó bảo trì
khi bạn muốn thêm vào các mã lập trình mới hay thay đổi giao diện. ASP.NET cho phép tách rời
giữa mã lập trình và nội dung tài liệu.
Ngày nay, các thiết bị cầm tay: ĐTDĐ, máy Palm,… thay đổi rất nhanh, đòi hỏi nhu cầu
sử dụng Internet ngày càng cao. Vấn đề là các trang tài liệu thiết kế cho những thiết bị này yêu
cầu phải nhỏ gọn và không thể sử dụng cách định dạng cho tài liệu như trên những trình duyệt
hiện đại. Một trong những cách giải quyết vấn đề trên đó là ta sẽ xây dựng 2 site khác nhau để
hướng đến 2 ứng dụng khác nhau hoặc là trong cùng một site chúng ta code nhận dạng từng loại
thiết bị rồi viết mã từng site cho phù hợp(Select case …) Cách này lập trình rất khó, chi phí cao
và hiện đang được sử dụng nhiều nhất. Tuy nhiên, với ASP.NET chúng ta không cần viết mã
lệnh, các thành phần điều khiển hoạt động trên Server có khả năng nhận dạng và phát sinh mã tuỳ
theo yêu cầu sử dụng cuối cùng của Client…..

II./ Các vấn đề về nâng cao tốc độ thực thi một trang Web viết bằng ASP.NET:
Cũng giống như những mô hình lập trình khác, khi viết code trong một
ứng dụng ASP.NET cũng có một số vấn đề cần lưu ý, đôi khi rất nguy
hiểm cho ứng dụng của chúng ta:
1. Cần Disable Session state khi không dùng nó nữa.
Trong ứng dụng sẽ có trang dùng , trang không
dùng các session. Vì vậy chúng ta cần disable các
session lại khi không dùng chúng nữa.
Cú pháp: <%@ Page attribute="value" [attribute="value"…] %>
Ví Dụ: <%@ Page EnableSessionState="false" %>

Nếu một trang nào đó đòi hỏi cần truy cập vào một biến session nào đó mà không cần
modify hay create nó,
ta set EnableSessionState trực tiếp vào trong @Page với thuộc
tính ReadOnly.
Session state cũng có thể Disable ở những phương thức dịch vụ Web XML, để biết thêm nhiều
chi tiết các bạn hãy tham khảo ở trang:XML Web Services Created Using ASP.NET and XML
Web Service Clients.
Một cách khác để Disable Session state trong ứng dụng, trong file Web.config ,
ta set mode của sessionstate sang off. VD: <sessionstate mode="off" />.
2. Chọn cách cấp session–state một cách cẩn thận. ASP.NET cung cấp 3 cách khác
nhau để lưu trữ dữ liệu session trong một ứng dụng: in-Process session-state, out of
Process session-state trong dịch vụ Window (Window sercice) và out of Process
session-state trong SQL Server Database. Mỗi cách đều có ưu điểm riêng, tuy nhiên
in-Process session-state là giải pháp nhanh nhất. Nếu chúng ta chỉ lưu trữ một số ít dữ
liệu lưu động trong session state thì nên dùng in-Process session-state ,còn out-Process
session-state thường được dùng trên môi trường nhiều máy tính hoặc các loại dữ liệu
hay bị mất đi khi chúng ta restart.
Các bạn có thể tham khảo thêm :
mshelp://MS.VSCC/MS.MSDNVS/cpguide/html/cpconaspstatema♦nagement.htm

3. Tránh những kết nối vòng (Round Trips) không cần thiết đến Server. Khi một ứng
dụng Web được triển khai, vấn đề thời gian cũng là một phần rất quan trọng. Thông thường, khi
ứng dụng của chúng ta truy cập hay lưu trữ cơ sở dữ liệu thì ta mới kết nối tới Server. Hầu hết các
thao tác dữ liệu đều thực hiện trên Client, VD các trường hợp nhập dữ liệu, ta có sự kiện
Validation ở Form Input (Client) để kiểm tra dữ liệu nhập có hợp lệ hay không trước khi
Submit…, tức là những gì xử lý được ở Client thì nên xử lý, điều này sẽ giảm thời lượng đáng kể.
Ta nên dùng sự kiện Page.IsPostBack để ngăn chặn thực thi các tiến trình không cần thiết
trên một Round Trip. Có những tình huống chỉ cần thực hiện một thao tác nào đó ở lần chạy đầu
tiên, các lần sau không cần biên dịch lại, ta dùng thuộc tính Page.IsPostBack bẫy chúng lại.VD :

void Page_Load(Object sender, EventArgs e) {


// ...Set up a connection and command here....
if (!Page.IsPostBack) {
String query = "select * from Authors where FirstName
like '%JUSTIN%'";
myCommand.Fill(ds, "Authors");
myDataGrid.DataBind();
}
}

Ở sự kiện trên, ta thấy trước hết nó sẽ kiểm tra thuộc tính Page.IsPostBack tra nếu False
thì sẽ tiếp tục thực thi các câu lệnh bên trong, ngược lại thì không. Tham khảo thêm:
Ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfSystemWebUIPageClassIsPostBackTopic.htm
4. Sử dụng Server Controls đúng lúc, đúng nơi. Xem xét kỹ ứng dụng
của chúng ta, thật sự có cần thiết hay không khi sử dụng ASP.NET Server
Control, đừng nên thấy chúng dễ dùng mà “lạm dụng” nó,chỉ khi nào có sử
dụng đến tài nguyên Server. Một số trường hợp hiển thị dữ liệu hay binding
data đơn giản thì chúng ta nên sử dụng chúng. Trong ví dụ sau, chúng ta sẽ
thấy việc dùng Server Control sẽ không phải là phương pháp hiệu quả để đưa
những giá trị vào trang HTML(Client). Mỗi phương thức gửi một đường dẫn
của một image từ Server đến Client bằng việc lựa chọn Server Control sẽ làm
chậm quá trình xử lý của ứng dụng.

<script language="C#" runat="server">


public String imagePath;
void Page_Load(Object sender, EventArgs e) {
//...Retrieve data for imagePath here...
DataBind();
}
</script>

<%-- The span and img server controls are unecessary...--%>


The path to the image is: <span innerhtml='<%# imagePath %>'
runat="server"/><br>
<img src='<%# imagePath %>' runat="server"/>
<br><br>

<%-- Use data binding to substitute literals instead...--%>


The path to the image is: <%# imagePath %><br>
<img src='<%# imagePath %>' />

<br><br>

<%-- Or use a simple rendering expression...--%>


The path to the image is: <%= imagePath %><br>
<img src='<%= imagePath %>' />
Tuy nhiên, nếu biết vận dụng, khai thác các thuộc tính của Server Control, nắm bắt các sự
kiện, các ưu điểm của việc lưu trữ ViewState thì Server Control vẫn là cách lựa chọn thích hợp.
5. Chỉ lưu những Server Control ViewState khi nào cần. Tự động quản lý
viewstate là một điểm đặc biệt của ServerControls để phục hồi những giá trị
thuộc tính trên một Round Trip mà không cần viết code.Thuộc tính Enable
Viewstate luôn mặc định True. Tuy nhiên, chúng ta cần biết khi nào nó lợi và
khi nào nó gây cản trở cho ứng dụng của chúng ta. Ví dụ, khi ta binding data
vào một Server Controls trên mỗi Round Trip, các giá trị của ViewState sẽ
được lưu những giá trị mới từ thao tác data-binding. Trong trường hợp này ta
nên Disable quá trình Saves viewstate. Mặc định tất cả các Server control đều
set ebnable = true, để disable chúng ta có các phương pháp sau. VD ở
DataGrid Server Controls như sau:
<asp:datagrid EnableViewState="false" datasource="..."
runat="server"/>
Disable viewstate toàn bộ một trang ta dùng như sau :
<%@ Page EnableViewState="false" %>
Chú ý thuộc tính viewstate có thể gán trực tiếp vào trong controls :
<%@ Control attribute="value" [attribute="value" … ] %>
6. Dùng phương thức Response.Write cho những chuỗi kết nối (Concat).
Nên dùng HttpResponse.Write trong một trang hay trên các User Control cho chuỗi kết
nối, phương pháp này cung cấp dịch vụ đệm và kết nối rất hiệu quả. Tuy nhiên, nếu thực thi việc
kết nối chuỗi ở diện rộng nên dùng nhiều câu lệnh Response.Write VD:

Response.Write("a");
Response.Write(myString);
Response.Write("b");
Response.Write(myObj.ToString());
Response.Write("c");
Response.Write(myString2);
7. Đừng quá tin tưởng vào công việc bẫy lỗi Exceptions của hệ thống. Khi chương trình
quá lớn, phức tạp , chúng ta sẽ rất khó quản lý được chúng. Nếu có thể, ta nên detect những điều
kiện gây ra exception. Khi ta biết được các điều kiện gây ra exception, đừng nên để tự nó catch
exception, phải chủ động bẫy lỗi theo cách của chúng ta. Thông thường nhất là các sự kiện Check
Null, ép kiểu từ chuỗi sang số(parsed), hay kiểm tra một giá trị đặc biệt nào đó trước khi thực
hiện một phép toán,…VD:

// Consider changing this...


try {
result = 100 / num;
}
catch (Exception e) {
result = 0;
}

// to this...
if (num != 0)
result = 100 / num;
else
result = 0;
Hai ví dụ trên sẽ cho ra cùng một kết quả, tuy nhiên ở VD sau chúng ta
có phần chủ động hơn trong việc catch lỗi.
8. Dùng store procedure để truy cập data. Trong tất cả những phương thức truy cập dữ
liệu mà .Net FrameWork cung cấp thì truy cập bằng SQL Server có tính thực thi cao, nhất là các
ứng dụng Web. Tuy nhiên, khi đã quản lý CSDL bằng SQL Server truy cập dữ liệu chúng ta nên
dùng Store Procedure thay vì dùng những câu truy vấn. Khi dùng Store procedure, các câu lệnh
được biên dịch lần đầu rồi lưu vào bộ nhớ do đó những lần sau sẽ truy cập nhanh hơn. Đồng thời,
Store procedure được thực thi ở Server sẽ nhanh hơn rất nhiều so với những câu lệnh SQL thực
thi từ Client. Điều này sẽ giảm chi phí về thời gian thực thi rất đáng kể.
9. Dùng Class SlqDataReader cho những loại dữ liệu Forward - Only. Class
SlqDataReader cung cấp một phương tiện để đọc các luồng dữ liệu Forward – Only truy cập từ
SQL Server- DataBase. Nếu những tình huống nảy sinh khi chúng ta tạo một ứng dụng bằng
ASP.NET mà có dùng Forward – Only data, thì SlqDataReader có tính thực thi nhanh hơn
DataSet Class, bởi vì Class SlqDataReader dùng các định dạng truyền tải dữ liệu qua mạng có sẵn
của SQL Server để đọc trực tiếp dữ liệu từ sự kết nối Database. Bên cạnh đó, Class
SlqDataReader thực hiện đầy đủ các chức năng giao diện IEnumerable cho phép chúng ta bind
data đến Server rất tốt.
10. Cache data và Page Output khi có thể. ASP.NET có rất nhiều kỹ thuật để caching
page output và data không cần thiết cho những trang, hay những sự tính toán động nào đó. Tuy
nhiên, nếu thiết kế page hay data, đặc biệt là những Areas có sự truyền tải dữ liệu rất lớn, mà
cache không đúng lúc, đúng nơi sẽ rất nguy hiểm. Vì vậy, nếu biết cách Cache sẽ tăng khả năng
thực thi rất lớn cho Web Site, đồng thời giảm chi phí đáng kể.
11. Phải đảm bảo disable Debug mode. Luôn nhớ là phải disable Debug Mode trước khi
triển khai một ứng dụng hay kiểm tra thực thi một phần đo lường nào đó.

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

Báo cáo nghiên cứu : những điểm khác biệt giữa C++ và C#
Ở đây tôi trình bày trên cơ sở chúng ta đã biết C++
=============================================================
=============
I./ Đối tượng và Lớp :
• Thế giới thực:
- Các ví dụ về đối tượng: Con người (anh là một đối tượng người , tôi là
một đối tượng người), Con chó, Con mèo, Computer, Xe máy, Máy bay

- Lớp: khi nhiều đối tượng cùng loại và có cùng tính chất với nhau sẽ tạo
thành một lớp đối tượng. Ví dụ: Máy tính PIII, máy tính PIV... sẽ hợp
thành một lớp các đối tượng máy tính…
• Thế giới tin học (cụ thể là C#):
- Một lớp trong C# được xem là những khái niệm cơ sở của ngôn ngữ. Điều
này có nghĩa là mỗi khi viết một chương trình bằng C# bạn sẽ tạo ra các
lớp để cấu thành một chương trình. Chúng ta sử dụng lớp như là khuôn
mẫu để đặt tất cả những thuộc tính và những chức năng hay hành vi vào
trong một khối cho một nhóm đối tượng nào đó, sau đó chúng ta sẽ dùng
lớp đó để tạo những đối tượng mà chúng ta cần.
- Có 2 loại lớp: loại dựng sẵn của .NET Framework (Framework Class
Library), và loại do người dùng định nghĩa.
- Lớp chứa dữ liệu(dưới dạng biến và thuộc tính ) và các hành vi (dưới dạng
phương thức để xử lý dữ liệu đó). Khi chúng ta khai báo một biến trong
một lớp ta gọi đó là một biến thành viên(member data).
- Khi tạo một đối tượng , chúng ta sẽ thiết lập các thuộc tính cho đối tượng
đó. Nghĩa là nếu tôi là một đối tượng, bạn cũng là một đối tượng thì tôi và
bạn sẽ có những thuộc tính khác nhau( màu mắt , màu tóc…).
Bây giờ chúng ta sẽ tìm hiểu về Thuộc tính(Properties) và Biến(Variable).
Biến được khai báo trong một lớp chứa dữ liệu cho từng đối tượng cụ thể. Điều
này có nghĩa là khi bạn tạo một đối tượng từ một lớp, đối tượng sẽ cấp phát một vùng
nhớ để chứa dữ liệu của biến đó. Ví dụ:
class Nguoi
{
public int tuoi;
public string mautoc;
}
Ta đã có một lớp Nguoi có 2 biến tuoi, mautoc.Ta sẽ tạo một vài đối tượng trên Class
đó
static void Main(string[] args)
{ Nguoi Thanh =new Nguoi();
Nguoi Hien =new Nguoi();
// Thiết lập thuộc tính cho các đối tượng vừa tạo.
Thanh.tuoi=21;
Thanh.mautoc="Vàng";
Hien.tuoi=22;
Hien.mautoc="Nâu";
// Xuất ra màn hình.
System.Console.WriteLine("Tuổi của Thạnh:{0},và của Hiền là:
{1}",Thanh.tuoi,Hien.tuoi);
Console.ReadLine();
}
Trong ví dụ trên ta đã tạo ra 2 đối tượng Thanh, Hien thuộc lớp Nguoi.Khi tạo đối
tượng Thanh bộ nhớ sẽ cấp phát một vùng nhớ cho 2 biến thành viên(tuoi, mautoc),
tương tự như đối tượng Hien.Bây giờ mỗi đối tượng đều có dữ liệu khác nhau và có thể
gán bất kỳ giá trị nào nếu chúng ta muốn. Một vấn đề đặt ra là nếu chúng ta gán giá trị
cho biến tuoi là 315, hay 450 thì sao?. Để giải quyết vấn đề này, chúng ta sử dụng thuộc
tính.
Thuộc tính là cách để truy xuất biến của lớp một cách an toàn.Chúng ta tiến hành
xét đến VD:
class Nguoi
{
// Đặt Properties cho tuoi
public int tuoi
{
get
{
return tuoi;
}
set
{
if (value >=18 && value<=65)
{
tuoi=value;
}
else
{
tuoi=18;
}
}
}
//Đặt Properties cho mautmautoc
public string mautoc
{
get
{
return mautoc;
}
set
{
mautoc=value;
}
}
Đoạn code trên đã được thay đổi, hãy chú ý đến các thuộc tính mà chúng ta vừa
tạo ra ở trên. Một thuộc tính bao gồm 2 phương thức truy xuất. Phương thức get có nhiệm
vụ lấy giá trị của biến, còn phương thức set có nhiệm vụ thay đổi giá trị của biến. Do đó
đoạn mã cho phương thức get khá đơn giản, chúng ta sử dụng từ khoá return với tên biến
mà cần lấy giá trị. Sau khi hoàn thành phần thuộc tính, ta đặt chúng vào chương trình như
sau:
static void Main(string[] args)
{
Nguoi Thanh =new Nguoi();
Nguoi Hien =new Nguoi();
// Thiết lập thuộc tính cho các đối tượng vừa tạo.
Thanh.tuoi=21;
Thanh.mautoc="Vàng";
Hien.tuoi=22;
Hien.mautoc="Nâu";
// Xuất ra màn hình.
System.Console.WriteLine("Tuổi của Thạnh:{0},và của Hiền là:
{1}",Thanh.tuoi,Hien.tuoi);
Console.ReadLine();
}
Ở đây các bạn thấy rất giống với đoạn code trước, tuy nhiên về bản chất chúng
khác nhau hoàn toàn. Ở đoạn trên chúng ta truy xuất trực tiếp đến các biến, còn đoạn
dưới, chúng ta truy xuất thông qua các thuộc tính của các đối tượng.
Khi bạn gán một giá trị vào thuộc tính, C# sẽ dùng phương thức set. Ưu điểm của
việc dùng phương thức này là chúng ta có thể điều khiển được các giá trị gắn vào và kiểm
tra xem có hợp lệ hay không, thậm chí trong vài trường hợp chúng ta có thể thay đổi giá
trị đó. Khi bạn gán một giá trị vào thuộc tính, C# thay đổi giá trị trong biến và bạn có thể
truy xuất giá trị của biến bằng cách sử dụng từ khoá value như đã dùng ở trên:
set
{
if (value>=18 && value<=65)
{
tuoi=value;
}
else
{
tuoi=18;
}
}
Ta thấy trong đoạn code trên sử dụng câu lệnh if để kiểm tra giá trị được gán vào vì
trong một lý do nào đó chúng ta muốn bất kỳ đối tượng nào đó của lớp người đều phải có
tuổi từ 18->65. Ở đây ta kiểm tra giá trị và nếu chúng nằm trong khoảng quy định, ta sẽ
lưu vào biến tương ứng, nếu không chúng sẽ đổi thành 18. Đây chỉ là một VD đơn giản
về thuộc tính.
Cách tạo Lớp và Đối tượng:
Dùng từ khoá class tương tự như ví dụ trên. Còn ở đối tượng, ngoài cách trên
chúng ta có thể dùng phương thức khởi dựng đối tượng gán giá trị mặc định cho đối
tượng:
Nguoi Thanh =new Nguoi(20,”Den”);
Ở đây chúng ta khai báo các giá trị của biến trong khi tạo đối tượng. Nhưng để
đoạn code này làm việc, chúng ta cần khai báo constructor trong lớp Nguoi, vấn đề
này khá đơn giản các bạn có thể tham khảo trong MSDN.

17 ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrfpropertiespg.htm

18

19 II./ Các phương thức trong C# :


Các chương trình máy tính luôn tồn tại để giải quyết một vấn đề nào đó, và luôn
có phương thức để giải quyết.
Tất cả các chương trình đều được xây dựng từ một vài lớp. Và những lớp này đều
chứa những phương thức để giải quyết những vấn đề của chương trình.VD phương thức
chuyển chuỗi thành số :
private int[] toARR(string s)
{
int o=s.Length();
int[] iarray=new int[o];
for (int i=0 ;i<s.Length;i++)
{
iarray[i]=Convert.ToInt32( s.Substring(i,1));
}
return iarray;
}
Như vậy với phương thức toARR() vấn đề của chúng ta đã được giải quyết. Các
bạn cần lưu ý chúng ta đang sử dụng các phương thức của .NET Framework Class
Library(FCL) như ToInt32(), subString() để tạo ra những phương thức mới. Điều này làm
cho công việc lập trình trở nên nhẹ nhàng hơn.
Khi bạn khai báo một biến trong phương thức thì nó là biến cục bộ của phương
thức đó. Và không có phương thức nào có thể truy xuất đến biến cục bộ của phương thức
đó.
Các phương thức rất có ích khi chương trình của bạn lặp đi lặp lại nhiều lần. Khi
đó chúng ta có thể biến đoạn mã đó thành phương thức và gọi phương thức mỗi khi sử
dụng.
Về cơ bản ta đã hiểu phương thức là gì, các tham số (parameter), và trị trả về
(return value), thế còn trong C# thì sao. Giả sử chúng ta có một đoạn mã và cần đặt
chúng vào một phương thức : Console.WriteLine(Math.Sqrt(9));.
Dòng mã này dùng phương thức Sqrt() của lớp Math để lấy căn bậc 2 của 9.
Chúng ta cần viết một phương thức để ghi ra màn hình console căn bậc 2 của 9 :
static void sqrtConsole(double x)
{
Console.WriteLine(Math.Sqrt(9));
}
Để hiểu rõ vấn đề chúng ta đi tìm hiểu khái niệm tham số và trị tham số . Hầu hết
các phương thức đều cần có một vài thông tin gì đó để hoàn thành công việc. VD:
toARR() thì cần một tham số kiểu string. Như vậy tham số sẽ đại diện cho giá trị thực sự
mà chúng ta truyền vào cho phương thức mỗi khi được gọi. Và những giá trị truyền vào
đó được gọi là trị tham số. Mỗi tham số đều thuộc một kiểu dữ liệu nào đó và các trị tham
số truyền vào phải cùng kiểu dữ liệu của tham số đó. Sau mỗi phương thức, chúng ta đều
nhận được giá trị của phương thức đó, gọi là trị trả về VD: return iarray;
Cuối cùng ta đi đến một khái niệm phương thức : “Tập hợp gồm Tên phương
thức, danh sách các đối số, kiểu trị trả về gọi là khai báo phương thức đó”.
Chúng ta đều biết phương thức Main là ngõ nhập chính của tất cả các chương
trình C#. Đó là phương thức đầu tiên mà trình biên dịch sẽ gọi. Do đó, tất cả các phương
thức (do người dùng tạo & FCL) sẽ được gọi trong phương thức Main .VD: Giả sử ta có
2 phương thức sau :
1. public void A()
{
//Coding for A...
}

2.public void B( int x)


{
//Coding for B...
}

Và từ phương thức Main() ta gọi chúng như sau :


static void Main(string [] args)
{
A();
B(1001);
//..........
}

III./ Cấu trúc chương trình :


C# là một ngôn ngữ lập trình mang đặc điểm của C++, phong cách của Java và có
mô hình ứng dụng của Visual Basic. Nếu đã biết C++ thì bạn sẽ mất khoảng 1 giờ để tìm
hiểu cú pháp của C#. Cấu trúc chương trình Java, khái niệm về gói(Package), garbage
collection… chắc chắn sẽ giúp bạn học C# nhanh hơn.
1. Cấu trúc một chương trình C#
C# là một chương trình thuộc dạng case-sensitive( phân biệt chữ hoa, chữ
thường), tương tự như cú pháp của C++. Tuy nhiên, C# không giống như C++ ở chỗ,
trong C# không chó sự phân chia giữa phần khai báo(header) và phần hiện thực
(cpp).Mọi đoạn mã (class và hiện thực) đều được đặt trong một file có phần mở rộng .cs.
Chúng ta xét một ví dụ quen thuộc với tất cả các ngôn ngữ lập trình - Hello:
namespace WindowsApplication1
{
public class Hello
{
static void Main(string [] args)
{
Console.WriteLine("Hello Everybody!!!");

}
}
}
Trong C# tất cả các câu lệnh, phương thức… được “gói” trong một class, tất cả các class
được “gói ” trong một namespace.Cũng giống như C++, có một chương trình chính chứa
những điểm nhập cho chương trình nhập của bạn – đó là “Main”.
Không cần đặt dấu chấm phẩy sau một khối class hay sau định nghĩa struct. Đó là
quy định của C++, C# không cần.

2. namespace
Mỗi class được gói trong một namespace. Thật ra namespace là một khái niệm trong
C++, nhưng trong C# chúng ta dùng thường xuyên hơn. Các bạn có thể truy cập một class
trong namespace thông qua toán tử dấu chấm(.).
Bây giờ chúng ta sẽ viết lại chương trình Hello bằng cách truy xuất lớp Hello từ
một lớp khác trong một namespace khác:
namespace AnotherNamespace
{
class Anotherclass
{
public void Func()
{
Console.WriteLine("Hello Everybody!!!");
}
}
}
Bây giờ từ lớp Hello , chúng ta có thể truy xuất tới nó:
namespace Mynamespace
{
class Hello
{
static void Main(string [] args)
{
Anotherclass obj =new Anotherclass();
obj.Func();
Console.ReadLine();

}
}
}
Trong thư viện .NET, system là namespace cấp cao nhất trong các namespace.Trong
C#, bằng cách mặc định tồn tại một namespace toàn cục, một class định nghĩa bên ngoài
một namespace sẽ được lưu trực tiếp trong namespace toàn cục này và do đó có thể truy
xuất lớp này mà không cần bất kỳ một qualifier (bổ từ ) nào. Chúng ta cũng có thể định
nghĩa những namespace lồng nhau .
ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrfNamespace.htm

3. Biến (Variables)
Biến trong C# hầu hết đều giống như C++, ngoại trừ những điểm khác biệt sau:
- Biến trong C# luôn cần khởi tạo trước khi bạn truy xuất tới nó, nếu không
bạn sẽ bị báo lỗi trong khi biên dịch. Do đó bạn cần nhớ rằng không thể
truy xuất một biến chưa được khởi tạo.
- Bạn không thể truy xuất một con trỏ không trỏ vào đâu cả trong C#.
- Một biểu thức không thể gọi một phần tử của mảng (array) mà chỉ số của
nó vượt khỏi kích thước của mảng.
- Không có khái niệm biến toàn cục hay hàm toàn cục trong C# và những
khái niệm về toàn cục được biễu diễn thông qua hàm và biến static.

ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrfStaticPG.htm

4. Kiểu dữ liệu (Data structs)


Tất cả các những kiểu dữ liệu của C# được định nghĩa trong Object. Có 2 loại
kiểu dữ liệu:
- Kiểu dữ liệu cơ bản (dựng sẵn) .
- Kiểu dữ liệu do người dùng định nghĩa.
Dưới đây là những kiểu dữ liệu dựng sẵn:

Kiểu Kích thước Mô tả


Byte 1 Unsigned byte
Sbyte 1 Signed byte
Short 2 Signed short
Ushort 2 Unsigned short
Int 4 Signed integer
Uint 4 Unsigned integer
Long 8 Signed Long
Ulong 8 Unsigned Long
Float 4 Float pointing
Double 8 Double precision
Decimal 8 Fixed precision
String Unicode string
Char Unicode char
Bool true, false Boolean

CHÚ Ý : Các kiểu dữ liệu trong C++ và C# không giống nhau, ví dụ: kiểu long
trong C++ là 4 bytes, trong C# là 8 bytes. Kiểu bool và string cũng khác, kiểu bool trong
C# chỉ chấp nhận giá trị true, false không chấp nhận kiểu integer.
Kiểu dữ liệu do người dùng định nghĩa bao gồm:
- Class.
- struct.
- interface.

Nếu phân chia theo kiểu dữ liệu theo sự cấp phát bộ nhớ thì ta có thể chia làm hai
loại:
- Kiểu giá trị.
- Kiểu tham khảo.
Kiểu giá trị: là những dữ liệu được cấp phát bộ nhớ trong stack. Các loại dữ liệu
này bao gồm :
+ Tất cả những kiểu dữ liệu dựng sẵn, ngoại trừ kiểu string
+ Struct
+ Kiểu liệt kê.
Kiểu tham khảo: được cấp phát bộ nhớ trên heap và sẽ trở thành rác khi chúng
không còn sử dụng nữa. Để khai báo kiểu dữ liệu loại này chúng ta dùng từ khoá new, và
không như C++, không có từ khoá delete. Trong C#, chúng tự động gom lại nhờ công cụ
“garbage collection”. Kiểu tham khảo bao gồm:
+ class
+ Interface
+ Kiểu tập hợp như mảng.
+ String.
Kiểu liệt kê (Enumeration): Kiểu liệt kê trong C# hoàn toàn giống C++, chúng
được định nghĩa thông qua từ khoá enum.VD:
enum Weekdays
{
Sat,Sun,Mon,Tue,Wed,Thur,Fri
}
ms-help://MS.VSCC/MS.MSDNVS/csref/html/vcrefintegraltypes.htm

5. Class & Struct


Class & Struct cũng tương tự như trong C++ chỉ khác nhau về sự cấp phát bộ nhớ.
Class được cấp phát bộ nhớ trong heap thông qua cách dùng new, Struct được cấp phát
bộ nhớ trong stack. Struct trong C# là kiểu dữ liệu rất nhẹ và nhanh. Do đó, với những
kiểu dữ liệu nặng, chúng ta nên khai báo class.Xét VD:
struct Date
{
int day;
int month;
int year;
}// không có dấu chấm phẩy ở đây.

class Date
{
int day;
int month;
int year;
string Weekday;
string monthName;
public int Getday()
{
return day;
}
public int Getmonth()
{
return month;
}
public int Getyear()
{
return year;
}
public int SetDay(int Day)
{
day=Day;
}
public int SetMonth(int Month)
{
month=Month;
}
public int SetYear(int Year)
{
year=Year;
}
public void SetDate(int day, int month, int year)
{
………
}
}
class: ms-help://MS.VSCC/MS.MSDNVS/csref/html/vcrefTheClassType.htm
struct:ms-help://MS.VSCC/MS.MSDNVS/csref/html/vcrefStructTypes.htm

6. Properties
Nếu các bạn đã quá quen thuộc với hướng đối tượng trong C++, chắc chắn bạn sẽ
am hiểu về properties(thuộc tính). Trong C# cung cấp những cách thuận tiện, đơn giản và
trực tiếp để truy xuất những thuộc tính. Ta viết lại VD trên như sau:

class Date
{
public int Day
{
get
{
return Day;
}
set
{
Day=value;
}
}
int day;
public int Month
{
get
{
return Month;
}
set
{
Month=value;
}
}
int month;
public int Year
{
get
{
return Year;
}
set
{
Year=value;
}
}
int year;
public bool IsLeapYear(int year)
{
return year %4==0? true:false;
}

public void SetDate(int day, int month, int year)


{
this.day=day;
this.month=month;
this.year=year;
}
}

Và cách thiết lập thuộc tính:


class User
{
public void Main(string[] args)
{
Date date=new Date();
date.Day=27;
date.Month=12;
date.Year=2003;
Console.WriteLine("Date is : {0}/{1}/{2}" ,date.Day,date.Month,date.Year);
Console.ReadLine();
}
}
ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrfpropertiespg.htm

7. Modifier (Bổ từ) (ms-


help://MS.VSCC/MS.MSDNVS/csref/html/vclrfcsharpkeywords_pg.htm)
Trong C++ chúng ta đã quá quen thuộc các bổ từ thông dụng như: public, private,
protected. Chúng ta có một số từ mới trong C#:
* readonly: chỉ được dùng cho những dữ liệu thành viên của class. Dữ liệu kiểu
readonly chỉ có thể đọc khi chúng đã được khởi tạo trực tiếp hay gán giá trị cho chúng
trong constructor.Sự khác nhau giữa dữ liệu kiểu readonly và const là khi khai báo hằng,
ta phải khởi tạo giá trị cho nó một cách trực tiếp.VD:
class Myclass
{
const int constInt=100; // khai báo trực tiếp.
readonly int myInt1;
public Myclass()
{
myInt1=13;
}
public void Func()
{

Console.WriteLine(myInt1.ToString());
}
}
* sealed: Khi sử dụng từ khoá này để khai báo một class sẽ không cho phép bạn
lấy bất kỳ một class nào từ nó. Do đó chúng ta nên sử dụng sealed cho những lớp mà
chúng ta không muốn những lớp con thừa kế chúng.
sealed class pppp
{
int d=1000;
}

* unsafe: Chúng ta có thể định nghĩa một ngữ cảnh không an toàn trong C# bằng
từ khoá unsafe. Trong ngữ cảnh không an toàn chúng ta có thể viết một đoạn mã không
an toàn, VD con trỏ trong C++ chẳng hạn.VD:
class UnsafeTest
{
unsafe static void SquarePtrParam (int* p)
// unsafe method: takes pointer to int
{
*p *= *p;
}

unsafe public static void Main()


// unsafe method: uses address-of operator (&)
{
int i = 5;
SquarePtrParam (&i);
Console.WriteLine (i);
}
}
ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrfUnsafe.htm
*interface: Nếu bạn đã có khái niệm về COM, bạn sẽ dễ dàng hiểu được nội dung
của phần này. một interface là một lớp trừu tượng cơ bản, trong đó chỉ chứa những ký
hiệu của hàm, sự hiện thực những hàm này được cung cấp bởi những lớp con. Trong C#
bạn có thể định nghĩa những class như những interface thông qua từ khoá interface. .NET
có nền tảng từ nhiều interface. Trong C# bạn không thể dùng nhiều lớp thừa kế, điều mà
trong C++ cho phép, nhưng thực ra bản chất của sự thừa kế được thực hiện thong qua
interface. Những lớp con của bạn cũng có thể thực hiện đa interface.
interface myDrawing
{
int originx
{
get;
set;
}
int originy
{
get;
set;
}
void Draw(object shape);
}

class shape:myDrawing
{
int Orix;
int Oriy;
public int originx
{
get{
return Orix;
}
set
{
Orix=value;
}
}
public int originy
{
get
{
return Oriy;
}
set
{
Oriy=value;
}
}
public void Draw(object shape)
{
//.....
}
}
ms-help://MS.VSCC/MS.MSDNVS/csref/html/vcrefTheInterfaceType.htm
8. Array
Mảng trong C# có nhiều tính năng vượt trội hơn C++ rất nhiều. Mảng được cấp
phát bộ nhớ trong heap và do đó nó được truyền bằng tham khảo. Chúng ta không thể
truy xuất một phần tử vượt ngoài giới hạn trong một mảng(Có chỉ số lớn hơn số phần tử
trong mảng). Do đó C# đã khắc phục điều này. Ngoài ra C# còn cung cấp một số hàm hổ
trợ giúp để xử lý các phần tử trong mảng. Ta có thể thấy rõ sự khác nhau giữa cú pháp
của mảng trong C# và C++:
+ Dấu [] đựơc đặt sau tên kiểu chứ không phải sau tên biến.
+ Bạn có thể tạo vùng nhớ cho phần tử trong mảng bằng cách dùng từ
khoá new.
Ngoài ra C# còn hỗ trợ việc hiện thực mảng một chiều (single dimension), đa
chiều (multi dimension) và mảng của mảng (jagged dimension).
// Mảng một chiều
int[] array=new int[10];
for(int i=0;i<array.Length;i++)
array[i]=i;

// Mảng 2 chiều
int[,] array2=new int[5,10];
array2[2,10]=1234;

// Mảng 3 chiều
int [,,] array3=new int[2,3,6];
array3[1,1,5]=51;

// mảng của mảng


int [][]
arrayOfarray=new int[2];
arrayOfarray[0]=new int[4];
arrayOfarray[0]=new int[] {1,2,6};

ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrf[]Operator.htm

9. Indexer
indexer được dùng để viết một phương thức truy xuất trực tiếp một phần tử từ tập
hợp bằng cách dùng dấu [], như trong mảng. Việc bạn cần làm là chỉ rõ chỉ số cần truy
xuất một phần tử. Cú pháp của indexer cũng giống như của thuộc tính một class, ngoại
trừ chúng cần một thông số nhập, đó chính là chỉ số của phần tử cần truy xuất.
Chúng ta tiếp tục xét VD, và sẽ gặp lớp CollectionBase, đó là một lớp thư viện
dùng để tạo ra những tập hợp. Danh sách (list) là một protected member của lớp
CollectionBase, trong đó lưu trữ tập hợp các danh sách.
class shape:CollectionBase
{
public void add(Shape shp)
{
List.Add(shp);
}

//indexer
public Shape this[int index]
{
get{
return (Shape) List[index];
}
set{
List[index]=value;
}
}
}
ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrf[]Operator.htm

10. Boxing & Unboxing


Boxing là một khái niệm mới trong C#. Như đã đề cập ở trên, mọi kiểu dữ liệu do
người dùng hay dựng sẵn đều được lấy từ một lớp cơ bản là Object trong namespace
system. Do đó việc đóng gói những kiễu dữ liệu căn bản hay nguyên thuỷ vào trong class
Object được gọi là Boxing, và thao tác ngược lại gọi là unboxing. VD:
class Test
{
static void Main()
{
int myInt=2;
// boxing
object Obj=myInt;
// unboxing
int myInt2=(int) Obj;
}
}

Trong ví dụ trên cho ta thấy hai thao tác boxing và unboxing. Một giá trị int có
thể được chuyển thành kiểu Object và được chuyển đổi ngược lại kiểu int. Khi một kiểu
dữ liệu của một biến cần được chuyển thành một kiểu truyền bằng tham khảo, một kiểu
box được tạo ra để chứa giá trị, và giá trị được lưu trong box. Unboxing chỉ là quá trình
ngược lại. Khi một object box được trả về kiểu nguyên thuỷ, giá trị sẽ được chuyển từ
box sang ô nhớ lưu trữ ban đầu.

ms-
help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfSystemReflectionPointerClassBoxTopic.htm

11. Các thông số của hàm


Trong C# có 3 loại thông số:
1. Thông số in/ truyền bằng trị.
2. Thông số in-out / truyền bằng tham khảo.
3. Thông số out.
Nếu bạn đã hiểu về COM, interface và những kiểu thông số của nó, bạn sẽ dễ dàng hiểu
được các thông số của C#.
Thông số in/ truyền bằng trị: Khái niệm thông số truyền bằng trị cũng tương tự như
C++. Giá trị truyền được chép vào một ô nhớ và được truyền vào hàm.VD:
setDay(6);
void setDay(int day)
{
//........
}
Thông số in-out/ truyền bằng tham khảo: Thông số truyền bằng tham khảo trong C++
được truyền thông qua con trỏ hay toán tử &. Trong C#, thông số truyền bằng tham khảo
còn được gọi là in-out, vì khi bạn truyền một địa chỉ tham khảo của một ô nhớ, bạn đã
truyền một giá trị nhập và lấy một giá trị xuất từ hàm đó. Chúng ta không thể truyền một
thông số chưa khởi tạo từ một hàm.C# dùng từ khoá ref để chỉ thông số truyền bằng tham
khảo. Chúng ta cũng có thể dùng từ khoá ref cho một đối số trong khi truyền nó vào một
hàm có thông số truyền bằng tham khảo. VD:
int a=5;
FunctionA(ref a);
void FunctionA(ref int val)
{
//..........
}
Thông số out: Là thông sốchỉ trả về giá trị là kết quả của một hàm, không đòi hỏi
giá trị nhập.C# dùng từ khoá out cho loại tham số này.VD:
int val;
getVal(val);
bool getVal(out int val)
{
//..........
}
11. Số lượng các thông số và mảng
Để truyền thông số là một mảng trong C#, người ta dùng từ khoá params. Chỉ có
thể có một đối số kiểu mảng. Bạn có thể truyền phần tử như là một đối số của mảng đó.
VD:
void Func(params int[] array)
{
Console.WriteLine("Số phần tử của mảng là : {0}",array.Length);
}
Func();
Func(5)
Func(9);
Func(new int[] {3,8,7});
int [] array=new int[8]; {1,2,3,4,5,7,2,8};
Func(array);

12. Toán tử và biểu thức


Hầu hết các toán tử trong C# đều giống như trong C++. Tuy nhiên C# còn bổ
sung thêm một số mới và hữu ích.
Toán tử is : Dùng để kiểm tra xem kiểu của các toán hạng có tương đương nhau
không. Toán tử is thường dùng trong kịch bản đa ngữ cảnh. Toán tử này có 2 toán hạng
và trả về kiểu bool.
void testis (object param)
{
if ( param is ClassA)
//.......doing ...
else if (param is myStruct)
//.....doing something
}
Toán tử as : Kiểm tra xem kiểu các toán hạng có khả đổi hay không, nếu có thì kết
quả trả về là một đối tượng đã được chuyển đổi hay được box. Nếu đ.tượng không được
chuyển đổi hay box được, kết quả trả về là Null. VD:
Shape shp=new Shape();
Vehicle veh=new Vehicle();
Circle cir=new Circle();
Shape shp=cir;
Circle cir2=shp as Circle;
object[] objects=new object[2];
objects[0]="Aisha";
objects[1]=new Shape();

string str;
for (int i=0; i&< objects.Length;i++)
{
str=objects[i] as string;
if (str==null)
Console.WriteLine("Không thể Convert !!");
else
Console.WriteLine("{0}",str);
}
ms-help://MS.VSCC/MS.MSDNVS/tsqlref/ts_oa-oz_3qpf.htm

13. Câu lệnh (Statement)


Đa số các câu lệnh đều giống C++, ngoài ra còn có một số câu lệnh mới bổ sung,
và có một số sửa đổi cho câu lệnh cũ. Sau đây là một số câu lệnh mới:
foreach: Dùng cho việc thực hiện vòng lặp cho tập hợp như mảng (ý nghĩa tương
tự như for each .. trong VB).VD:
foreach(string s in array)
Console.WriteLine(s);
lock: Dùng để bao một đoạn code thành một session.
checked/unchecked: Dùng để kiểm tra tràn trong các toán tử có đối số là số. VD:
int x=Int32.MaxValue;x++;
{
x++;
}
unchecked
{
x++;
}
Một số thay đổi :
-Switch: Trong C# switch có một số thay đổi như sau:
1. Sau khi thực thi một câu lệnh case, chương trình sẽ không nhảy đến
câu lệnh kế tiếp .VD:
int var=100;
switch (var)
{
case 100:
Console.WriteLine("<Value is 100>");
// Không dùng break;
case 200:
Console.WriteLine("<Value is 200>");
case ...:
break;// kết thúc .

}
Trong C++, kết quả sẽ là : <Value is 100> , <Value is 200> tuy nhiên trong C#,ta sẽ
nhận được thông báo lỗi như sau:
Error CS0163: Control cannot fall through from one case lable (‘case 100:’) to
another
Tuy nhiên, chúng ta sẽ làm lại như sau:
int var=100;
switch (var)
{
case 100:
case 200:
Console.WriteLine("100 or 200 <Value is 200>");
case ...
break;// kết thúc .

}
2. Chúng ta cũng có thể dùng hằng trong giá trị case.VD:
const string Weekend="Sun";
const string Weekday1="Mon"; //......
string Weekday=Console.ReadLine();

switch (Weekday)
{
case Weekend:
Console.WriteLine("Hôm nay là cuối tuần ");
break;
case Weekday1:
Console.WriteLine("Hôm nay là thứ hai");
case ...
break;// kết thúc .

-deletgate: Cho phép chúng ta lưu sự tham khảo hàm vào một biến.Trong C++
việc này giống như dùng và lưu con trỏ hàm và chúng ta hay dùng typedef.VD:
delegate int Operation(int val1, int val2)
public int Add(int val1, int val2)
{
return val1+val2;
}
public int Sub(int val1, int val2)
{
return val1-val2;
}
public void perform()
{
Operation Oper;
Console.WriteLine("Nhập vào + hay -");
string op=Console.ReadLine();
Console.WriteLine("Nhập vào số thứ nhất :");
string val1=Console.ReadLine();
Console.WriteLine("Nhập vào số thứ hai :");
string val2=Console.ReadLine();
val1=Convert.ToInt32(val1);
val2=Convert.ToInt32(val2);
if (op=="+")
Oper = new Operation(Add);
else
Oper = new Operation(Sub);
Console.WriteLine("Result is : {0}",Oper(val1,val2));
Console.ReadLine();
}
ms-help://MS.VSCC/MS.MSDNVS/csref/html/vclrfStatements.htm

13. Tính thừa kế và tính đa hình


Trong C# chỉ cho kế thừa đơn. Nếu muốn đa kế thừa chúng ta dùng interface.VD:
class cha
{
}

class con: cha


ms-help://MS.VSCC/MS.MSDNVS/midl/mi-laref_1hut.htm

14. Hàm ảo
Từ khái niệm hàm ảo đến hiện thực khái niệm đa hình trong C# là như nhau,
ngoại trừ việc dùng từ khoá override đối với việc hiện thực hàm ảo trong class con. Lớp
con vẫn sử dụng từ khoá virtual. Lớp nào override phương thức ảo cũng sử dụng từ khoá
override.
class Shape
{
public virtual void Draw ()
{
Console.WriteLine("Shape.Draw");
}
}
class Rectangle:Shape
{
public override void Draw()
{
Console.WriteLine("Rectangle.Draw");
}
}
class Square:Rectangle
{
public override void Draw()
{
Console.WriteLine("Square.Draw");
}
}
class MainClass
{
static void Main()
{
Shape[] shp=new Shape[3];
Rectangle rect=new Rectangle();
shp[0]=new Shape();
shp[1]=rect;
shp[2]=new Square();
shp[0].Draw();
shp[1].Draw();
shp[2].Draw();
}
}
Kết quả như sau:
Shape.Draw
Rectangle.Draw
Square.Draw

Sau đây chúng ta làm ẩn đi lớp cha bằng cách dùng “new”. Trong một lớp con,
chúng ta có thể định nghĩa một hàm mới, ẩn với lớp cha, bằng cách dùng từ khoá new.Ở
VD trên, chúng ta đổi từ khoá override thành new trong lớp Rectangle.
class Shape
{
public virtual void Draw ()
{
Console.WriteLine("Shape.Draw");
}
}
class Rectangle:Shape
{
public new void Draw() // được đổi từ override ->new
{
Console.WriteLine("Rectangle.Draw");
}
}
class Square:Rectangle
{
public new void Draw()
{
Console.WriteLine("Square.Draw");
}
}
class MainClass
{
static void Main(string[] args)
{
Console.WriteLine("Using polymorphism: ");
Shape[] shp=new Shape[3];
Rectangle rect=new Rectangle();
shp[0]=new Shape();
shp[1]=rect;
shp[2]=new Square();
shp[0].Draw();
shp[1].Draw();
shp[2].Draw();
Console.WriteLine("Using without polymorphism: ");
Square sqr=new Square();
sqr.Draw();
}

}
từ Kết quả trả về:
Using polymorphism:
Shape.Draw
Shape.Draw
Shape.Draw
Using without polymorphism:
Square.Draw

Trong VD trên, phương thức Draw() của lớp Rectangle không phải là dạng đa
hình của phương thức Draw() trong lớp Shape. Thay vì vậy, nó được xem là một phương
thức khác. Do đó để tránh sự trùng lặp giữa lớp cha và lớp con ta nên dùng từ khoá new.
Lưu ý : Chúng ta không nên dùng 2 phương thức cùng tên trong một lớp nếu một phương
thức dùng từ khoá new, phương thức kia dùng từ khoá override hay virtual. Do đó, trong
lớp Square không thể override phương thức Draw của lớp Shape.
Nếu lớp con có dữ liệu member cùng tên với dữ liệu đó trong lớp cha, để tránh bị
trùng tên, dữ liệu và hàm member của lớp cha được truy xuất thông qua từ khoá base.
Trong VD sau, hãy xem cách constructor của lớp cha được gọi và dữ liệu member được
dùng.VD:

public Child(int Val):base(val)


{
myval=65;
base.myval;
}
hay
public Child(int Val)
{
base(val);
myval=65;
base.myval;
}

ms-help://MS.VSCC/MS.MSDNVS/vclang/html/_pluslang_Virtual_Functions.htm

Trên đây chỉ là những kiến thức cơ bản trong ngôn ngữ lập trình C#. Các bạn có
thể tìm hiểu thêm trong MSDN…..
=================================================Hết============================================
==============

Các cách hiển thị dữ liệu trong ASP.NET


Như chúng ta đã biết Web form là một control hiển thị dữ liệt trên ASP.NET.
Ngoài web form ta còn có các control khác để hiển thị dữ liệu một các linh
hoạt tuỳ vào yêu cầu của từ website nhất định mà ta có thể quyết định sử
dụng loại control nào.
I. Tạo Custom Tag (Web Custom Control)
Một trong những cách hiển thị và xử lý dữ liệu trong web là tạo ra
các customTag. Ta có thể xem các đối tượng UI trong web form là các
customTag do ASP.Net hỗ trợ.
Tạo một customTag:
- Trong C# customTag có tên là web Custom control.
- Để tạo 1 web Custom control ta phải tạo 1 project có tên web
Control library.
- Sau khi web Control library được tạo, thì web Custom control được
tạo mặc định. Dịch file (.cs) thành (.dll).
- Để sử dụng dll. tạo 1 project mới (webApp).
Đăng ký 1 custom Control.
- Từ project vào menu Tool\customize Toolbox…
- Trong tab .NET chọn brower. Chọn file dll vừa dịch, ấn OK.
- Lúc này, ta đã có 1 tool mới trên toolbar. Kéo tool này vào
document.

1. Tạo project Web Control Library.


- Vào menu File\New\Project…
- Trong hộp thoại New Project:
-

- Chọn Web Control Library.


- Nhập tên project mới (ta nhập CustomTag). (tên của project là
tên namepase của các đối tượng sau này).
- Nếu project chính đã được tạo và đang mở thì chọn Add to
Solution. Nếu chưa có project chính thì chọn Close Solution.
- Click vào OK. Dialog project được đóng, trong cửa sổ Solution
Explorer xuất hiện một project mới.

- Một control được tạo có tên WebCustonControl1.cs.


2. Dịch control WebCustonControl1.
- Vào menu Build\Build CustomTag.
- Lúc này CustomTag.dll đã được tạo trong thư muc bin của project.
3. Đăng ký một Custom Control.
- Vào menu Tool\Customize ToolBox… hoăc ấn chuột phải lân
toolbar chọn Customize ToolBox… .
- Hộp thoại Customize ToolBox xuất hiện chọn .NET Framework
Components.
- Trong tab .NET Framework Components. Chọn nút Browse…
- Thoại Open xuất hiện, chọn đường dẫn đến tập tin CustomTag.dll
(thường tập tin này nằm trong Solution chứa project\tên
project\bin\Debug).
- Click vào Open.
- Trong hộp thoại Customize ToolBox có thêm dòng
WebCustomControl1 được đánh dấu.
- Click OK. Bậy giờ chúng ta để ý trên thanh ToolBar xuất hiện một
control mới có tên WebCustomControl1.
4. Sử dụng một CustomControl.
- Nếu muốn sử dụng control này ta cứ việc kéo control này vào
WebForm.
- Nhưng khi chúng ta sử dụng control này cần chú ý đến vị trí đặt
của control, vì control được đặt đâu trong code HTML thì dữ liệu
được in ở chỗ đó. (để biết cách in dữ liệu trong web Custom, xen
tiếp phần Nội dung của web Custom Control).
- Từ cửa sổ HTML code ta thất xuất hiện dòng code được tô vàng:
<%@ Register TagPrefix="cc1" Namespace="CustomTag"
Assembly="CustomTag" %>

- Đây là dòng đăng ký sử dụng dll CustomTag.


- Ngoài dòng code để đăng ký sử dụng dll, ta còn có một dòng code
khác, thường dòng code này được đặt trong nhãn <Form>:
<cc1:WebCustomControl1 id="WebCustomControl11"
style="Z-INDEX: 101; LEFT: 48px; POSITION: absolute;
TOP: 280px" runat="server"></cc1:WebCustomControl1>

- Đây là dòng quyết định sử dụng control nào trong project đã được
đăng ký.

5. Nội dung của một Web Custom Control.


- Một class Web Custom Control là class kế thừ lớp
System.Web.UI.WebControls.WebControl. Khi ta kế thừa class
WebControl thì từ class này ta cò truy xuất đến các đối tượng của
web thông qua object Page.
Ví dụ: this.Page.Request Là truy xuất đến đối tượng request của
webPage.
- Các lớp được sử dụng:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;

- Cũng giống như những class bình thường đầu tiên vẫn là khai báo
namespace.
namespace CustomTag

- Rồi đến khai báo class.


public class WebCustomControl1 :
System.Web.UI.WebControls.WebControl
- Cuối cùng là phương thức:
protected override void Render(HtmlTextWriter output)

- Đây là phương thức default của một Web Custom Control. Nó sẽ


được chạy khi Web Custom Control đươc sử dụng và nhận vào
một HtmlTextWriter (output). Output này dùng để in nội dụng ra
khi sử dụng Web Custom Control.
- Nếu như trong phương thức ta có dòng:
output.Write("AZ Solution");

- Thì khi chay trang web có sử dụng Web Custom Control này sẽ in
dòng “AZ Solution” ngay vị trí đặt Web Custom Control.
Xây dựng thuộc tính cho Web Custom Control.
- Trước tiên ta xây dựng một thuộc tính để chứa dữ liệu.
private string text;

- Khai báo một thuộc tính.


public string Text
{
get
{
return text;
}

set
{
text = value;
}
}

- Từ đây trong control ta có thể truy xuất đến text hay Text đều
được.
- Trong lúc khởi tạo control trong HTML ta gán thuộc tính cho
control.
<cc1:WebCustomControl1 id="WebCustomControl11" runat="server"
Text="AZ Solution"></cc1:WebCustomControl1>

Xem ví dụ:
http://azweb05/WebUIDemo/useCustomTag.aspx.
Xem document:
ms-
help://MS.VSCC/MS.MSDNVS/vbcon/html/vbwlkwalkthroughcreatingcust
omwebcontrols.htm
II. Tạo một Web User Control.
1. Tạo một Web User Control.
- Tạo một Web User Control ta không cần phải tạo một project mới
như Web Custom Control, mà ta có thể sử dụng project chứa
trong aspx, vì thực chất các Web User Control có thể được xem
như là một web form.
- Từ Solution Explorer click phải vào project chọn Add\Add Web
User Control.

- Hộp thoại Add New Item xuất hiện, nhập tên control vào textbox
Name, click Open.
- Lúc này trong cửa sổ Solution Explorer xuất hiện control
WebUserControl1.ascx.
- Đối tượng này gồm có hai file, WebUserControl1.ascx và
WebUserControl1.ascx.cs.
- Trong file WebUserControl1.ascx ta có thể tạo các control của
web form hay HTML.
- Trong file WebUserControl1.ascx.cs ta có thể tạo các thuộc tính
và gán dữ liệu cho các control trên form.
2. Bắt đầu tạo một control cho Web User Control.
- Từ form control (WebUserControl1.ascx) ta tạo một text box từ
toolbar.
- Trong code HTML xuất hiện dòng:
<asp:TextBox id=TextBox1 runat="server">

- Trong file WebUserControl1.ascx.cs. Đây là một class kế thừa lớp


System.Web.UI.UserControl .

- Để truyền dữ liệu cho textbox vừa tạo ta khai báo một thuộc tính
value.
public string values;
- Sau đó trong sự kiện load của control ta gán giá trị value này cho
textbox.
private void Page_Load(object sender, System.EventArgs e)
{
this.TextBox1.Text = values;
}

3. Sử dụng Web User Control vào Web Form.


- Từ web form ta kéo Web User Control vừa tạo từ cửa sổ Solution
Explorer vào web form.
- Để gán giá trị cho textbox trên Web User Control ta chỉ cần gán
giá trị value của control vừa được tạo trên web form trong sự kiện
load của web form
protected WebUserControl1 Menu1;
private void Page_Load(object sender, System.EventArgs e)
{
Menu1.values="AZ Solution";
}

- Đối tượng Menu1 là control vừa được tạo từ trên. Nếu VS.NET
không tự khởi tạo đối tượng thì ta phải tự khởi tạo bằng tay.
- Bây giờ chạy trang web thì Web User Control là một textbox có
chứa dòng chữ “AZ Solution”.
Xem ví dụ:
http://azweb05/WebUIDemo/use_userControl.aspx
Xem document:
ms-
help://MS.VSCC/MS.MSDNVS/vbcon/html/vbwlkwalkthroughcreatingw
ebusercontrols.htm
Kết luật:
Trong lập trình web, Web Custom Control là một công cụ không
thể thiếu. Ta có thể viết một lần và sử dụng cho tất cả các trang web,
chỉ cần đăng ký và sử dụng.
Web Custom Control có thể được xem là một control trong web form
mà do người lập trình định nghĩa.
Ngoài Web Custom Control, MS còn hỗ trợ một công cụ khác nữa đó
là Web User Control. Công cụ này dễ sử dụng hơn, nó được sử dụng
giống như web form và có thể viết code HTML, tương tác đến sự kiện
của các control nhưng không thể sử xây dựng thành một công cụ như
Web CusTom Control vì nó được dịch trong lúc chạy.
Với những khả năng và giới hạn của từng control mà có cách sử dụng
tốt nhất như:
- Xây dựng Web Custom Control là có thể sử dụng không những
cho website hiện tại mà có thể sử dụng cho các website khác sau
này.
- Còn sử dụng Web User Control là có thể sử dụng cho website hiện
tại. Trong khi đó Web Form chỉ chó thể sử dụng cho trang hiện
tại. Vì thế, một Web Form có thể conver thành một Web User
Control một các tự động nhờ vào cộng cụ của VS.NET (xem ms-
help://MS.VSCC/MS.MSDNVS/vbcon/html/vbwlkwalkthroughconver
tingwebformtousercontrol.htm. trong document).
Xem tài liệu tổng quan:
ms-
help://MS.VSCC/MS.MSDNVS/vbcon/html/vboriWebUserControls.htm

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

Các đối tượng cần biết trong WEB.

I. Page.
Page là một đối tượng Servers. Nó chứa tất cả các control server
page.
Các thuộc tính cần quan tâm của đối tượng Page:
- Application:
- Request:
- Response:
- Session:
- Server:
Xem Document:
ms-
help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemwebuipagemembers
topic.htm
II. Response:
1. Lưu và đọc một cookie:
//Tạo thời gian lưu trữ
DateTime dt = DateTime.Now;
TimeSpan ts = new TimeSpan(0,0,10,0);
//Cấp phát một Cookie.
HttpCookie MyCookie = new HttpCookie("name");
MyCookie.Value = "AZ Solution";
MyCookie.Expires = dt.Add(ts);
//Lưu giá trị Cookie
Response.Cookies.Add(MyCookie);
//Đọc giá trị Cookie
String valueCookie = Response.Cookies["name"].Value;
//In giá trị Cookie ra trang web
Page.Response.Write(valueCookie);

2. Phương thứa write();


Ví dụ: ta muốn in một câu thông báo hay một đoạn script nào đó
trên trang web bằng các gọi một phương thức đã được định nghĩa
trong code của web form. Ta thực hiện như sau:
- Tạo một phương thức có tên print_text();
public void print_text(String text)
{
Page.Response.Write(text);
}
- Trong code HTML ta gọi phương thức print_text() vừa tạo.
<%
print_text("AZ Solution");
%>

* Nội dung được in đúng ngay vị trí lúc gọi phương thức print_text().
Xem Document:
ms-
help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemwebhttpresponseme
mberstopic.htm
III. Request:
1. Đọc tất cả các giá trị có trong đối tượng headers.
public void printHeaders()
{
int loop1, loop2;
System.Collections.Specialized.NameValueCollection
coll;
// Load Header collection vào đối tượng
NameValueCollection.
coll=Request.Headers;
// Đọc tên tất cả các thành phần vào mảng chuỗi.
String[] arr1 = coll.AllKeys;
for (loop1 = 0; loop1<arr1.Length; loop1++)
{
Response.Write("Key: " + arr1[loop1] + "<br>");
// Lấy tất cả các giá trị của tên.
String[] arr2=coll.GetValues(arr1[loop1]);
for (loop2 = 0; loop2<arr2.Length; loop2++)
{
Response.Write("Value " + loop2 + ": " +
arr2[loop2] + "<br>");
}
}
}
2. Đọc tất cả các giá trị có trong QueryString.
public void printQueryString()
{
int loop1, loop2;
// Load đối tượng NameValueCollection.
System.Collections.Specialized.NameValueCollection
coll=Request.QueryString;
// Đọc tên tất cả các thành phần vào mảng chuỗi.
String[] arr1 = coll.AllKeys;
for (loop1 = 0; loop1 < arr1.Length; loop1++) {
Response.Write("Key: " + arr1[loop1] + "<br>");
String[] arr2 = coll.GetValues(arr1[loop1]);
for (loop2 = 0; loop2 < arr2.Length; loop2++) {
Response.Write("Value " + loop2 + ": " +
arr2[loop2] + "<br>");
}
}
}

QueryString là dữ liệu được truyền từ trang này qua trang khác bằng
method get. Tức dữ liệu truyền đi được hiển thị trong URL.
Ví dụ: một cách truyền dữ liệu theo QueryString.
http://azweb05/WebUIDemo/WebForm1.aspx?name=AZ
Solution&value=1
Để lấy giá trị của name và value. Ta viết:
Page.Response.Write(Request.QueryString["name"]);
Page.Response.Write(Request.QueryString["value"]);

3. Đọc tất cả các đối tượng trong Form.


public void printForms()
{
int loop1;
System.Collections.Specialized.NameValueCollection
coll;
//Load Form variables vào đối tượng
NameValueCollection.
coll=Request.Form;
// Đọc tên tất cả các thành phần vào mảng chuỗi.
String[] arr1 = coll.AllKeys;
for (loop1 = 0; loop1 < arr1.Length; loop1++) {
Response.Write("Form: " + arr1[loop1] + "<br>");
}
}
Trong ASP.NET, đối tượng Form là tập hợp các dữ liệu được truyền
trong method Post.
Ví dụ: ta có một form gồm một textbox và một nút submit. Thuộc
tính action là liên kết đến trang hiện tại (WebForm1.aspx). method =
post.
<form action="WebForm1.aspx" method="post" runat="server">
<asp:TextBox id="name" runat="server"></asp:TextBox>
<asp:button id="Button1" runat="server"
Text="Submit"></asp:button>
</form>

Khi nút submit được click, dữ liệu trong text được truyền đến trang
WebForm1.aspx. Lúc này để lấy dữ liệu trong textbox ta phải dùng
qua đối tượng Form.
Page.Response.Write(Request.Form["name"]);

* name là id của textbox.


4. Đọc tất cả các biến server.
public void printSerVerVariables()
{
int loop1, loop2;
System.Collections.Specialized.NameValueCollection
coll;
// Load ServerVariable collection vào đối tượng
NameValueCollection.
coll=Request.ServerVariables;
// Đọc tên tất cả các thành phần vào mảng chuỗi.
String[] arr1 = coll.AllKeys;
for (loop1 = 0; loop1 < arr1.Length; loop1++) {
Response.Write("Key: " + arr1[loop1] + "<br>");
String[] arr2=coll.GetValues(arr1[loop1]);
for (loop2 = 0; loop2 < arr2.Length; loop2++) {
Response.Write("Value " + loop2 + ": " +
arr2[loop2] + "<br>");
}
}
}

Với đối tượng Request ta có thể lấy tất cả các biến mội trường, thành
phần dữ liệu, dữ liệu truyền từ các trang khác.
Từ những ví dụ trên ta có thể lấy một thành phần dữ liệu khi ta biết
được tên hay vị trí (index) bằng cách truy xuất trực tiếp với tên hay
index.
Page.Response.Write(Page.Request.Params["name"]);

IV. Application
Các biến được lưu trong application có giá trị cho cả website. Tức
các trang trong website đều có thể truy xuất đến các biến này.
1. Gán một biến vào Application.
Page.Application.Set("name","AZ Solution");

Dữ liệu trong Application là một object.


2. Đọc dữ liệu trong Application.
String valueApp = (String)Page.Application.Get("name");

Ngoài ra ta còn có các phương thức và các thuộc tính khác của
Application.
V. Session.
Các biến trong Session có giá trị đối với từng user một.
1. Gán một biến vào Session.
Page.Session.Add("name","AZ Solution");

Trong Session không có phương thức Set giống như Application


mà sử dụng phương thức Add.
2. Đọc dữ liệu trong Session.
String valueSes = (String)Page.Session["name"];

Trong Session cũng không có phương thức Get mà các phần tử


trong Session là các item. Các item này được sử dụng như các một
mảng.

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

Read XML

private void Page_Load(object sender, System.EventArgs e)


{
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("application.xml"));
XmlElement root = doc.DocumentElement["information"];
Page.Response.Write(root.GetAttribute("id"));
root.SetAttribute("id","AZ Solution");
Page.Response.Write(root.GetAttribute("id"));
//write xml.
XmlTextWriter writer = new
XmlTextWriter(Server.MapPath("application.xml"),System.Text.UTF8Encoding.UTF8);
writer.Formatting= Formatting.Indented;
doc.WriteTo(writer);
writer.Flush();
Console.WriteLine();
writer.Close();
}

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

Báo cáo xây dựng UI trên ASP.NET


Tổng Quan:
Khi chúng ta tạo những Web dùng Web Form page để làm giao diện thì chúng ta
có thể sử dụng những loại Contorls sau và chúng đã được Microsoft cung cấp
trong môi trường VS.NET (C#):
Khi chúng ta tạo mới một web Form cũng giống như tạo mới một Form trong
Visual Basic, nhưng phần mở rộng của nó là (.aspx). Trên web form này cho
chúng ta bố trí một giao diện người cho ứng dụng của chúng ta. Khi chúng ta
double – Click vào web form thì nó đưa ra file có phần mở rộng .aspx.cs cho
chúng ta viết code của trang web form (.aspx).
MốI liên hệ giữa hai tập tin trên là :Tập tin .aspx dùng để tạo giao diện người
dùng, tập tin .aspx.cs dùng để viết code cho giao diện đó.
HTML server controls
Web server controls
Validation controls
Web User controls

Cách sử dụng một control Web server trong C#


Những control loại này thì chúng nằm trên tab Web Forms của ToolBox.
Khi chúng ta tạo giao diện người dùng, sử dụng những control loại này
thì chúng được lập trình trên trang server để thực hiện các chức năng
của ứng dụng.
I.Hai cách để đưa một web server control vào trang (Web form
page)
1. Sử dụng môi trường Designer của C#
Trong cách tạo này thì chúng ta đến tab Web Form và Click một
control sau đó vẽ nó vào trang (web form) và đặt thuộc tính , lập
trình các sự kiện cho nó. ở trên server thì các controls này chủ yếu là
sự kiện Click và có một số control khác có thêm sự kiện Change( vd:
radiobutton textbox…). Trong cách thứ nhất này sau khi chúng ta vẽ
một control thì trong môi trường Design của C# tự động viết code
cho việc khai báo một control trong cả hai môi trường C# và
ASP.NET và được đặt tên mặt định trong file có phần mở rộng
.aspx.cs (C#) cho nên chúng ta phải đặt tên lại theo cách của mình và
nó cũng tự động viết tag trong cú pháp ASP.NET cho các control
trong phần view HTML (góc trái bên dướI của màn hình).Trong
cách này thì chúng ta cũng có quyền tự khai báo một control trong
file có phần mở rộng .aspx.cs hay trong file aspx (View HTML) và
đặc thuộc tính lập trình cho nó, nghĩa là không cần kéo thả từ
ToolBox.
2. Tạo một control theo cú pháp của ASP.NET
Trong cách này thì chúng ta tự viết code theo cú pháp của
ASP.NET qui định trong phần view HTML như sau :
Một web server control được khai báo với tag XMl theo một tiếp đầu
ngữ (hay còn gọI là không gian tên) asp
Một control server thì phải có thuộc tính runat=”server”
Và đặt thuộc tính ID cho control đó.
Một control có tag đóng hoặc nó tự đóng
Ví dụ :
Một textbox server control có thẻ đóng
<asp:textbox id=TextBox1 runat="Server"
Text="">
</asp:textbox>
Một textbox server control tự đóng.
<asp:Textbox id=Textbox1 runat="Server"
Text="" />
control Web DropDownList ,chứa các con như
comboBox
<asp:DropDownList id=DropDown1
runat="server">
<asp:ListItem
Value="0">0</asp:ListItem>
<asp:ListItem
Value="1">1</asp:ListItem>
<asp:ListItem
Value="2">2</asp:ListItem>
<asp:ListItem
Value="3">3</asp:ListItem>
</asp:DropDownList>

3. Có bao nhiêu Web server controls ?


Có 30 web controls server mặt định có sẳn từ ToolBox
trừ những control mà chúng ta có thể thêm vào ToolBox như :
ScrollBar,ToolBar….(là những control không mặc định) Và những
control do chúng ta tự tạo ra (còn gọi là Web custom control) cũng
được thêm vào trong ToolBox.
Trong số đó có những control rất quen thuộc với các bạn như :
Textbox, button, label,radio…..mà các bạn đã từng biết chức năng
của chúng trong các ngôn ngữ khác như VB, ngoài ra đối với Web thì
chúng có các chức năng khác.
Và có những control khác (mới lạ) như :
Calendar, XML, CrystalReportViewer, RequiredFieldValidator,
literal, CompareValidator, AdRotator, PlaceHolder, panel,
CustomValidator

II. Sau đây là chúng ta khảo sát chi tiết về một web server
control cùng các thuộc tính và các sự kiện của nó.

Label
Tạo trong môi trường Designer thì click control và vẽ lên Form và nó tự
viết code theo mặt định ở trong hai môi trường C# và ASP.NET như đã
nói ở trên. Chúng ta nên sửa tên những control theo ý logic của ngườI
lập trình cho dễ nhớ và dễ lập trình.

Cú pháp:
+ Trong C# :
Protected System.Web.WebControls.Label Label1;

+ Trong ASP.NET :
<asp:Label id="Label1" style="Z-INDEX: 122; LEFT: 32px;
POSITION: absolute; TOP: 443px" runat="server"
Width="132px" Height="34px">
</asp:Label>
Chức năng :
Nó dùng để chứa dữ liệu và được lập trình thông qua các control
khác trên server bằng C# để thực hiện một chức năng nào đó hay
chứa một dữ liệu khác.
Các thuộc tính :
+ DataBindings :
+ ID: thuộc tính này là duy nhất cho mỗI control trên trang để
nhận biết chúng khi lập trình.
+ Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím
để khi ứng dụng chạy ta nhấn Alt + phím đó thì chúng ta sẽ được
con trỏ focus đến control đó.
+ BackColor : Giá trị của thuộc tính này là nhận màu nền cho một
control.
+ BorderColor : thuộc tính này màu đường viền xung quanh một
control.
+ BorderStyle : thuộc tính này nhận một kiểu đường viền xung
quanh một control chúng ta chỉ chọn một kiểu trong danh sách
các kiểu đã cung cấp sẳn.
+ BorderWidth: thuộc tính này nhận một giá trị nguyên chỉ chiều
rộng đường viền của một control.
+ CssClass:thuộc tính này chỉ sự định dạng kiểu của một control
thông qua một file .CSS file này do chúng ta định nghĩa.
+ Enabled : thuộc tính này nhận hai giái trị True hay False
- nếu là True : thì nhận focus và dữ liệu được sửa trên control
đó.
- Nếu là False : thì ngược lại.
+ EnableViewState: thuộc tính này nhận một trong hai giá trị True
hay False : Mình chưa thấy rõ sự khác nhau này
+ Font :có các thuộc tính con sau:
- Name: chỉ tên font và có kiểu kèm theo
- Bold: Nhận hai giá trị True: thì chữ in đậm,false :chữ bình
thường.
- Italic: nhận True:chữ in nghiêng, nhận False :chữ bình
thường.
- Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính
Name và tự động khi chúng ta chọn thuộc tính Name.
- Overline: nhận giá trị True: thì có một đường thẳng nằm
ngang phía trên text sát biên của control. Nếu nhận
False thì không có đường này.
- Size: thuộc tính này nhận kích thước của font có sẳn cho
chúng ta chọn.
- Strikeout: Nhận giá trị True: thì vẽ một đường thẳng nằm
ngang nằm giữa text của control. Nếu nhận False thì
không có đường này.
- Underline: Nếu nhận giá trị True thì có một đường thẳng gạch
dướI text của control. Nếu nhận là False thì không.
- ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn.
+ Height: Nhận giá trị là số nguyên cho biết chiều cao của control.
+ TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi
chúng ta nhấn phím Tab thì control đó nó sẽ nhận là focus theo số chúng
ta đã đặc.
+ Text : Nhận giá trị text do chúng ta gõ vào ban đầu.
+ ToolTip : nhận một dòng chú thích do chúng ta gõ vào và khi chương
trình chạy mà chúng ta rê chuột lên control thì câu chú thích này sẽ hiện
ra.
+ Visible: nhận giá trị True thì control này không hiển thị lên form. nếu
nhận giá trị False thì hiển thị lên form.
+ Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của
control.
Các sự kiện :
- DataBinding
- Disposed
- Init
- Load : Lập trình sự kiện này là để đặt giá trị ban đầu cho control
- PreRender
- Unload

2. Textbox
Tạo trong môi trường Designer thì click control vẽ lên Form và nó tự
viết code theo mặt định ở trong hai môi trường C# và ASP.NET như đã
nói ở trên. Chúng ta nên sửa tên những control theo ý logic của ngườI
lập trình cho dễ nhớ và dễ lập trình.
Cú pháp:
+ Trong C# :
Protected System.Web.WebControls.TextBox TextBox1;
+ Trong ASP.NET
<asp:TextBox id="Label1" style="Z-INDEX: 122; LEFT: 32px;
POSITION: absolute; TOP: 443px" runat="server"
Width="132px" Height="34px">
</asp:TextBox>

Chức năng:
Dùng để chứa dữ liệu và được lập trình trên sever để thay đổi dữ liệu
của nó thông qua các control khác hay chính nó (thuộc tính
AutoPosBack=true vớI sự kiện Onchange).
Các thuộc tính:
+ Databindings :
+ ID: thuộc tính này là duy nhất cho mỗi control trên trang để nhận
biết chúng khi lập trình.
+ Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím
để khi ứng dụng chạy ta nhấn Alt + phím đó thì chúng ta sẽ được
con trỏ focus đến control đó.
+ AutoPosBack: Thuộc tính này nhận giá trị True thì dữ liệu của
control này ngay lập tức được gởi về server khi có sự thay đổI dữ
liệu của control này. Được gởi về server trước các sự kiện click
hay các thao tác nào khác trên trang. Nếu nhận False thì dữ liệu
không được gởi về ngay lập tức.
+ BackColor : Giá trị của thuộc tính này là nhận màu nền cho một
control.
+ BorderColor : thuộc tính này màu đường viền xung quanh một
control.
+ BorderStyle : thuộc tính này nhận một kiểu đường viền xung
quanh một control chúng ta chỉ chọn một kiểu trong danh sách
các kiểu đã cung cấp sẳn.
+ BorderWidth: thuộc tính này nhận một giá trị nguyên chỉ chiều
rộng đường viền của một control.
+ CssClass:thuộc tính này chỉ sự định dạng kiểu của một control
thông qua một file .CSS file này do chúng ta định nghĩa.
+ Columns: Nhận giá trị nguyên nhưng không thấy có sự thay đổi.
+ Enabled : thuộc tính này nhận hai giái trị True hay False
- nếu là True : thì nhận focus và dữ liệu được sửa
trên control đó.
- Nếu là False : thì ngược lại.
+ EnableViewState: thuộc tính này nhận một trong hai giá trị True hay
False : Mình chưa thấy rõ sự khác nhau này
+ Font :có các thuộc tính con sau:
- Name: chỉ tên font và có kiểu kèm theo
- Bold: Nhận hai giá trị True: thì chữ in đậm,false :chữ bình
thường.
- Italic: nhận True:chữ in nghiêng, nhận False :chữ bình
thường.
- Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính
Name và tự động khi chúng ta chọn thuộc tính Name.
- Overline: nhận giá trị True: thì có một đường thẳng nằm
ngang phía trên text sát biên của control. Nếu nhận
False thì không có đường này.
- Size: thuộc tính này nhận kích thước của font có sẳn cho
chúng ta chọn.
- Strikeout: Nhận giá trị True: thì vẽ một đường thẳng nằm
ngang nằm giữa text của control. Nếu nhận False thì
không có đường này.
- Underline: Nếu nhận giá trị True thì có một đường thẳng gạch
dướI text của control. Nếu nhận là False thì không.
- ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn.
+ Height: Nhận giá trị là số nguyên cho biết chiều cao của control.
+ MaxLength: thuộc tính nhận giá trị nguyên chỉ chiều dài củaTextBox, số
ký tự có thể chứa.
+ ReadOnly: Thuộc tính này nhận giá trị True thì giá trị text của TextBox
chỉ đọc không thể hiệu chỉnh nghĩa là không focus được.
+ Rows: chỉ số dòng của TextBox
+ TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi
chúng ta nhấn phím Tab thì control đó nó sẽ nhận là focus theo số chúng
ta đã đặc.
+ Text : Nhận giá trị text do chúng ta gõ vào ban đầu.
+ TextMode: Thuộc tính nhận một trong ba thuộc giá trị có sẳn:
- singleLine: chỉ một dòng text
- MultiLine: nhiều dòng text
- Password: dữ liệu nhập vào hiển thị như dấu ********

+ ToolTip : nhận một dòng chú thích do chúng ta gõ vào và khi chương
trình chạy mà chúng ta rê chuột lên control thì câu chú thích này sẽ hiện
ra.
+ Visible: nhận giá trị True thì control này không hiển thị lên form. nếu
nhận giá trị False thì hiển thị lên form.
+ Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của
control.
+ Wrap : Thuộc tính này nhận một trong hai giá trị
- Nếu là True: Thì text box không có thanh trượt
ngang.
- Nếu False và thuộc tính TextMode là Mutiline
thì Text Box có thanh trược ngang để chúng ta kéo xem dữ
liệu trong TextBox

d)Các sự kiện
+ DataBinding
+ Disposed
+ int
+ Load:Lập trình sự kiện này là để đặt giá trị ban đầu cho control
+ PreRender
+ TextChanged
+ Unload

3. Button
Là một nút lệnh, tạo trong môi trường Designer thì click control này
vẽ lên Form và nó tự viết code theo mặt định trong hai môi trường
C# và ASP.NET như đã nói ở trên. Chúng ta nên sửa tên những
control theo ý logic của ngườI lập trình cho dễ nhớ và dễ lập trình.
Cú pháp:
+ Trong C#:
protected System.Web.UI.WebControls.Button Button1;
+ Trong ASP.NET
<asp:Button id="Button1" style="Z-INDEX: 122; LEFT: 32px;
POSITION: absolute; TOP: 443px" runat="server"
Width="132px" Height="34px">
</asp:Button>
Chức năng:
Là nút lệnh nên chức năng dùng để click đối với ngườI dùng, còn
đối với ngườI lập trình thì lập trình cho nó thực hiện một công việc
gì đó sau khi nó được click.
Các thuộc tính:
+ Databindings :
+ ID: thuộc tính này là duy nhất cho mỗI control trên trang để
nhận biết chúng khi lập trình.
+ Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím
để khi ứng dụng chạy ta nhấn Alt + phím đó thì chúng ta sẽ được
con trỏ focus đến control đó.
+ BackColor : Giá trị của thuộc tính này là nhận màu nền cho một
control.
+ BorderColor : thuộc tính này màu đường viền xung quanh một
control.
+ BorderStyle : thuộc tính này nhận một kiểu đường viền xung
quanh một control chúng ta chỉ chọn một kiểu trong danh sách
các kiểu đã cung cấp sẳn.
+ BorderWidth: thuộc tính này nhận một giá trị nguyên chỉ chiều
rộng đường viền của một control.
+ CausesValidation: thuộc tính này nhận hai giá trị True hay False
+ CommandArgument: Đây là một thuộc tính tùy chọn để gởI tới
sự kiện Command của Button và nó kết hợp vớI thuộc tính
CommandName.
VD: Nếu bạn đặc thuộc tính CommandName là Sort chẳn hạn và
bạn đặc thuộc tính CommandArgument là Ascending thì bạn đã
chỉ ra một lệnh sắp sếp tăng dần.
+ CommandName: cung cấp một tên lệnh.
Nhưng ở đây mình chưa rõ sự phối hợp giữa thuộc tính
CommandArgument và thuộc tính CommandName vớI sự kiện
command
+ CssClass:thuộc tính này chỉ sự định dạng kiểu của một control
thông qua một file .CSS file này do chúng ta định nghĩa.
+ Enabled : thuộc tính này nhận hai giái trị True hay False
- nếu là True : thì nhận focus và dữ liệu được sửa
trên control đó.
- Nếu là False : thì ngược lại.
+ EnableViewState: thuộc tính này nhận một trong hai giá trị True hay
False : Mình chưa thấy rõ sự khác nhau này
+ Font :có các thuộc tính con sau:
- Name: chỉ tên font và có kiểu kèm theo
- Bold: Nhận hai giá trị True: thì chữ in đậm,false :chữ bình
thường.
- Italic: nhận True:chữ in nghiêng, nhận False :chữ bình
thường.
- Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính
Name và tự động khi chúng ta chọn thuộc tính Name.
- Overline: nhận giá trị True: thì có một đường thẳng nằm
ngang phía trên text sát biên của control. Nếu nhận
False thì không có đường này.
- Size: thuộc tính này nhận kích thước của font có sẳn cho
chúng ta chọn.
- Strikeout: Nhận giá trị True: thì vẽ một đường thẳng nằm
ngang nằm giữa text của control. Nếu nhận False thì
không có đường này.
- Underline: Nếu nhận giá trị True thì có một đường thẳng gạch
dướI text của control. Nếu nhận là False thì không.
+ ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn.
+ Height: Nhận giá trị là số nguyên cho biết chiều cao của control.
+ TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi
chúng ta nhấn phím Tab thì control đó nó sẽ nhận là focus theo số chúng
ta đã đặc.
+ Text : Nhận giá trị text do chúng ta gõ vào ban đầu.
+ ToolTip : nhận một dòng chú thích do chúng ta gõ vào và khi chương
trình chạy mà chúng ta rê chuột lên control thì câu chú thích này sẽ hiện
ra.
+ Visible: nhận giá trị True thì control này không hiển thị lên form. nếu
nhận giá trị False thì hiển thị lên form.
+ Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của
control.
d) Các sự kiện
♦ Click :Lập trình để thực hiện chức năng khi ngườI dùng click
♦ Command
♦ DataBinding
♦ Disposed
♦ Int
♦ Load:Lập trình sự kiện này là để đặt giá trị ban đầu cho control
♦ PreRender
♦ Unload
4. LinkButton
Control này giống hoàn toàn như control Button nhưng chỉ khác một
điểm là cách nó thể hiện khi ứng dụng chạy cụ thể là nó giống
như một hyperlink khi chúng ta đưa chuột đến thì con chuột trở
thành hình bàn tay.
Cú pháp:
+ Trong C#:
protected System.Web.UI.WebControls.LinkButton LButton1;
+ Trong ASP.NET
<asp:LinkButton id="LinkButton1" style="Z-INDEX: 122;
LEFT: 32px; POSITION: absolute; TOP: 443px"
runat="server" Width="132px" Height="34px">
</asp:LinkButton>
chức năng
giống như trên.
Các thuộc tính
Giống như trên không khác một thuộc tính nào cả.
Các sự kiện
♦ Click: Lập trình để thực hiện chức năng khi ngườI dùng click
♦ Command
♦ DataBinding
♦ Disposed
♦ Int
♦ Load:Lập trình sự kiện này là để đặt giá trị ban đầu cho control
♦ PreRender
♦ Unload

5. ImageButton
Control này giống hai control trên như chỉ khác một đểm là nó lấy một
ảnh làm nền cho Button chứ không có text và nó cũng không có
thuộc tính Text
Cú pháp:
+ Trong C#:
protected System.Web.UI.WebControls.ImageButton IBttn1;
+ Trong ASP.NET
<asp:ImageButton id="LinkButton1" style="Z-INDEX: 122;
LEFT: 32px; POSITION: absolute; TOP: 443px"
runat="server" Width="132px" Height="34px">
</asp:ImageButton>
chức năng
Giống hai loại trên
Ngoài ra nó còn có chức năng khi chúng ta rê chuột lên thì chuột
đổi thành hình bày tay.
Các thuộc tính
+ Databindings :
+ ID: thuộc tính này là duy nhất cho mỗI control trên trang để
nhận biết chúng khi lập trình.
+ Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím
để khi ứng dụng chạy ta nhấn Alt + phím đó thì chúng ta sẽ được
con trỏ focus đến control đó.
+ BackColor : Giá trị của thuộc tính này là nhận màu nền cho một
control.
+ BorderColor : thuộc tính này màu đường viền xung quanh một
control.
+ BorderStyle : thuộc tính này nhận một kiểu đường viền xung
quanh một control chúng ta chỉ chọn một kiểu trong danh sách
các kiểu đã cung cấp sẳn.
+ BorderWidth: thuộc tính này nhận một giá trị nguyên chỉ chiều
rộng đường viền của một control.
+ CausesValidation: thuộc tính này nhận hai giá trị True hay False
+ CommandArgument: Đây là một thuộc tính tùy chọn để gởI tới
sự kiện Command của Button và nó kết hợp vớI thuộc tính
CommandName.
VD: Nếu bạn đặc thuộc tính CommandName là Sort chẳn hạn và
bạn đặc thuộc tính CommandArgument là Ascending thì bạn đã
chỉ ra một lệnh sắp sếp tăng dần.
+ CommandName: cung cấp một tên lệnh.
Nhưng ở đây mình chưa rõ sự phối hợp giữa thuộc tính
CommandArgument và thuộc tính CommandName vớI sự kiện
command
+ CssClass:thuộc tính này chỉ sự định dạng kiểu của một control
thông qua một file .CSS file này do chúng ta định nghĩa.
+ Enabled : thuộc tính này nhận hai giái trị True hay False
- nếu là True : thì nhận focus và dữ liệu được sửa
trên control đó.
- Nếu là False : thì ngược lại.
+ EnableViewState: thuộc tính này nhận một trong hai giá trị True
hay False : Mình chưa thấy rõ sự khác nhau này
+ ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta
chọn.
+ Height: Nhận giá trị là số nguyên cho biết chiều cao của control.
+ ImageAlign: thuộc tính này thực hiện việc canh ảnh như : left, top,
… có sẳn các thuộc tính chúng ta chỉ chọn một trong các giá trị đã
cho.
+ ImageUrl: thuộc tính này nhận một file ảnh làm nền cho control
này.
+ TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà
khi chúng ta nhấn phím Tab thì control đó nó sẽ nhận là focus theo
số chúng ta đã đặc.
+ ToolTip : nhận một dòng chú thích do chúng ta gõ vào và khi
chương trình chạy mà chúng ta rê chuột lên control thì câu chú
thích này sẽ hiện ra.
+ Visible: nhận giá trị True thì control này không hiển thị lên form.
nếu nhận giá trị False thì hiển thị lên form.
+ Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của
control.
.
Các sự kiện
♦ Click
♦ Command
♦ DataBinding
♦ Disposed
♦ Int
♦ Load:Lập trình sự kiện này là để đặt giá trị ban đầu cho control
♦ PreRender
♦ Unload
6. HyperLink
Control này nó chứa một liên kết đến một trang khác khi chúng ta Click
chuột vào nó.
Cú pháp
+ Trong C#:
protected System.Web.UI.WebControls.HyperLink link1;
+ Trong ASP.NET
<asp:HyperLink id="HyperLink1" style="Z-INDEX: 122; LEFT:
32px; POSITION: absolute; TOP: 443px" runat="server"
Width="132px" Height="34px">
</asp:HyperLink>

chức năng
Dùng để liên kết đến một trang khác, ngoài ra chúng ta còn lập trình
cho nó thông qua các control khác để tùy vào trường hợp nào đó mà
nó link đến một trang thích hợp chứ không phảI cố định chỉ link đến
một trang như Hyperlink trong html.
thuộc tính
+ Databindings :
+ ID: thuộc tính này là duy nhất cho mỗI control trên trang để
nhận biết chúng khi lập trình.
+ Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím
để khi ứng dụng chạy ta nhấn Alt + phím đó thì chúng ta sẽ được
con trỏ focus đến control đó.
+ BackColor : Giá trị của thuộc tính này là nhận màu nền cho một
control.
+ BorderColor : thuộc tính này màu đường viền xung quanh một
control.
+ BorderStyle : thuộc tính này nhận một kiểu đường viền xung
quanh một control chúng ta chỉ chọn một kiểu trong danh sách
các kiểu đã cung cấp sẳn.
+ BorderWidth: thuộc tính này nhận một giá trị nguyên chỉ chiều
rộng đường viền của một control.
+ CssClass:thuộc tính này chỉ sự định dạng kiểu của một control
thông qua một file .CSS file này do chúng ta định nghĩa.
+ Enabled : thuộc tính này nhận hai giái trị True hay False
- nếu là True : thì nhận focus và dữ liệu được sửa
trên control đó.
- Nếu là False : thì ngược lại.
+ EnableViewState: thuộc tính này nhận một trong hai giá trị True hay
False : Mình chưa thấy rõ sự khác nhau này
+ Font :có các thuộc tính con sau:
- Name: chỉ tên font và có kiểu kèm theo
- Bold: Nhận hai giá trị True: thì chữ in đậm,false :chữ bình
thường.
- Italic: nhận True:chữ in nghiêng, nhận False :chữ bình
thường.
- Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính
Name và tự động khi chúng ta chọn thuộc tính Name.
- Overline: nhận giá trị True: thì có một đường thẳng nằm
ngang phía trên text sát biên của control. Nếu nhận
False thì không có đường này.
- Size: thuộc tính này nhận kích thước của font có sẳn cho
chúng ta chọn.
- Strikeout: Nhận giá trị True: thì vẽ một đường thẳng nằm
ngang nằm giữa text của control. Nếu nhận False thì
không có đường này.
- Underline: Nếu nhận giá trị True thì có một đường thẳng gạch
dướI text của control. Nếu nhận là False thì không.
+ ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta
chọn.
+ Height: Nhận giá trị là số nguyên cho biết chiều cao của control.
+ ImageUrl : thuộc tính này chứa ảnh làm nền của control
+ NavigateUrl: thuộc tính này chứa địa chỉ trang mà ngườI sử dụng click
vào thì chúng liên kết tớI trang đó, chúng ta có thể thay đổI địa chỉ này
bằng cách lập trình từ các control khác.
+ TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi
chúng ta nhấn phím Tab thì control đó nó sẽ nhận là focus theo số chúng
ta đã đặc.
+ Target: có sẳn các lưạ chọn cho chúng ta chọn. mình có thử nhưng không
thấy có hiệu ứng gì ? các bạn tìm xem
+ Text : Nhận giá trị text do chúng ta gõ vào ban đầu.
+ ToolTip : nhận một dòng chú thích do chúng ta gõ vào và khi chương
trình chạy mà chúng ta rê chuột lên control thì câu chú thích này sẽ hiện
ra.
+ Visible: nhận giá trị True thì control này không hiển thị lên form. nếu
nhận giá trị False thì hiển thị lên form.
+ Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của
control.
d) Các sự kiện
♦ DataBinding
♦ Disposed
♦ Int
♦ Load:Lập trình sự kiện này là để đặt giá trị ban đầu cho control
♦ PreRender
♦ Unload

7. DropDownList

a) cú pháp
+ Trong C#:
protected System.Web.UI.WebControls.DropDownList dlist1;
+ Trong ASP.NET
<asp:DropDownList id="DropDownList1" style="Z-INDEX:
122; LEFT: 32px; POSITION: absolute; TOP: 443px"
runat="server" Width="132px" Height="34px">
</asp:DropDownList>

b) chức năng
Control này dùng để chứa một tập các lựa chọn sẳn có. Ngoài ra nó còn
có một chức năng tự động giở dữ liệu về server khi chúng ta đặt thuộc
tính AutoPosBack=true. có nghĩa là khi chúng ta chọn một sự lựa chọn
trong danh sách đổ xuống trên giao diện thì của control này nó thực
hiện công việc nào đó nằm trong sự kiện SelectedIndexChanged,(giống
ComboBox trong VB)
c) các thuộc tính
+ DataBindings :
+ ID: thuộc tính này là duy nhất cho mỗI control trên trang để
nhận biết chúng khi lập trình.
+ Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím
để khi ứng dụng chạy ta nhấn Alt + phím đó thì chúng ta sẽ được
con trỏ focus đến control đó.
+ AutoPosBack: Thuộc tính này nhận giá trị True thì dữ liệu của
control này ngay lập tức được giở về server khi có sự thay đổI dữ
liệu của control này. Được giở về server trước các sự kiện click
hay các thao tác nào khác trên trang. Nếu nhận False thì dữ liệu
không được giở về ngay lập tức.

+ BackColor : Giá trị của thuộc tính này là nhận màu nền cho một
control.
+ CssClass:thuộc tính này chỉ sự định dạng kiểu của một control
thông qua một file .CSS file này do chúng ta định nghĩa.
+ DataMember
+ DataSource:
+ DataTextField
+ DataTextFormatString
+ DataValueField
+ Enabled : thuộc tính này nhận hai giái trị True hay False
- nếu là True : thì nhận focus và dữ liệu được sửa trên control
đó.
- Nếu là False : thì ngược lại.
+ EnableViewState: thuộc tính này nhận một trong hai giá trị True
hay False : Mình chưa thấy rõ sự khác nhau này
+ Font :có các thuộc tính con sau:
- Name: chỉ tên font và có kiểu kèm theo
- Bold: Nhận hai giá trị True: thì chữ in đậm,false :chữ bình
thường.
- Italic: nhận True:chữ in nghiêng, nhận False :chữ bình
thường.
- Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính
Name và tự động khi chúng ta chọn thuộc tính Name.
- Overline: nhận giá trị True: thì có một đường thẳng nằm
ngang phía trên text sát biên của control. Nếu nhận
False thì không có đường này.
- Size: thuộc tính này nhận kích thước của font có sẳn cho
chúng ta chọn.
- Strikeout: Nhận giá trị True: thì vẽ một đường thẳng nằm
ngang nằm giữa text của control. Nếu nhận False thì
không có đường này.
- Underline: Nếu nhận giá trị True thì có một đường thẳng gạch
dướI text của control. Nếu nhận là False thì không.
- ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn.
+ Height: Nhận giá trị là số nguyên cho biết chiều cao của control.
+ Items: thuộc tính này chứa các mục cố định cho danh sách đổ xuống.
Thông thường thì chúng ta lập trình nếu những mục này là động (có sự
thay đổi). Trong thuộc tính mỗI Item nó có hai giá trị thứ nhất là Text
và thứ hai là Value.
+ TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi
chúng ta nhấn phím Tab thì control đó nó sẽ nhận là focus theo số chúng
ta đã đặc.
+ Visible: nhận giá trị True thì control này không hiển thị lên form. nếu
nhận giá trị False thì hiển thị lên form.
+ Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của
control.
d) các sự kiện
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control
♦ PreRender
♦ Unload
♦ SelectedIndexChanged :
e) Ví dụ
// Lấy thuộc tính giá trị của thuộc tính Text
this.Textbox1.Text= this.DropDownList1.SelectedItem.Text;
// Lấy thuộc tính giá trị của thuộc tính Value
this.DropDownList1.SelectedItem.Value;
8. ListBox
Control này dùng để chứa một danh dách có nhưng không xuất hiện hết
ra ngoài như DropDownList. Nó giống với control trên nhưng chỉ khác
là dữ liệu không thể hiện hết ra ngoài.
a) Cú pháp
+ Trong C#:
protected System.Web.UI.WebControls.ListBox ListBox1;
+ Trong ASP.NET
<asp:ListBox id="ListBox1" style="Z-INDEX: 122; LEFT:
32px; POSITION: absolute; TOP: 443px" runat="server"
Width="132px" Height="34px"></asp:ListBox>

b) Chức năng
Dùng để chứa dữ liệu và lập trình với các sự kiện của các control
khác hay của chính nó.
c) Các thuộc tính
+ DataBindings :
+ ID: thuộc tính này là duy nhất cho mỗi control trên trang để nhận
biết chúng khi lập trình.
+ Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím
để khi ứng dụng chạy ta nhấn Alt + phím đó thì chúng ta sẽ được
con trỏ focus đến control đó.
+ AutoPosBack: Thuộc tính này nhận giá trị True thì dữ liệu của
control này ngay lập tức được giở về server khi có sự thay đổI dữ
liệu của control này. Được giở về server trước các sự kiện click
hay các thao tác nào khác trên trang. Nếu nhận False thì dữ liệu
không được giở về ngay lập tức.
+ BackColor : Giá trị của thuộc tính này là nhận màu nền cho một
control.
+ CssClass:thuộc tính này chỉ sự định dạng kiểu của một control
thông qua một file .CSS file này do chúng ta định nghĩa.
+ DataMember
+ DataSource:
+ DataTextField
+ DataTextFormatString
+ DataValueField
+ Enabled : thuộc tính này nhận hai giái trị True hay False
- Nếu là True: nhận được focus và hiệu chỉnh dữ liệu được
- Nếu là False: thì ngược lại.
+ EnableViewState: thuộc tính này nhận một trong hai giá trị True
hay False : Mình chưa thấy rõ sự khác nhau này
+ Font :có các thuộc tính con sau:
- Name: chỉ tên font và có kiểu kèm theo
- Bold: Nhận hai giá trị True: thì chữ in đậm,false :chữ bình
thường.
- Italic: nhận True:chữ in nghiêng, nhận False :chữ bình
thường.
- Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính
Name và tự động khi chúng ta chọn thuộc tính Name.
- Overline: nhận giá trị True: thì có một đường thẳng nằm
ngang phía trên text sát biên của control. Nếu nhận
False thì không có đường này.
- Size: thuộc tính này nhận kích thước của font có sẳn cho
chúng ta chọn.
- Strikeout: Nhận giá trị True: thì vẽ một đường thẳng nằm
ngang nằm giữa text của control. Nếu nhận False thì
không có đường này.
- Underline: Nếu nhận giá trị True thì có một đường thẳng gạch
dướI text của control. Nếu nhận là False thì không.
+ ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn.
+ Height: Nhận giá trị là số nguyên cho biết chiều cao của control.
+ Items: thuộc tính này chứa các mục cố định cho danh sách đổ xuống.
Thông thường thì chúng ta lập trình nếu những mục này là động (có sự
thay đổi). Trong thuộc tính mỗI Item nó có hai giá trị thứ nhất là Text
và thứ hai là Value.
+ Rows: Thuộc tính này nhận giá trị nguyên chỉ chỉ số dòng (không thấy có
hiệu lực).
+ SelectionMode: thuộc tính này nhận hai giá trị single hay mutiple(nhưng
khi đổI hai giá trị này cho nhau thì không thấy có gì thay đổi).
+ TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi
chúng ta nhấn phím Tab thì control đó nó sẽ nhận là focus theo số chúng
ta đã đặc.
+ Visible: nhận giá trị True thì control này không hiển thị lên form. nếu
nhận giá trị False thì hiển thị lên form.
+ Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của
control.
d) Các sự kiện
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control
♦ PreRender
♦ Unload
♦ SelectedIndexChanged :
Khi chúng ta lập trình cho sự kiện này, nó chỉ có tác dụng khi
thuộc tính AutoPosBack của control này là Treu

Ví dụ

9. DataGrid
Control này dùng để hiển thị dữ liệu cho ngườI dùng xem có thể là từ
database hay từ một nguồn nào đó.
a) Cú pháp:
+ Trong ASP.NET
<asp:datagrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 34px;
POSITION: absolute; TOP: 68px" runat="server" Height="126px"
Width="368px" AutoGenerateColumns="True">
<Columns>
<asp:EditCommandColumn ButtonType="LinkButton"
UpdateText="Cập nhật" HeaderText="Hiệu chỉnh"
CancelText="Không" EditText="Sửa">
<HeaderStyle Width="100px">

</HeaderStyle>
</asp:EditCommandColumn>
<asp:TemplateColumn>
<ItemTemplate>
<asp:LinkButton runat="server" Text="Xóa" CommandName="Delete"
CausesValidation="false">
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:datagrid>
cú pháp trên là có một số thuộc tính kèm theo

+Trong C# :
protected System.Web.UI.WebControls.DataGrid DataGrid1;

b) Chức năng
Ngoài chức năng hiển thị dữ liệu để xem nó còn cho chúng ta cập
nhật, chọn, xóa một dòng (1 record).
c) Các thuộc tính
+ DataBindings
+ ID : Thuộc tính mang tính duy nhất cho mỗI control trên trang.
+ AccessKey: Phím tắt truy cập đến control có dạng Alt + phím
+ AllowCustomPaging:thuộc tính này nhận giá trị True thì cho chúng
ta một tùy chọn ở cuối control này dưới dạng một HyperLink mà
chúng ta click vào đề duy chuyển đến những record kế tiếp. Nếu
nhận giá trị False thì không có link này.
+ AllowPaging: nhận hai giá trị true hay False.
+ AlternatingItemStyle : Định kiểu cho từng Item có các thuộc tính
con:
- BackColor: chọn màu nền
- BorderColor: chọn màu biên.
- BorderStyle: chọn kiểu biên.
- BorderWidth: độ rộng biên nhận giá trị nguyên.
- CssClass: lớp Css để định kiểu.
- Font :định kiểu chữ cho một Item như đã biết.
- ForeColor: chọn màu chữ.
- Height: Thuộc tính nhận giá trị nguyên chỉ chiều cao của Item
- HorizontalAlign: thuộc tính canh lề các mục dữ liệu theo thanh ngang. Chọn một
trong các thuộc tính (left, right, center, justify).
- VerticalAlign: Thuộc tính canh dọc và cũng chọn một trong các thuộc tính (notSet,
top, middle,bottom)
- Width : nhận giá trị nguyên cho biết độ rộng của của Item
- Wrap : nhận true hay false ( chưa rõ).
+ AutoGenerateColumns: nhận giá trị True thì tự động hiển thị đầy đủ
các cột trong dữ liệu. Nếu nhận False thì không hiển thị mục dữ
liệu nào cả.
+ BackColor : Chọn màu nền cho toàn bộ lướI.
+ BackImageUrl:chọn một ảnh làm nền cho lướI dữ liệu.
+ BorderColor: chọn màu đường viền cho lưới cùng vớI các Item.
+ BorderStyle: chọn kiểu đường viền.
+ BorderWidth: chọn độ rộng đường viền.
+ cellpadding : … nhận giá trị nguyên.
+ CellSpacing: khoản không giữa các ô (Item)
+ Columns: Thuộc tính này cho chúng ta chọn định dạng cho từng cột
+ CssClass: file định kiểu .css (không cần thiết).
+ DataField:
+ DataMember
+ DataSource
+ EditItemIndex: thuộc tính này nó cho phép chúng ta Edit một Item nào
đó tùy thuộc vào chỉ số nó nhận hay Click chuột vào Item nào.
Những Item được đánh số từ 0 trở đi. Nếu =-1 thì không có Item
nào được Edit.
+ EditItemStyle: thuộc tính này nó cho định dạng màu sắc, đường biên,
font chữ, ….. khi chúng ta đang Edit một Item.
+ Enabled: Nhận true thì nó nhận được focus, nếu bẳng False thì nó mất
focus (mờ đi)
+ EnableViewState:nhận true hay False(không thấy sự thay đổI rõ)
+ Font : thuộc tính này là áp dụng vào dữ liệu lúc hiển thị, còn đốI vớI
từng Item thì nó có thuộc tính font riêng cho nó.
+ FooterStyle: thuộc tính này nó chứa các thuộc tính con cho chúng ta
định dạng màu nền, màu chữ, kiểu biên, động rộng biên….
+ HeaderStyle: tương tự như FooterStyle
+ Height: cho biết độ cao của lướI nhận giá trị nguyên
+ HorizontalAlign: thuộc tính canh biên của control đốI vớI form chúng
ta chọn một trong các giá trị có sẳn như (left,center,
right,noset,justify).
+ ItemStyle: thuộc tính này nó một tập các thuộc tính con để xát định về
kiểu của một Item thể hiện trong lướI như : BackColor,
BorderColor, BorderStyle, font,…..
+ PagerStyle: thuộc tính này có một tập các thuộc tính con cho chúng ta
xát định kiểu định dạng trang của control này như :BackColor,
BorderColor, font,……
Ngoài ra nó còn có các thuộc tính mớI như:
- Mode : thuộc tính này nhận giá trị NextPrev hay giá trị numericPages.
♦ Nếu là NextPrev thì ở cuốI lướI có dạng là Prev và Next (trang
trước và trang sau).
♦ Nếu là numericPages thì ở cuốI lướI có dạng là các số thứ tự các
trang.
NextPageText: text mà chúng xuất hiện ở đâu là phụ thuộcvào thuộc tính
(Position) ví dụ như : trước sau
PageButonCount : nhận giá trị nguyên
PrevPageText:text mà chúng xuất hiện ở đâu là phụ thuộc vào thuộc tính
(Position) ví dụ như : trước sau
VerticalAlign: thuộc tính canh dọc có 4 giá trị để chọn (NotSet, Top, Middle,
Bottom)
+ PageSize : Nhận giá trị nguyên cho biết kích thước của lưới.
+ SelectIndex: Cho biết Item nào được chọn nhận giá trị nguyên
+ SelectedItemStyle : Thuộc tính này nó định dạng kiểu một Item được
chọn thông qua các thuộc tính con
+ showFooter: thuộc tính nhận giá trị true thì show footer còn nhận false
thì không.
+ showHeader:nhận true show header, nhận fasle thì không.
d) Các sự kiện
+ CancelCommand:
+ DataBinding
+ DeteleCommand
+ Dispoed
+ EditCommand
+ Int
+ ItemCommand
+ ItemCreated
+ ItemDataBound
+ Load
+ PageIndexChanged
+ PreRender
+ SelectedIndexChanged
+ SortCommand
+ Unload
+ UpdateCommand

Một ví dụ
Xem đề mô
10. DataList( gần giống dataGrid)
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
Xem chi tiết
11. Repeater(gần giống dataGrid)
Cú pháp
Chứa năng
Control này là một control chứa nó cho phép tạo một danh sách tùy thích.
được có sẳn trên trang khi trang đó được load
Để sử dụng control bạn phảI tạo template để định nghĩa cách trình bày nộI
dung cho nó.Template chứa tổ hợp text HTML và những control hợp lệ
trên Web Form page
Nếu chúng ta không định nghĩa template cho control hoặc template không
chứa những phần tử nào hết thì khi ứng dụng chạy control sẽ không hiển
thị.
Control này nó hỗ trợ những Template sau :
Template Description
ItemTemplate Những phần tử là được trả lạI một lần cho mỗI
dòng trong data source. Để hiển thị dữ liệu trong
ItemTemplate, bạn phảI thêm một hay nhiều Web
server or HTML server controls cho template và
nốI control đó đến data source.
AlternatingItemTemplate Giống như ItemTemplate ,nhưng nó hoàn trả lạI
cho mỗI dòng khác trongcontrol Repeater . Bạn có
thể chỉ sự khác nhau cho phần tử
AlternatingItemTemplate bằng cách đặc thuộc
tính style cho nó.
HeaderTemplate and Những phần tử được trả lạI một lần trước và sau khi
FooterTemplate tất cả các dòng dữ liệu được kết nối . Ví dụ , bạn có
một bản HTML được lập lạI bẳng tag <TABLE>,
ở trong HeaderTemplate và đặc tag đóng,
</TABLE> trong FooterTemplate.
SeparatorTemplate chỉ sự phân cách của mỗI dòng
Khi chúng ta làm việc vớI các template của control thì chúng ta phảI sang
HTML view.
Chúng thường sử dụng các DataGrid và DataList để hiễn thị dữ liệu hơn là dùng
Repeater.

Thuộc tính
Các sự kiện
Một ví dụ

12. CheckBox
Cú pháp
Chứa năng
Là một nút chọn.
Thuộc tính
+ Databindings :
+ ID: thuộc tính này là duy nhất cho mỗi control trên trang để nhận
biết chúng khi lập trình.
+ Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím
để khi ứng dụng chạy ta nhấn Alt + phím đó thì chúng ta sẽ được
con trỏ focus đến control đó.
+ AutoPosBack: Thuộc tính này nhận giá trị True thì dữ liệu của
control này ngay lập tức được giở về server khi có sự thay đổI dữ
liệu của control này. Được giở về server trước các sự kiện click
hay các thao tác nào khác trên trang. Nếu nhận False thì dữ liệu
không được giở về ngay lập tức.
+ BackColor : Giá trị của thuộc tính này là nhận màu nền cho một
control.
+ BorderColor : thuộc tính này màu đường viền xung quanh một
control.
+ BorderStyle : thuộc tính này nhận một kiểu đường viền xung
quanh một control chúng ta chỉ chọn một kiểu trong danh sách
các kiểu đã cung cấp sẳn.
+ BorderWidth: thuộc tính này nhận một giá trị nguyên chỉ chiều
rộng đường viền của một control.
+ Checked: Nhận giá trị true thì checkBox được checked, nhận false
thì không.
+ CssClass:thuộc tính này chỉ sự định dạng kiểu của một control
thông qua một file .CSS file này do chúng ta định nghĩa.
+ Enabled : thuộc tính này nhận hai giái trị True hay False
- nếu là True : thì nhận focus và dữ liệu được sửa
trên control đó.
- Nếu là False : thì ngược lại.
+ EnableViewState: thuộc tính này nhận một trong hai giá trị True hay
False : Mình chưa thấy rõ sự khác nhau này
+ Font :có các thuộc tính con sau:
- Name: chỉ tên font và có kiểu kèm theo
- Bold: Nhận hai giá trị True: thì chữ in đậm,false :chữ bình
thường.
- Italic: nhận True:chữ in nghiêng, nhận False :chữ bình
thường.
- Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính
Name và tự động khi chúng ta chọn thuộc tính Name.
- Overline: nhận giá trị True: thì có một đường thẳng nằm
ngang phía trên text sát biên của control. Nếu nhận
False thì không có đường này.
- Size: thuộc tính này nhận kích thước của font có sẳn cho
chúng ta chọn.
- Strikeout: Nhận giá trị True: thì vẽ một đường thẳng nằm
ngang nằm giữa text của control. Nếu nhận False thì
không có đường này.
- Underline: Nếu nhận giá trị True thì có một đường thẳng gạch
dướI text của control. Nếu nhận là False thì không.
+ ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn.
+ Height: Nhận giá trị là số nguyên cho biết chiều cao của control.
+ TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi
chúng ta nhấn phím Tab thì control đó nó sẽ nhận là focus theo số chúng
ta đã đặc.
+ Text : Nhận giá trị text do chúng ta gõ vào ban đầu.
+ TextAlign: nhận giá trị left thì text ở bên trái CheckBox, nhận giá trị right
thì text ở bên phảI CheckBox.
+ ToolTip : nhận một dòng chú thích do chúng ta gõ vào và khi chương
trình chạy mà chúng ta rê chuột lên control thì câu chú thích này sẽ hiện
ra.
+ Visible: nhận giá trị True thì control này không hiển thị lên form. nếu
nhận giá trị False thì hiển thị lên form.
+ Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của
control.

Các sự kiện
♦ CheckedChanged :
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control
♦ PreRender
♦ Unload

Một ví dụ

13. CheckBoxList
Cú pháp
Chứa năng
Nó là một nhóm các checkbox mà chúng ta có thể chọn tất cả hoặc
ít hơn.
Thuộc tính

Các sự kiện
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control
♦ PreRender
♦ SelectedIndexChanged :
♦ Unload

Một ví dụ

14. RadioButtonList
Cú pháp
Chứa năng
Một nhóm các nút RadioButton mà chúng ta chỉ được chọn một.
Thuộc tính
+ DataBindings :
+ ID: thuộc tính này là duy nhất cho mỗI control trên trang để
nhận biết chúng khi lập trình.
+ Accesskey : Giá trị của thuộc tính này là các chữ cái trên bàn phím
để khi ứng dụng chạy ta nhấn Alt + phím đó thì chúng ta sẽ được
con trỏ focus đến control đó.
+ AutoPosBack: Thuộc tính này nhận giá trị True thì dữ liệu của
control này ngay lập tức được giở về server khi có sự thay đổI dữ
liệu của control này. Được giở về server trước các sự kiện click
hay các thao tác nào khác trên trang. Nếu nhận False thì dữ liệu
không được giở về ngay lập tức.

+ BackColor : Giá trị của thuộc tính này là nhận màu nền cho một
control.
+ CssClass:thuộc tính này chỉ sự định dạng kiểu của một control
thông qua một file .CSS file này do chúng ta định nghĩa.
+ CellPadding
+ CellSpacing

+ DataMember
+ DataSource:
+ DataTextField
+ DataTextFormatString
+ DataValueField
+ Enabled : thuộc tính này nhận hai giái trị True hay False
- nếu là True : thì nhận focus và dữ liệu được sửa trên control
đó.
- Nếu là False : thì ngược lại.
+ EnableViewState: thuộc tính này nhận một trong hai giá trị True
hay False : Mình chưa thấy rõ sự khác nhau này
+ Font :có các thuộc tính con sau:
- Name: chỉ tên font và có kiểu kèm theo
- Bold: Nhận hai giá trị True: thì chữ in đậm,false :chữ bình
thường.
- Italic: nhận True:chữ in nghiêng, nhận False :chữ bình
thường.
- Names: chỉ tên font nó phụ thuộc hoàn toàn vào thuộc tính
Name và tự động khi chúng ta chọn thuộc tính Name.
- Overline: nhận giá trị True: thì có một đường thẳng nằm
ngang phía trên text sát biên của control. Nếu nhận
False thì không có đường này.
- Size: thuộc tính này nhận kích thước của font có sẳn cho
chúng ta chọn.
- Strikeout: Nhận giá trị True: thì vẽ một đường thẳng nằm
ngang nằm giữa text của control. Nếu nhận False thì
không có đường này.
- Underline: Nếu nhận giá trị True thì có một đường thẳng gạch
dướI text của control. Nếu nhận là False thì không.
- ForeColor: Nhận giá trị màu chữ của control, có sẳn cho chúng ta chọn.
+ Height: Nhận giá trị là số nguyên cho biết chiều cao của control.
+ Items: thuộc tính này chứa các mục cố định cho danh sách đổ xuống.
Thông thường thì chúng ta lập trình nếu những mục này là động (có sự
thay đổi). Trong thuộc tính mỗI Item nó có hai giá trị thứ nhất là Text
và thứ hai là Value.
+ RepeatColumns: thuộc tính này nhận giá trị nguyên dương tương ứng số
cột tạo thành vớI số lượng các nút Radiobutton.
+ RepeatDirection: thuộc tính mang một trong hai giá trị sau: Nếu là
Hirozotal thì các RadioButton được xếp thành hàng ngang. Nếu mang
giá trị Vertical thì xếp hàng dọc.
+ RepeatLayout: thuộc tính này nhận giá trị là Table thì nó trình bày các
radiobutton dạng bảng và một một dạng khác khi nó nhận giá trị flow
+ TabIndex: Nhận giá trị là số nguyên : ý nghĩa là theo số thứ tự mà khi
chúng ta nhấn phím Tab thì control đó nó sẽ nhận là focus theo số chúng
ta đã đặc.
+ Visible: nhận giá trị True thì control này không hiển thị lên form. nếu
nhận giá trị False thì hiển thị lên form.
+ Width : thuộc tính này nhận một giá trị nguyên chỉ chiều rộng của
control.
Các sự kiện
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control
♦ PreRender
♦ SelectedIndexChanged :
♦ Unload

Một ví dụ

15. RadioButton
Cú pháp
Chứa năng
Control này giống tương tự như trên thay vì nhiều nút radioButton
thì nó chỉ một nút thôi.
Thuộc tính
giống như checkBox
Các sự kiện
♦ CheckedChanged :
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control
♦ PreRender
♦ Unload

Một ví dụ

16. Image
Cú pháp
Chứa năng
Control này chứa ảnh, và ảnh này có thể được thay đổi khi chúng ta
lập trình cho những control khác thay đổI nó.
Control này nó chỉ chứa một ảnh nên nó thường dùng trong các mục
đích giớI thiệu sản phẩm và chúng ta có thể lập trình cho một nút
Button nào đó để thay đổI ảnh của control này.
Control này không có các sự kiện Click. Nếu muốn sử dụng ảnh có
sự kiện click thì chúng ta dùng control ImageButton

Thuộc tính
+ ImageUrl: thuộc tính này chỉ đến file ảnh.
Còn các thuộc tính khác của control này thì các bạn đã biết.

Các sự kiện
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control
♦ PreRender
♦ Unload

Một ví dụ
Xem Đề mô
17. Panel
Cú pháp
Chứa năng
Control này dùng để chứa các control khác và nó tự động co giản
kích thước.
Thuộc tính
+ BackImageUrl: thuộc tính này chỉ đường đẫn đến file ảnh.
+ HorizontalAlign: thuộc tính này cho bạn canh các control nằm bên
trong control này.
Các thuộc tính còn lạI các bạn đã quen thuộc.
Chúng ta cũng có thêm các control khác khi run time vào control
này.
Xem đề mô
Các sự kiện
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control
♦ PreRender
♦ Unload

Một ví dụ

18. PlaceHolder
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

19. Canlender
Cú pháp
Chứa năng
Control này nó cho chúng ta chọn một ngày tháng năm.
Thuộc tính
+ DayHeaderStyle: thuộc tính này cho chúng ta định dạng kiểu
header của ngày (xem đề mô vùng màu tím ). gồm có các thuộc
tính con như màu nền, màu biên, font chữ…
+ DayStyle: cho chúng ta định dạng kiểu ngày :gồm có các thuộc
tính con để định dạng giống như trên mà các bạn đã biết.
+ NextPrevStyle: giống như trên nó thể hiện ở hai mũi tên trên
control.
+ NextMonthText: chứa đường dẫn đến một ảnh, hình mũi tên bên
phải.
+ PrevMonthText: chứa đường dẫn đến một ảnh, hình mũi tên bên
trái.
+ SelectMonthText: chứa đường dẫn đến một ảnh, hình mũi tên bên
chọn tháng.
+ SelectWeekText: chứa đường dẫn đến một ảnh, hình mũi tên bên
chọn tuần.
+ todayDayStyle: chọn kiểu ngày hiện tạI gồm có các thuộc tính con
bạn đã biết.
+ WeekendDayStyle: thuộc tính này nó cho chúng ta định dạng lại
ngày cuối tuần (thứ 7 và chủ nhật) trong các thuộc tính con của
nó. Như màu sắc, font chữ, biên….Các bạn đã biết và quen thuộc
với các thuộc tính con này.
Các sự kiện
♦ DataBinding
♦ DayRender
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control.
♦ PreRender
♦ SelectionChanged
♦ Unload
♦ VisibleMonthChanged

Một ví dụ
chọn ngày tháng năm đưa vào TextBox1
this.TextBox1.Text=this.Calendar1.SelectedDate.ToSho
rtDateString();
Có rất nhiều kiểu định dạng ngày ví dụ như ngày
tháng giờ phút giây…
xem đề mô
20. AdRotator
Cú pháp
Khai báo giống như các control khác.
Chứa năng
Nó dùng để quản cáo các sản phẩm. Nó chứa rất nhiều hình ảnh để
quản cáo, mỗi khi người dùng đăng nhập vào trang này thì nó sẽ
chọn ngẫu nhiên một hình để quảng cáo.
Các thuộc tính
+ AdvertisementFile: Đường dẫn tương đốI đến file .xml. chứa cấu
trúc các hình ảnh quản cáo và các liên kết khi chúng ta Click vào
hình quản cáo đó
+ Còn các thuộc tính khác thì các bạn đã biết.
Các sự kiện
♦ AdCreated
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control
♦ PreRender
♦ Unload

Một ví dụ
Một Ví dụ định nghĩa file XML

MỗI lần mà trang được load vào trình duỵêt (Brower) một quảng cáo được
chọn ngẫu nhiên từ một danh sách đã được định nghĩa trước.
Một lập lịch luân phiên cho những quảng cáo được định nghĩa trong file
XML .
Trong file xml này chứa năm thuộc tính của một hình quản cáo :
<ImageUrl> :chứa hình ảnh quản cáo
<NavigateUrl>: chứa link đến một trang nào đó.
<AlternateText>Alt Text</AlternateText>
<Keyword>Computers</Keyword>
<Impressions>80</Impressions>
Sau đây là một ví dụ:
<Advertisements>
<Ad>
<ImageUrl>/UICSharp/images/banner1.gif</ImageUrl>
<NavigateUrl>http://www.microsoft.com</NavigateUrl>
<AlternateText>Alt Text</AlternateText>
<Keyword>Computers</Keyword>
<Impressions>80</Impressions>
</Ad>
<Ad>
<ImageUrl>/UICSharp/images/banner2.gif</ImageUrl>
<NavigateUrl>http://www.microsoft.com</NavigateUrl>
<AlternateText>Alt Text</AlternateText>
<Keyword>Computers</Keyword>
<Impressions>80</Impressions>
</Ad>
<Ad>
<ImageUrl>/UICSharp/images/banner3.gif</ImageUrl>
<NavigateUrl>http://www.microsoft.com</NavigateUrl>
<AlternateText>Alt Text</AlternateText>
<Keyword>Computers</Keyword>
<Impressions>80</Impressions>
</Ad>
</Advertisements>
Trong file XML này chúng ta phảI chú ý nút góc phảI là <Advertisements>
và các mục quảng cáo phảI là <Ad> </Ad> giống như ví dụ trên
xem đề mô
21. Table
Cú pháp
Chứa năng
Control này nó cho chúng ta tạo một bảng.
Nếu chúng ta muốn tạo một bảng động thì các đốI tượng TableRow,
TableCell để tạo các bảng động.
Thuộc tính
Các bạn đã biết
Các sự kiện
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control.
♦ PreRender
♦ Unload

Một ví dụ
Sau đây là một ví dụ tạo bảng động :
//chọn số cột động từ DropDownList1
int numrows =
int.Parse(this.DropDownList1.SelectedItem.Value);
//chọn số dòng động từ DropDownList2
int numcells =
int.Parse(this.DropDownList2.SelectedItem.Value);
for(int j=0;j<numrows;j++) {
//Tạo dòng mới
TableRow r = new TableRow();
for(int i=0;i<numcells;i++){
// tạo các cột cho từng dòng ở trên
TableCell c = new TableCell();
//tạo một LiteralControl chứa dữ liệu cho một ô
c.Controls.Add(new
LiteralControl("row" +j.ToString()+ ",cell" +
i.ToString()));
//add số cột cho một dòng
r.Cells.Add(c);
}
//add số dòng cho một bảng
this.Table1.Rows.Add(r);
}
}

22. RequiredFieldValidator
Cú pháp
Cú pháp khai báo như các control khác.
Chứa năng
chức năng của control này là nó yêu cầu nhập liệu cho một control
khác. Nếu chúng ta không nhập thì nó thông báo.
Thuộc tính
+ ControlToValidate: Thuộc tính này nó nhận một ID của một
control khác ở trên form. Để nó xát định control có ID này có
được nhập liệu hay không nếu không thì nó thông báo.
+ Display: thuộc tính này nhận một trong ba giá trị : none, static,
dynamic. Để nó thể hiện thông báo động hay tỉnh.
+ EnableClientScript: nhận true thì hiểu các script ở phía client, false
thì không.
(cả hai thuộc tính trên khi thử thì không thấy nó thể hiện như mong
muôn.)
+ ErrorMessage: Nhận dòng thông báo khi dữ liệu không hợp lệ.
+ Initialvalue: giá trị khởi tạo
Còn các thuộc tính khác các bạn đã biết.
Các sự kiện
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control.
♦ PreRender
♦ Unload

Một ví dụ
23. CompareValidator
Cú pháp
Chứa năng
Control này nó có chức năng so sánh dữ liệu từ hai control khác ví
dụ: so sánh ngày khởI hành vớI ngày đến xem thử ngày đến có trước
ngày khởI hành hay không?
Thuộc tính
+ ControlToCompare: thuộc tính này nó chứa ID của một control.
Để nó biết đựơc giá trị của control có ID này và so sánh với dữ
liệu của một control khác trong thuộc tính sau:
+ ControlToValidate: thuộc tính này nó chứa ID của một control mà
dữ liệu của control trong thuộc tính này sẽ được so sánh vớI dữ liệu
của control ở thuộc tính trên.
+ Operator: Toán tử để so sánh có sẳn để chon (hoặc kiểu ngày)
+ Type : Kiểu dữ liệu để so sánh gồm (String, Integer, Date, Double,
Currency)
+ ValueToCompare: Nếu là hằng số thì chúng ta thường để trong
thuộc tính này.
Còn các thuộc tính khác thì bạn đã biết.
Các sự kiện
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control.
♦ PreRender
♦ Unload

Một ví dụ

24. RangeValidator
Cú pháp
Chứa năng
Control này nó kiểm tra giá trị nhập vào của một control khác trên
form trong một phạm vi mà chúng ta qui định trong các thuộc tính ở
phần dưới.
Thuộc tính
+ ControlToValidate: Nhận ID của một control trên form
+ MaximunValue:Nhận giá trị chận trên (lớn nhất) tùy thuộc vào
chúng ta chọn kiểu ở thuộc tính Type
+ MinimunValue: Nhận giá trị chận dưới (nhỏ nhất) tùy thuộc vào
chúng ta chọn kiểu ở thuộc tính Type.
+ Type : Kiểu dữ liệu để so sánh gồm (String, Integer, Date, Double,
Currency).
Còn các thuộc tính khác các bạn đã biết.

Các sự kiện
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control.
♦ PreRender
♦ Unload

Một ví dụ

25. RegularExpressionValidator
Cú pháp
Chứa năng
Biểu thức hợp lệ
Control loại này nó cho phép chúng ta kiểm tra để mà đoán trước những ký
tự tuần tự như : số phúc lợi xã hội (tiền của nhà nước trả cho người thất
nghiệp), hay địa chỉ e_mail, số điện thoại, mã bưu thiếp ….v.v. Nghĩa là
những mô hình này được định nghĩa trước theo một luật nào đó. Control
này có thuộc tính nỗi bậc là :
ValidationExpression : chọn biểu thức cho control này.

Thuộc tính
+ ControlToValidate: chọn một control để kiểm tra việc nhận liệu
cho control này có như đã qui định trong biểu thức hợp lệ trong
thuộc tính sau:
+ ValidationExpression: Thuộc tính này nó cho chúng ta chọn một
biểu thức hợp lệ. VD: \d{6} là yêu cầu chúng ta phải nhập đủ 6 ký tự
số.
Các thuộc tính còn lạI các bạn đã biết.
Các sự kiện
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control.
♦ PreRender
♦ Unload

Một ví dụ
26. CustomValidator
Cú pháp
Chứa năng
Control này nó cho chúng ta lập trình để kiểm tra tính hợp lệ dữ liệu của
một control theo một yêu cầu hay một ràng buộc nào đó, hay một kiểu
dữ liệu được người sử dụng định nghĩa trước đó.
Đối với control này nó cung cấp cho chúng ta một sự kiện được lập
trình trên server đó là : ServerValidate Và chúng ta double_Click vào
mở cửa sổ code để lập trình cho nó.

Thuộc tính
+ ClientValidationFunction: thuộc tính này nó chứa một tên hàm, mà
hàm này được lập trình ở client (bằng javascript).
+ ControlToValidate: Nhận ID của một control trên form để kiểm tra
dữ liệu.
+ Các thuộc tính còn lạI các bạn đã biết.
Các sự kiện
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control.
♦ PreRender
♦ ServerValidate: sự kiện này được lập trình trên server để kiểm tra
tính hợp lệ của dữ liệu.
♦ Unload

Một ví dụ
<script language="javascript">
function ValidateLength(oSrc,args){
if(args.Value.Length > 8) args.IsValid = true;
}
</script>

27. ValidationSummary
Cú pháp
Chứa năng
Chức năng của control này là thực hiện một thông báo động bằng
massegebox hay tĩnh là do chúng ta quy định trong các thuộc tính của
nó. khi chúng ta đặc thuộc tính DisplayMode của control này là
BulletList. Những thông báo này là nó hiển thị cùng một lúc theo thứ tự.
Và thông báo là chỉ đến các trường dữ liệu chưa hợp lệ.
Nội dung của thông báo được lấy từ các control kiểm tra tính hợp lệ.
Thuộc tính
+ DisplayMode: thuộc tính này cung cấp 3 định dạng hiển thị
Messagebox cho chúng ta tùy chọn.:- List ,BulletList,
SingleParagraph (thường thì chúng ta nên chọn BulletList).
+ HeaderText: Dòng tiêu đề cho thông báo của các control.
+ ShowMessageBox : nhận giá trị True thì hiện thông báo động,
nhận là False thì hiện thông báo tĩnh.
+ ShowSummary: Nhận giá trị True là hiện thị control này khi chạy
ứng dụng , False thì không (thường dùng nhất.)
Các thuộc tính còn lạI các bạn đã biết.
Các sự kiện
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control.
♦ PreRender
♦ Unload

Một ví dụ

28. Xml
Cú pháp
Chứa năng
Control này dùng để hiện thị file .xml cho ngườI dùng xem, nhưng
chúng ta không nên dùng chức năng này vì nó chiếm không gian
form của chúng ta. Do đó để làm việc này chúng ta dùng một
hyperlink để đến một trang riêng chứa toàn bộ nộI dung file xml đó.
Còn khi trong chương trình chúng ta có sử dụng nộI dung file xml
thì chúng ta khai báo một đốI tượng xml.
Thuộc tính
+ DocumentSource: đường dẫn đến file xml.
+ TransformSource : đường dẫn đến file xsl.
Chú ý:
- Trong tài liệu xml chỉ số các nút con của nút cha được
đánh số bắt đầu từ 0.
- Nếu chúng ta chỉ ra một chỉ số cho một node nào đó mà
chỉ số đó nằm ngoài phạm vi số lượng node con của một
node thì chương trình sẽ báo lỗi.
- Lấy thuộc tính của node góc
doc.DocumentElement.GetAttribute("tên thuộc
tính").ToString();
- Lấy thuộc tính của một node bất kỳ thì ta chỉ cần đến node
góc rồI lần đến các node con của nó.
VD:doc.DocumentElement["dictionary"]["savePWs"]…
getAttribute(“tên thuộc tính”);
- Hoặc dùng đốI tượng XmlAttributeCollection
- Nếu chúng ta lấy tên thuộc tính ta chỉ cần chấm thuộc tính
Name(.Name)
- Còn muốn lấy giá trị của thuộc tính thì chúng ta chấm
(.FirstChild.Value)

Các sự kiện
♦ DataBinding
♦ Disposed
♦ Int
♦ Load: Lập trình sự kiện này là để đặt giá trị ban đầu cho control.
♦ PreRender
♦ Unload

Một ví dụ
//Khai báo một đốI tượng xml
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
//Load file xml vào đốI tượng doc
doc.Load(Server.MapPath("frmLogin.xml"));
Và dùng các đối tượng XmlNode để chứa từng node
Hay các đối tượng XmlElement
29. Literal
Cú pháp
Chứa năng
19.1.1.1 Giống Label
Thuộc tính
Các sự kiện
Một ví dụ

30. CrystalReportViewer
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

Một điều chú ý :


Đối với một control server chúng ta có thể viết các sự kiện trên server và trên
Client bằng javaScript. Nếu cùng một sự kiện mà được viết trên hai
nơi (Client,server) thì khi thực hiện sự kiện được viết trên client chạy
trước sự kiện trên server.
Một ví dụ viết sự kiện trên Client
Cú pháp tổng quát:
document.ID (tag form).ID( phần tử nào đó trên form).Tên sự kiện=function()
{
//các xử lý của bạn ở đây.
}
Ví dụ 1: sự kiện onClick
document.ClientServer.Button1.onclick=function()
{
alert("Bạn đã click Button" + ClientServer.Button1.value);
}
Ví dụ 2: sự kiện onchange
ClientServer.TextBox1.onchange=function()
{
if (ClientServer.TextBox1.value=="") {
alert("Nhập vào một ngày .!");
if (ClientServer.TextBox1.select)
ClientServer.TextBox1.select(); this.txtEmail.focus(); return
false;
}
}
31. v.v.v

III. Còn những điều mình chưa biết và sự thiếu sót cho phần này
xin các bạn đóng góp và ghi lại ở dưới đây.

19.2 Cách Sử dụng HTML Server Control


Những control loạI này thì chúng nằm trên tab HTML của ToolBox trong C#.
HTML server controls nó giống như một tag html bình thường nhưng khi
chúng ta làm việc vớI nó trên Web Form page thì chúng ta có thể chuyển nó
thành một control server mà chúng ta có thể viết code cho nó trên server
trong C#.
Nếu không thì chúng ta chỉ làm việc vớI nó ở dướI client bằng ngôn ngữ
javascript hay Vbscript
20 Thêm một HTML server control vào Web Form có hai
cách
1. Dùng môi trường Design Veiw của C# và chúng đến Tab HTML
click một control và vẽ nó lên web form page (form). Sau khi chúng
ta vẽ nó lên form thì nó chỉ là một tag html bình thường nhưng chúng
ta muốn viết code cho nó ở trên Server thì chúng ta phảI click chuột
phảI vào nó và chọn Run as Server
2. Sử dụng theo cú pháp ASP.NET giống html, còn nếu muốn nó trở
thành server thì thêm thuộc tính runat=”server” và tag của nó. Đối
với cách này từ môi trường Designer chúng ta xem trong phần View
HTML ở góc dướI bên trái cửa sổ Designer

Ví dụ :
<input id="Name" type=text size=40
runat="server">
<input type=submit id="Enter" value="Enter"
runat="server">
<a id="Anchor1" runat="server" href="more.html">More </a>

Khi nào chúng ta muốn lập trình thì chúng ta chuyển nó thành một
HTML server và viết code cho nó ở trang server trong môi trường C#
hay tạI trang HTML. Nếu tạI trang HTML thì chúng ta dùng cú pháp
sau:
<script language = C# runat = server>

//Viết code của bạn ở đây.

<script>
còn không muốn chuyển nó thành server thì nó chỉ là một phần tử
HTML. Bởi vì khi tag html mà nó trở thành một control server thì nó
chiếm tài nguyên cho việc thực hiện code trên server.
3. Có bao nhiêu control HTML server ?
Có tổng cộng là 18 control HTML mặt định trên Tab HTML của
ToolBox đó là :
Label, Button, Reset Button, Submit Button,
text Field, text Area, File Field, passs world Field,
check box, Radio button, hidden, table, flow
layout panel, Grid layout panel, image, listBox,
dropDown, horozontal Rule.
21 Sau đây là chúng ta đi khảo sát chi tiết những thuộc tính
và các sự kiện cho các control này.
Trong phần này chúng ta chỉ trình bày vắn tắt các bạn tự tìm hiểu bởi vì
chúng là các tag HTML
. Label
Cú pháp
<label id="lable" onMouseOut="tên hàm" ></label>
Chứa năng
Thuộc tính
Các sự kiện
Các sự kiện được lập trình ở client (javaScript)
+ onMouseOut="tên hàm"
+ onMouseOver="tên hàm"
+ onMouseDown="tên hàm"
+ onMouseUp="tên hàm"
+ onMouseMove="tên hàm"

Một ví dụ

. Button
Cú pháp
<input type =”button” id=”button” name =”tên”/>
Chứa năng
Thuộc tính
Các sự kiện
+ onMouseOut="tên hàm"
+ onMouseOver="tên hàm"
+ onMouseDown="tên hàm"
+ onMouseUp="tên hàm"
+ onMouseMove="tên hàm"

Một ví dụ

. Reset Button
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

. Submit Button
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

. TextField
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

. TextArea
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

. File Field
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

. PassWordField
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

. CheckBox
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

10. RadioButton
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

11. Hidden
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

12. Table
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

13. Flow layout Panel


Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

14. Grid layout panel


Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

15. Image
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

16. ListBox
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ
17. DropDown
Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

18. horozontal Rule


Cú pháp
Chứa năng
Thuộc tính
Các sự kiện
Một ví dụ

22 Còn những điều mình chưa biết và sự thiếu sót cho phần
này xin các bạn đóng góp và ghi lại ở dưới đây.

22.1 So sánh giữa hai loạI Web server control và HTML server
control
23 Web server control
Theo mô hình đốI tượng lập trình dễ dàng
+ Khi nào chúng ta sử dụng nó.
Tất nhiên là khi bạn lập trình theo mô hình đối tượng như trong
ngôn ngữ C# và đặt biệt là bạn làm việc trên Web form page thì
thường dùng nhất.
+ Khi chúng ta viết một trang Web form mà chúng ta có thể sử
dụng cả hai HTML3.2 và HTML4.0
Hoặc bạn cần một chức năng đặc biệt như một lịch để chọn ngày
tháng năm thì trong Tab Web form nó cung cấp cho chúng ta một
web server control là: Calendar để cho chúng ta chọn ngày
tháng chính xát tránh được lỗi do gõ ngày tháng không hợp lệ.
+ Và bạn muốn tạo những control mà muốn nó bắt những sự
kiện do bạn lập trình bằng ngôn ngữ C# trên server và thao tác
xuống Database (những control có những sự kiện khác nhau) thì
chúng ta thường dùng các Web server control.

24 HTML server control


Khi chúng ta sử dụng những control này thì chúng ta có thể lập trình
script (bằng ngôn ngữ javascript) cho phía client (brower) và tất cả những
giá trị của nó đều là chuổi nên dẫn đến là mất an toàn và nó không hiểu
được Brower tương thích.

24.1 Các chứa năng chuyển dữ liệu giữ control và server hoặc
giữa control với control (giữ hai control)

Trong Web server control, nếu muốn giởi giá trị của một control lên server ngay
lập tức thì chúng ta đặc giá trị của thuộc tính AutoPostBack=”true”, của control
đó, thì ngay sau khi người dùng thay đổi giá trị của control và nó sẽ được giởi lên
server tức thì.
Nhưng chúng ta cũng có thể trả lời hành động của người dùng bằng các sự kiện
được viết ở client script (bằng ngôn ngữ javascript) .
Chú ý :trong khi đặc thuộc tính AutoPostBack=”true” thì các control trên trang
đó đều phải load lại sau khi gởi dữ liệu của control có thuộc tính
AutoPostBack=”true”, có nghĩa là refresh trang. Trong trường hợp này thì các
control như DropList, ListBox… đều bị lặp lại dữ liệu nên chúng ta phải lập trình
chận lại.

Các cơ chế truyền dữ liệu được nhập thông qua các controls về server
Có 2 cơ chế:
1. Đặt thuộc tính AutoPosBack của control có dữ liệu bằng “true”
2. Và cách thông thường là dùng tag form. Cách này thì giởi đến server một
lần nhiều control mang theo dữ liệu thực hiện bằng bằng cách nhấn một nút
lệnh

I. Đối với một control chúng ta thường có các chức năng sau cho một control.

a) Khởi tạo dữ liệu ban đầu cho control đó.


b) Lấy dữ liệu từ control đó.
c) Chuyển (truyền) dữ liệu từ một control này đến một control khác.
d) Chuyển dữ liệu của control về server.
e) Các sự kiện có thể có cho một control đó.
f) Cơ chế hoạt động cho từng sự kiện.

II. Sau đây là một ví dụ cho một vài control thể hiện 6 tính năng ở trên.
Chúng ta tạo một DropDownList hay một ListBox vào Form Page
1) Khởi tạo dữ liệu ban đầu cho control nào đó.
Chúng ta chọn control DropDownList và mở cửa sổ properties của
control đó (hoặc nhấn F4).
Tiếp theo là chọn thuộc tính Items (collection) và click vào (…)
để đặc các thuộc tính Text và thuộc tính Value cho một Item trong
DropDownlist hay trong ListBox
+Nếu không muốn khởI tạo dữ liệu trong lúc Design thì chúng ta có
thể lập trình cho control đó trong lúc run time và dữ liệu trong các
control này cũng có thể được lấy dướI database lên khi run time.
Trường hợp này thì chúng lập trình cho sự kiện Load(). ĐốI vớI sự
kiện load() này mọI control đều có.

2) Lấy dữ liệu từ control


Đối vớI TextBox hay Label thì chúng ta lấy dữ liệu của nó thông qua
thuộc tính Text
Còn đốI vớI DropDownList hay ListBox thì dữ liệu của nó có hai
loại
- thứ nhất là Text
- thứ hai là Value
chúng ta muốn lấy dữ liệu Text của control DropDownList đưa vào
TextBox1 thì thực hiện lệnh:
this.TextBox1.Text=this.DropDownList1.SelectedItem.ToString();
Hoặc chúng ta lấy dữ liệu Value của một Item nào đó trong số danh
sách các Item theo câu lệnh sau:
this.TextBox2.Text=this.DropDownList1.SelectedItem.Value
.ToString();
3) Truyền dữ liệu từ control này đến control khác
Chúng ta có thể truyền dữ liệu từ control này sang control khác theo
nhiều cách khác nhau.
VD:
Khi chúng ta truyền dữ liệu giữa hai textbox như :Textbox A thay
đổI dữ liệu và text A mất focus thì lập tức text B cũng thay đổI dữ
liệu theo tùy thuộc vào chúng ta lập trình cho sự kiện change của
TextBox A trong form TextBox A phảI đặc thuộc tính
AutoPostBack = ‘true’. Lúc này thì chúng ta phải lưu ý là dữ liệu
được lập lại trong form (refresh trang).
Đó là chúng ta truyền dữ liệu giữa hai TextBox hay giữa những
control khác tùy vào công việc và chức năng cụ thể trong một trang.
Hoặc chúng ta có thể truyền bằng một nút lệnh button.
Còn chúng ta muốn truyền dữ liệu từ một control ở trang
WebFormA.aspx sang một control khác ở trang WebFormB.aspx
Trong trang WebFormA.aspx chúng ta khai báo một biến thuộc tính
để nhận lạI một giá trị từ một control nào đó, theo phương thức get.
Có cú pháp như sau:

Public string thuoctinh {


get {
return TextBox1.Text;
}
}

Trong trang code WebFormB.aspx.cs chúng ta khai báo một biến có


kiểu dữ liệu là trang WebFormA và chúng ta thực hiện việc gán giá
trị của một control nào đó trong WebFormB mang giá trị từ một
control trong trang WebFormA như sau:
public WebFormA sourcepage;
private void Page_Load(object sender,
System.EventArgs
{ if (!IsPostBack){
WebFormA sourcepage = (WebFormA)
Context.Handler;
Label1.Text = sourcepage.thuoctinh;
}
}
từ trang này chuyển sang trang khác thực hiện lệnh.
this.Server.Transfer("compare.aspx");
4) Các sự kiện có thể có cho một control
Muốn biết một control có bao nhiêu sự kiện thì chúng ta chọn
control đó và click chọn cửa sổ thuộc tính Properties
Xem chi tiết ở hình dưới đây:
Control được chọn

Ckick vào đây


để biết các sự
kiện của một
control

Ngoài những control mà có sẵn trên thanh công cụ chúgn ta có thể định nghĩa
những control khác gọI là user control. File mà chúng ta định nghĩa phảI
có phần mở rộng .ascx
Và trong file mà chúng ta định nghĩa các control được sử dụng các tag
HTML và các control được cung cấp sẳn trên Toolbox và ngoại trừ các tag
HTML sau : <HTML>, <BODY>, <FORM>
Để tạo mớI một User Control chúng ta làm như sau :
5) Tạo mớI một Project nếu chưa có.
6) Trên menu Project chúng ta click Add Web User Control
sau đó chúng ta thay đổI tên của (name)nó và Click Open để
mở một design cho control mà mình muốn tạo
7) Thêm text và những điều khiển giao diện, control mà chúng
ta muốn truy cập để lập trình cho nó phảI là Web Form
server control hay HTML server control
8) Sử dụng Web Form Designer để đặt những thuộc tính và tạo
code cho control của bạn
Khi nào thì chúng ta cần sử dụng Web user control ?
Khi chúng ta làm giao diện cho một trang web mà giao diện đó muốn sử
dụng lạI nhiều lần trong tương lai hay muốn nó được tái sử dụng cho
những ứng dụng ở lần khác thì chúng ta thiết kế giao diện đó bằng Web
user control và lập trình cho nó.
Khi chúng ta sử dụng nó chỉ cần rê và thả nó vào trong Web form page
Web Custom control
Web Custom control là biên dịch những component được chạy trên server
nó đóng gói giao diện người dùng. Nó bao gồm tất cả các đặc trưng lúc
thiết kế của ASP.NET.
Có rất nhiều cách mà chúng ta có Web custom control
1) Chúng ta có thể biên dịch thành một control từ hai hay nhiều control
khác được tổ hợp lại với nhau VD: chúng ta có thể biên dịch một Label
và một TextBox thành một control
2) Nếu một control đang tồn tại và nó phù hợp vớI một số yêu cầu của bạn
nhưng nó cũng bị thiếu những yêu cầu đặc trưng khác. Bạn có thể tùy
chỉnh control đó từ nó và bạn có thể viết (đặt) chồng những thuộc tính,
phương thức, sự kiện.
3) Nếu không có sẳn những control phù hợp vớI các yêu cầu của chúng ta
thì chúng ta phảI tạo một control theo ý của mình và phù hợp vớI yêu
cầu. được kế thừa từ những lớp control cơ bản
Sự khác nhau chính giữa Web user control va Web custom control
Có những yêu cầu về các chức năng đặt biệt mà các control hiện có không
thể nào đáp ứng được. Nên chúng ta tạo một web user control hay web
custom control để đóng gói các chức năng mà ứng dụng của chúng ta cần.
Sự khác nhau giữa hai loạI control (Web user control và Web custom
control).
1. Web user control
Tạo được một cách dễ dàng , những chúng ít tiện dụng troang một vài
hoàn cảnh (kịch bản -scenario). Chúng ta phát triển một web user
control rất giống vớI cách mà chúng ta phát triển một Web Form control
pages . Bởi vì một user control được tạo trong một môi trường designer
trực quan. Chúng có thể được viết code trong HTML theo một tuần tự
và được thực hiện trong code C#.
Bởi vì Web user control là được biên dịch động ngay lúc chạy nên
không thể add chúng vào vào thanh ToolBox như Web custom control
và chúng được ẩn vào một nơi nào đó trên form khi được thêm vào
trang . Điều này tạo cho việc sử dụng Web user control vất vả hơn Web
custom control
Web user control giống Web form page về mặt design và lập trình cho
nên chúng ta có thể chuyển một Web form page thành một Web user
control để sử dụng nhiều lần sau này.
Cách chuyển một Web form thành một Web user control
- Chúng ta vào view HTML xóa tất cả các tất <html>,
<body>, <form>
- Thay đổI kiểu chỉ dẫn @ Page thành @ Control
- Thay đổi giá trị của thuộc tính Codebehind thành
Webform1.ascx.cs
- Thay đổi lớp kế thừa
public class WebForm2:System.Web.UI.Page
thành WebForm2:System.Web.UI.UserControl
2. Web custom control
Web custom control là nó biên dịch code việc
sử dụng nó thì dễ dàng và tạo nó thì khó hơn Web
user control .
Khi chúng ta tạo xong một Web custom control
thì chúng ta có thể đưa nó vào ToolBox được hiển
thị trong môi trường thiết kế trực quan được hổ
trợ đầy đủ các thuộc tính thông qua một cửa sổ
thuộc tính.
Chúng ta có thể install một bản copy của Web custom control vào trong
global assembly cache và chia sẽ nó giữa các ứng dụng.
Bảng so sánh hai loại control
Web user control Web custom control
Tạo một cách dể dàng Tạo vất vả hơn
Giới hạn về việc hỗ trợ của người Công cụ hổ trợ thiết kế trực quan
dùng lúc thiết kế cho người sử dụng
PhảI có một bản copy của control là Only a single copy of the control is
yêu cầu trong mỗI ứng dụng required, in the global assembly cache
Không thể thêm vào ToolBox Add vào ToolBox được
Tốt cho việc trình bày tĩnh Tốt cho việc trình bày động

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Cơ chế hoạt động của một UI cơ bản.

Các công cụ web forms trong ASP.NET được định nghĩa thành những
tag. Sau khi chạy server gửi về là các tag HTML bình thường.

Ví dụ: một text box.


Code ở server:

<form id="Form1" method="post" runat="server">


<asp:textbox id="TextBox1" style="Z-INDEX: 101; LEFT: 120px;
POSITION: absolute;
TOP: 88px" runat="server" Width="256px" ForeColor="Transparent">
Text default</asp:textbox>
</form>

Code ở client:

<form id="Form1" method="post" runat="server">


<INPUT style="Z-INDEX: 101; LEFT: 64px; WIDTH: 256px;_POSITION:
absolute;
TOP: 96px" type="text" size="37" value="Việt Nam"
id="TextBox1">
</form>
Sau khi gửi về client, id của <INPUT> cũng là id của <asp:textbox> vì
thế ta có thể sử dụng script để thao tác với các <INPUT> này.

Vậy, tại sao phải sử dụng các tag của ASP.NET:


Từ web form ta có thể truy cập trực tiếp đến các đối tượng này. Từ đó
ta có thể thay đổi các thuộc tính và xử lý sự kiện.
Các thuộc tính và sự kiện, tất cả đều được xử lý trên server.

Ví dụ:
- Xử lý sự kiện phía server.
File: server.aspx
<form id="Form1" method="post" runat="server">
<asp:textbox id="txtText1" style="Z-INDEX: 101; LEFT:
120px; POSITION: absolute;
TOP: 88px" runat="server" Width="256px" ForeColor="Transparent">
Text default</asp:textbox>
<asp:button id="butServer" style="Z-INDEX: 102; LEFT: 320px;
POSITION: absolute;
TOP: 128px" runat="server" Text="Server"></asp:button>
</form>

File: server.aspx.cs
private void butServer_Click(object sender,
System.EventArgs e)
{
if( this.txtText1.Text == "az")
this.txtText1.Text="OK";
else
this.txtText1.Text="Cancel";
}

- Xử lý sự kiện phía client.


File: client.aspx
<form id="Form1" method="post" runat="server">
<INPUT style="Z-INDEX: 103; LEFT: 120px; WIDTH: 256px;_POSITION:
absolute;
TOP: 216px; HEIGHT: 24px" type="text" size="37" value="Text
default"
id="txtClient">
<INPUT id="butClient" style="Z-INDEX: 104; LEFT: 304px; WIDTH:
72px;
POSITION: absolute; TOP: 256px; HEIGHT: 24px" type="button"
value="Client">
</form>

<script>
document.client.butClient.onclick = function()
{
if( this.txtText1.Text == "Teo")
this.txtText1.Text="OK";
else
this.txtText1.Text="Cancel"; }
</script>

Xem ví dụ:
http://azweb05/WebUIDemo/server.aspx

http://azweb05/WebUIDemo/client.aspx

Với những ví dụ trên chúng ta cần chú ý:


Cả 2 ví dụ trên đề thực hiện cùng một chức năng. Nhưng một xử lý ở
sever, một xử lý ở client.
- Khi sử dụng web Form tức xử lý ở sever. Thì khi ấn nút sever, dữ liệu
trên text box được gửi về server, và server sẽ gửi về cho client
(browse) nguyên trang web với nội dung của text box được thay đổi.
Cơ chế thực hiện này giống như submit dữ liệu ở các trang web thông
thường.
- Khi sử dụng các tag HTML và script. Thì dữ liệu được xử lý tất cả ở
client.

Khi ta tạo một text box ở web form (<asp:textbox>) thì ta vẫn có thể
xử lý dữ liệu ở client. Nhưng khi tao một text box bằng HTML(<INPUT
type=”text”>) thì phí server không thể hiểu được text box này.
Ví dụ: sử dụng textbox ở server và xử lý ở client:
<form id="controlServer" method="post" runat="server">
<asp:textbox id="txtText1">Text default</asp:textbox>
<asp:button id="butServer" Text="Server"></asp:button>
</form>

<script>
document.controlServer.butServer.onclick = function()
{
if(document.controlServer.txtText1.value ==
"az")
document.controlServer.txtText1.value =
"OK";
else
document.controlServer.txtText1.value =
"Cancel";
}
</script>
Như đã nói ở trên, một textbox phía server sau khi gửi về client là
một nhãn <INPUT> và có type=”text”, đặc biệt là id không đổi. Vì thế
ta có thể dùng <script> để thao tác với các đối tượng này.
Với ví dụ này, button là button server, vì thế khi gửi về client là một
nút submit. Khi ta click vào nút này thì cũng có nghĩa là submit dữ liệu
(trang web vẫn phải refresh). Để tránh trường hợp này ta có thể sử
dụng button phía client.
Xem ví dụ:
http://localhost/WebUIDemo/controlServer.aspx

&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&

WEB SERVICE
25 WEB SERVICES LÀ GÌ ?
Web Services(XML Web Services) là một ứng dụng có thể truy xuất tới nó
thông qua lập trình với các giao thức Internet chuẩn. Web Service kết hợp
những khía cạnh tốt nhất của quá trình phát triển dựa trên thành phần
(component) và Web. Giống như các component, Web Services trình bày
những chức năng tổng quát có thể tái sử dụng lại mà không cần quan tâm
cách thức cài đặt những dịch vụ này. Tuy nhiên Web Services không giống
như những công nghệ component hiện nay, Web Service không được truy
xuất thông qua những giao thức đặc tả mô hình đối tượng(object-model-
specific protocols). Thay vào đó nó được truy xuất thông qua những giao
thức Web thông dụng và định dạng dữ liệu như HTTP, XML. Hơn nữa Web
Services phải được định nghĩa theo những quy tắc về thông điệp mà chính
nó định nghĩa và tạo ra. Chương trình người dùng truy xuất tới Web Service
có thể được thực hiện trên bất cứ hệ điều hành nào và bằng bất cứ ngôn
ngữ gì mà có thể tạo và sử dụng thông điệp được định nghĩa cho giao tiếp
Web Services.
Một trong những giao thức Web mà đề cập ở trên đó là Simple Object
Access Protocol(SOAP), SOAP định nghĩa một giao thức đơn
giản(lightweight) cho trao đổi dữ liệu. SOAP đưa ra 1 tập các quy luật để sử
dụng XML trình bày dữ liệu(set of rules for how to use XML to represent
data). Ngoài ra SOAP còn định nghĩa một dạng định dạng thông điệp mở
rộng(extensible message format) dùng để thực hiện gọi thủ tục từ
xa(remote procedure calls) sử dụng SOAP message và bindings qua giao
thức HTTP.

26 Kiến trúc tổng quát của Web Service:


Kiến trúc tổng quát của Web Service bao gồm 5 lớp sau:

Service Request

Business Facade

Data Access
Business Logic
Service Response
Listener

Data
Data: dùng để lưu trữ dữ liệu mà Web Service sẽ cung cấp cho các client
qua các phương thức mà dịch vụ cung cấp. Trong một dịch vụ cung cấp các
phương thức lấy dữ liệu từ database của Web Service thì database đóng vai
trò là tầng Data.
Data Access: Cung cấp các chức năng truy cập tới cơ sở dữ liệu cho lớp
Business Logic, đảm bảo sự đồng nhất dữ liệu.
Business Facade: Cung cấp 1 giao diện đơn giản dùng truy xuất các
phương thức của Web Service( các phương thức xây dựng từ lớp Business
Logic).
Business Logic: cung cấp chức năng của Web Service cho lớp bên trên.
Trong lớp này ta sẽ xây dựng các phương thức mà Web Service cung cấp
cho client. Ngoài ra ta còn có thể gọi các hàm từ các ứng dụng Web Service
khác vào trong các phương thức này.
Listener: Đây là một lớp rất quan trọng trong Web Service, quản lý tất cả
những yêu cầu tới Web Service. Listener có nhiệm vụ nhận các thông điệp
gởi đến cho Service, phân tích cú pháp, sau đó đáp ứng các thông điệp trên
bằng phương thức thích hợp trên tầng business facade.
Tài liệu MSDN: ms-
help://MS.VSCC/MS.MSDNVS/dnwebsrv/html/websvcs_platform.htm
27 Cách tạo một ứng dụng Web Service và gọi sử dụng nó
trong VS.NET:
III.5 Cách tạo 1 Web Service:
Vào menu File -> New -> Project, chương trình hiển thị hộp thoại:

Chọn ASP.NET Web Service, nhập tên của Web Service.


VS.NET tự động load và tạo 1 file service1.asmx.
Sau cùng ta cài đặt các phương thức cho Web Service vào trong trang
.asmx. Trang .asmx giống như trang .aspx, chúng chỉ khác nhau ở phần
mở rộng được ánh xạ trong tập tin cấu hình config.web như là file sẽ
thực thi và đáp ứng các yêu cầu về Web Service. Trong trang này ta sẽ
cài đặt các logic nghiệp vụ của đối tượng hay phương thức Web Service
mà ta cần cung cấp cho máy client. Phương thức web là một phương
thức bình thường trong C# mà ta có thêm chỉ dẫn [WebMethod] trước
nó. Phần này ta sẽ đề cập ở phần sau, sau đây là 1 ví dụ đơn giản về
Web Service:
Ví dụ:
// Định nghĩa phương thức cho Web Services
[WebMethod(Description ="Phương thức cộng hai số thực a và b")]
public float Add(float a , float b)
{
return a+b;
}
Các phương thức này được cài đặt bên trong 1 lớp mà kế thừa từ lớp WebService
trong namespace System.Web.Services
Để test Web service này, ta nhấn F5 chương trình sẽ hiển thị kết quả
cung cấp cho ta 1 giao diện đơn giản để gọi hàm như sau:

Từ màn hình giao diện này, ta cung cấp đầy đủ các tham số cho phương
thức, click Invoke -> chương trình trả về kết quả dưới dạng XML.

III.6 Cách gọi sử dụng 1 Web Service từ client:


Một Web Service có thể được gọi sử dụng từ một ứng dụng Web hay 1
ứng Window Form bất kỳ, sau đây là cách gọi 1 Web Service từ 1 ứng
dụng Web, còn cách gọi từ ứng dụng Window Form cũng tương tự như thế.
Menu File -> New -> Project -> chọn ASP.NET Web Application.
Tham chiếu đến Web Service vừa tạo ở trên: Menu Project -> Add Web
Reference... Chương trình hiển thị hộp thoại:
Em cần giảI thích về giao diện này.

Nếu kết nối tới Web Service thành công chương trình sẽ hiển thị các
phương thức mà web service đó cung cấp và ta AddReference vào ứng
dụng của ta.
Add vào Project 1 WebForm để gọi phương thức cung cấp từ Web Service
trên và xây dựng giao diện để gọi ứng dựng bao gồm 2 textbox, 1 label
Result và 1 button. Ta viết code xử lý sự kiện button để gọi phương thức
từ Web Service như sau :
Ví dụ:
// Hàm xử lý sự kiện click button Add
private void Add_ServerClick(object sender, System.EventArgs e)
{
long a =0;
long b =0;
a=long.Parse(txtSo1.Text);
b=long.Parse(txtSo2.Text);
// Khởi tạo 1 Instance của MathService
localhost.MathService m =new localhost.MathService ();
// Gán kết quả cho label
lblResult.Text=m.Add (a,b).ToString();
}
28 Attribute của Web Service:
III.7 WebMethod:
Áp dụng attribute này cho một phương thức làm cho phương thức này trở thành
phương thức của Web Service. Attribute WebMethod này là một class không thể kế
thừa (cannot be inherited) và nó có các thuộc tính sau:
BufferResponse: Quy định thông tin đáp ứng có được lưu trên bộ đệm
(buffer) của Web Service hay không. Mặc định là True, tức thông tin trả
lời cho 1 yêu cầu nào đó không được lưu giữ trên bộ đệm. Nếu mà dữ
liệu gởi về cho client lớn thì ta quy định BufferResponse=false
CachDuration: Số giây mà sẽ thông tin đáp ứng sẽ giữ trong catch của
web server, mặc định là 0, tức thông tin đáp ứng sẽ không giữ trong
catch.
(Cần giảI thích để phân biệt BufferResponse và CachDuration, anh thấy có sự
trùng lập)
Description: Diễn giải cho phương thức.
EnableSession: Cho phép ta lưu trạng thái trong Web Service nếu ta
setting EnableSession=true, mặc định là false.
(Ghi dòng chú thích: xem thêm tài liệu của thanh để biết chi tiết về cách sử
dụng Session)
Ví dụ:
[ WebMethod(Description="Phương thức test session !",
EnableSession=true) ]
public String UpdateHitCounter()
{
//Kiểm tra có tồn tại Session không?
if (Session["Dem"] == null)
{
Session["Dem"] = 1;
}
else
{
//Tăng biến đếm session Dem
Session["Dem"] = ((int) Session["Dem"]) + 1;
}
return "You have accessed this service " +
Session["Dem"].ToString() + " times.";
}

MessageName: Tên mà sử dụng cho phương thức Web Service bên


trong việc truyền và nhận dữ lliệu từ phương thức Web Service, chẳng
hạn như tên sử dụng trong thông điệp SOAP, mặc định là tên phương
thức Web (Cho một ví dụ về chổ này).
TransactionOption: gồm 5 giá trị là Disabled, NotSupported,
Supported, Required, RequiresNew cho phép sử dụng Transaction trong
phương thức Web hay không, mặc định là Disabled. (PhảI gỉai thích từng
giá trị)

III.8 WebService:
Áp dụng attribute này dùng để cài đặt cho một class Web Service các
thông tin về Web Service, bao gồm các thuộc tính:
Name: Tên của XML Web service, mặc định là tên của class cài đặt Web
Service.
Description: Diễn giải cho Web Service.
Namespace: XML namespace sẽ sử dụng trong tài liệu mô tả mà Web
Service trả về cho clients khi gọi 1 phương thức nào đó trong Web
Service.
Ví dụ:
// Khai báo lớp Web Services kế thừa từ
System.Web.Services.WebService
[WebService(Description="Test Web service!",
Namespace="http://MyWebService.com/")]
public class MathService : System.Web.Services.WebService
{
// Khai báo các phương thức web service ở đây.
}
III.9 WebServiceBinding: (Phần này khó hiểu qúa, em viết
lạI cho dễ hiểu)

Áp dụng attribute WebServiceBinding dùng để tạo ra 1 binding cho Web Service.


Một binding mà được định nghĩa bởi ngôn ngữ mô tả Web Service(WSDL), dùng để
định nghĩa một tập các phép xử lý(operation). Mỗi phương thức Web Service là một
phép xử lý trong 1 binding tổng quát. Các phương thức Web Service là con của
binding mặc định cho Web Service, chúng ta cũng có thể tạo ra binding cụ thể cho
các phương thức Web Service ở trên, bao gồm các thuộc tính:
Name: Tên của binding. Mặc định là tên của Web Service cộng với tên
của giao thức truy xuất bao gồm HttpGet, HttpPost, Soap.
Location: Chỉ rõ vị trí nơi mà binding định nghĩa, tức đường dẫn chỉ tới
file mô tả .wsdl. Mặc định là url của web service cộng với “?WSDL”.( tức
file mô tả dịch vụ Web).
Namespace: Namespace cho binding. Mặc định là http://tempuri.org/
Một XML Web Service có thể cài đặt nhiều kết nối (binding) khác nhau. Mỗi kết
nối đó tương ứng với 1 số hàm cụ thể nào đó mà ta cài đặt. Khi clients gọi sử dụng
Web Service, tuỳ thuộc vào binding mà nó sẽ cung cấp các hàm tương ứng.
Ví dụ:
// Khai báo lớp Web Services kế thừa từ System.Web.Services.WebService
[WebService(Description="Test Web service!",
Namespace="http://MyWebService.com/")]
[WebServiceBinding(Name="LocalBinding")]
[WebServiceBinding(Name="MyBinding",
Namespace="http://MyBinding/")]
public class MathService : System.Web.Services.WebService
{
// Cài đặt phương thức này cho binding LocalBinding
[SoapDocumentMethod(Binding="LocalBinding")]
[ WebMethod(Description="Phương thức cho0u98 ?inding
LocalBinding!")]
public String Binding()
{
return "Thành viên của binding định nghĩa bởi Web Service";
}
// Cài đặt phương thức này cho binding MyBinding
[SoapRpcMethod(Binding="MyBinding")]
[ WebMethod(Description="Phương thức cho@u98 ?inding
MyBinding!")]
public String Binding1()
{
return "Thành viên của binding định nghĩa bởi Web Service";
}
}
III.10 SoapDocumentMethod:
Ngôn ngữ mô tả dịch vụ web(WSDL) định nghĩa 2 kiểu mà 1 phương thức web gọi 1
phép toán và định dạng trong Soap message là RPC and Document. Document định
dạng các phương thức web service thông qua 1 XSD schema. còn RPC (Có phảI là
Remote Procedure Call) định dạng các phép xử lý thông qua đặc tả SOAP (SOAP
specification) sử dụng cho RPC.
Áp dụng attribute này cho 1 phương thức Web Service hay 1 lớp proxy cụ thể mà
định dạng SOAP message là Document. Bao gồm các thuộc tính:
Action: thuộc tính SOAPAction HTTP header của SOAP request. Mặc
định là http://tempuri.org/MethodName trong đó MethodName là tên của
phương thức Web Service.
Binding: binding của 1 phương thức dịch vụ web cài đặt cho 1 phép xử
lý.
OneWay: Thuộc tính xác định 1 Web Service có đợi Web Server xử lý
hoàn thành 1 phương thức web hay không? Có 2 giá trị là true và false.
Mặc định là false.
ParameterStyle: Xác định những tham số kết nối bên trong một phần
tử đơn trong phần tử Body của SOAP message. Mặc định là Wrapped(có
3 parameter là Bare, Default và Wrapped). Trong đó:
Bare: Tham số trong 1 phương thức web service được đặt trong các phần tử XML
trực tiếp theo sau element Body của Soap request hay Soap response.
Ví dụ: Sau đây là ví dụ cho 1 phương thức web có ParameterStyle của
SoapDocumentMethod là Bare
[SoapDocumentMethod(Binding="LocalBinding",
ParameterStyle=SoapParameterStyle.Bare)]
[ WebMethod(Description="Phương thức binding LocalBinding!")]
public String Binding(string Ho, string Ten)
{
return "Họ tên của bạn: " + Ho.ToString() + " " +
Ten.ToString();
}
Có Soap request như sau:
POST /TestWebServices/MathService.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://MyWebService.com/Binding"

<?xml version="1.0" encoding="utf-8"?>


<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Ho xmlns="http://LocalBinding/">string</Ho>
<Ten xmlns="http://LocalBinding/">string</Ten>
</soap:Body>
</soap:Envelope>
Default: Tham số này sử dụng SoapParameterStyle mặc định cho Web Service.
Giá trị mặc định được xét khi ta áp đặt 1 attribute SoapDocumentService lên
class mà cài đặt Web Service. Nếu không cài đặt mặc định là Wrapped.
Ví dụ: Tương tự như ví dụ trên nhưng ta thay tham số
ParameterStyle là Default, ta có Soap request như sau:
POST /TestWebServices/MathService.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://MyWebService.com/Binding"

<?xml version="1.0" encoding="utf-8"?>


<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Binding xmlns="http://LocalBinding/">
<Ho>string</Ho>
<Ten>string</Ten>
</Binding>
</soap:Body>
</soap:Envelope>
Wrapped: Tham số trong 1 phương thức web service được kết(encapsulated) bên
trong 1 phần tử XML đơn theo sau element Body của Soap request hay Soap
response. Ví dụ trên sử dụng ParameterStyle là Wrapped, các tham số nằm
bên trong element <Binding>.
RequestElementName: thuộc tính XML Element liên hệ với SOAP
Request cho 1 phương thức web mà được định nghĩa trong file mô tả
.wsdl như là 1 xử lý(operation).Mặc định là tên của phương thức Web.
RequestNamespace: thuộc tính namespace liên hệ với SOAP Request
cho 1 phương thức web. Mặc định là namespace của web service này.
ResponseElementName: thuộc tính XML Element liên hệ với SOAP
Response cho 1 phương thức web mà được định nghĩa trong file mô tả
.wsdl như là 1 xử lý(operation). Mặc định là tên của phương thức web
cộng với Response.
ResponseNamespace: thuộc tính namespace liên hệ với SOAP Request
cho 1 phương thức web. Mặc định là namespace của web sevice này.
Use: định dạng tham số cho 1 phương thức web bên trong SOAP
message. Có 2 giá trị là Encoded và Literal. Mặc định là Literal.
Encoded: WSDL định nghĩa 2 cách thức cho định dạng parameters.
Encoded định dạng parameters sử dụng SOAP encoding .
Ví dụ: Sau đây là 1 Soap response sử dụng định dạng tham số kiểu Encoded.
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>


<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://LocalBinding/"
xmlns:types="http://LocalBinding/encodedTypes"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<q2:MyResponseName xsi:type="q2:MyResponseName"
xmlns:q2="http://MyResponseNamespace/">
<BindingResult xsi:type="xsd:string">string</BindingResult>
</q2:MyResponseName>
</soap:Body>
</soap:Envelope>

Literal: định dạng tham số sử dụng một sơ đồ định nghĩa (a pre-defined XSD
schema) cho mỗi tham số.
III.11 SoapDocumentService: Đây là một attribute dùng để áp
đặt cho 1 XML Web Service nhằm mục đích định dạng mặc định
cho Soap request và Soap response của các phương thức web.
Bao gồm các thuộc tính:w
ParameterStyle: Quy định cách 1 parameter được định dạng trong
SOAP message. Có 3 giá trị là Bare, Default and Wrapped. Mặc định là
Wrapped.
RoutingStyle: Quy định cách mà SOAP message gởi đến(routed to) 1
XML Web Service. Có 2 giá trị được xét là: RequestElement và
SoapAction. Mặc định là SoapAction.
RequestElement: Soap message gởi dựa trên phần tử đầu tiên theo sau <Body>.
SoapAction: Soap message gởi dựa trên SOAPAction HTTP Header.
Use: Xét giá trị mặc định cho định dạng tham số(parameter) cho 1 XML
Web Service. Có 2 giá trị là Encoded và Literal. Mặc định là Literal.
III.12 SoapRpcMethod:
Áp dụng attribute này cho 1 phương thức Web Service hay 1 lớp proxy cụ thể mà
định dạng SOAP message là RPC. Bao gồm các thuộc tính:
Action: thuộc tính SOAPAction HTTP header của SOAP request. Mặc
định là http://tempuri.org/MethodName trong đó MethodName là tên của
phương thức Web Service.
Binding: binding của 1 phương thức dịch vụ web cài đặt cho 1 phép xử
lý.
OneWay: Thuộc tính xác định 1 Web Service có đợi Web Server xử lý
hoàn thành 1 phương thức web hay không? Có 2 giá trị là true và false.
Mặc định là false.
RequestElementName: thuộc tính XML Element liên hệ với SOAP
Request cho 1 phương thức web mà được định nghĩa trong file mô tả
.wsdl như là 1 xử lý(operation).Mặc định là tên của phương thức Web.
RequestNamespace: thuộc tính namespace liên hệ với SOAP Request
cho 1 phương thức web.
ResponseElementName: thuộc tính XML Element liên hệ với SOAP
Response cho 1 phương thức web mà được định nghĩa trong file mô tả
.wsdl như là 1 xử lý(operation). Mặc định là tên của phương thức web
cộng với Response.
ResponseNamespace: thuộc tính namespace liên hệ với SOAP Request
cho 1 phương thức web.

III.13 SoapRpcService: Cho phép chúng ta thiết lập những giá trị
mặc định kiểu encoding cho các phương thức web của XML Web
Service. Chú ý rằng một XML Web Service không thể cài đặt cả 2
attribute SoapDocumentService và SoapRpcService. Bao
gồm các thuộc tính:
RoutingStyle: Quy định cách mà SOAP message gởi đến(routed to) 1
XML Web Service. Có 2 giá trị được xét là: RequestElement và
SoapAction. Mặc định là SoapAction.
RequestElement: Soap message gởi dựa trên phần tử đầu tiên theo sau <Body>.
SoapAction: Soap message gởi dựa trên SOAPAction HTTP Header.
III.14 SoapHeader: Áp dụng attribute này cho 1 phương thức Web
Service hay 1 lớp proxy mà nó có thể xử lý 1 SoapHeader cụ thể.
Sau đây là những bước nhận và xử lý 1 Soap Header:
1. Tạo 1 class kế thừa từ class SoapHeader mô tả dữ liệu mà ta đưa vào Soap
Header để xử lý.
2. Thêm vào 1 member của class vừa cài đặt vào class mà ta cài đặt Web Service
hay vào class proxy tham chiếu .
3. Áp attribute SoapHeader vào phương thức Web Service hay phương thức
tương ứng trong proxy class mà ta cần xử lý Soap Header.
4. Bên trong phương thức Web Service hay class proxy ta sẽ xử lý việc gửi dữ
liệu kèm theo Soap Header.
Ví dụ:
//Khai báo 1 class kế thừa SoapHeader
public class MyHeader:SoapHeader
{
public string MyValue;
}
//class cài đặt phương thức web
public class Service1 : System.Web.Services.WebService
{
//Khai báo 1 member của Soap Header để nhận nội dung của
MySoapHeader
public MyHeader sHeader;
.....
[WebMethod(Description ="A Web Service requires a client send a
SoapHeader")]
[SoapHeader("sHeader", Direction=SoapHeaderDirection.InOut,
Required=true)]
public string Hello()
{
if (sHeader.MyValue=="MyHeader")
{
return "My Soap Header:" +
sHeader.MyValue.ToString() ;
}
return "Soap Header not allow!";
}
}
Các thuộc tính của attribute SoapHeader:
Direction: Xác định nơi mà Soap Header được gởi đến: Web service,
Web service client hay cả hai, tức là hướng gởi Soap Header đến. Có 3
giá trị là In,Out và InOut. Mặc định là In tức là chỉ gởi đến cho Web
Service.
MemberName: member của 1 lớp Web Service mà mô tả nội dung của
Soap Header. Thực chất là 1 khai báo của Soap Header trong class web
service.
Required: Xác định 1 Soap Header có bắt buộc yêu cầu có hay không,
thuộc tính này có 2 giá trị là true hay false. Mặc định là true, tức là
Soap Header bắt buộc phải kèm theo Soap message. Ngoài ra thuộc tính
này còn dùng để điều khiển những Soap Header không xác
định(unknown Soap Header).
III.15 SoapExtension: Soap Extension cho phép chúng ta có thể
tăng thêm khả năng của Web Service bằng cách hiệu chỉnh các
Soap message đi và đến từ Web Service và từ client gọi Web
Service. Để hiểu 1 soap extension làm việc như thế nào, chúng
hãy tìm hiểu vòng đời của 1 XML Web Service qua sơ đồ sau:

Chuỗi những sự kiện xuất hiện khi một phương thức Web được
gọi như sau:
+ Đầu tiên, client tạo 1 instance của class proxy tham chiếu web service.
+ Client gọi (invoke) thực thi 1 phương thức từ class proxy.
+ Infrastructure trên máy client sẽ phân tích các tham số của phương thức dịch vụ
Web vào 1 soap message và gởi chúng đến XML Web Service.
+ Infrastructure nhận được Soap message và deserializes XML. Sau đó nó tạo 1
instance của class mà cài đặt các phương thức Web và gọi phương thức đó, đưa vào
bộ deserializes XML như là
các đối số(arguments).
+ Phương thức web được thực thi và return giá trị trả về, tham số out put.
+ Infrastructure trên máy server phân tích giá trị trả về và các tham số output vào
1 thông điệp Soap message và gởi trở về client.
+ Infrastructure trên máy client nhập Soap message, deserializes XML đưa vào
các tham số output, giá trị trả về.
+ client nhận được giá trị trả về và tham số out.
Qua sơ đồ và diễn giải trên ta thấy, thành phần serializes and deserializes XML trong
ASP.NET thực hiện cả ở XML Web Service và XML Web Service client. Một Soap
extension có thể được xen vào Infrastructure để kiểm tra và hiệu chỉnh soap message
trước và sau thời gian bộ serializes và deserializes thực hiện. Để thực hiện chức năng
này, ta đi xây dựng 1 Soap extension. Các bước cơ bản để tạo 1 soap extension:
+ Tạo 1 class kế thừa từ lớp SoapExtension.
+ Lưu 1 tham chiếu tới stream mà mô tả Soap message sẽ tạo.
+ Khởi tạo những thông số cho Soap extension.
+ Xử lý các Soap message dựa vào các SoapMessageStage .
+ Cấu hình Soap extension để chay với Web Service.
Sau đây là chi tiết các bước tạo và xử lý 1 Soap extension:
III.15.1. Tạo 1 class kế thừa từ lớp SoapExtension:
Class kế thừa từ SoapExtension là class mà thực hiện những chức năng của Soap
Extension.
III.15.2. Lưu 1 tham chiếu tới stream mà mô tả Soap
message sẽ tạo:
Để hiệu chỉnh 1 Soap message, chúng ta phải ghi đè(override) lên phương thức
ChainStream, nhằm mục đích là nhận được tham chiếu đến stream mà sử dụng để
nhận nội dung của Soap message sẽ tạo. Tham chiếu này sẽ diễn ra trước bất cứ
SoapMessageStage nào. Ví dụ:
// Lưu Stream mô tả Soap request và Soap response và 1 stream trên
máy cục bộ
public override Stream ChainStream( Stream stream )
{
// Lưu Stream truyền vào vào 1 biến nhớ
oldStream = stream;
newStream = new MemoryStream();
return newStream;
}
III.15.3. Khởi tạo những thông số cho Soap extension.

Class mà kế thừa từ SoapExtension có 2 phương thức cho khởi tạo dữ liệu:


GetInitializer và Initialize. Nếu Soap extension được cấu hình sử dụng attribute để
chạy, phương thức GetInitializer được gọi bởi ASP.NET infrastructure cho từng
phương thức web, ngược lại nếu Soap extension được cấu hình để chạy trong 1 file
config thì GetInitializer chỉ được gọi duy nhất 1 lần khi XML Web Service được
truy xuất. Dữ liệu trả về từ phương thức GetInitializer được lưu giữ bởi ASP.NET
infrastructure cho Soap Extension sử dụng sau này. Các Soap extension sẽ truyền
các dữ liệu lưu trữ mỗi khi Soap thực thi với XML Web Service hay phương thức
web trong phương thức Initialize.
Class SoapExtension cung cấp phương thức GetInitializer có 2 prototype khác
nhau phục vụ cho 2 kiểu cấu hình thực thi Soap Extension như sau:
+ Nếu gọi Soap Extension bằng cách áp các attribute lên từng
phương thức Web thì chúng ta sử dụng prototype sau, tham số
LogicalMethodInfo cung cấp chi tiết (prototype details) cho từng phương
thức Web Service như là số tham số hay kiểu dữ liệu của chúng.
public override object GetInitializer(LogicalMethodInfo
methodInfo,SoapExtensionAttribute attribute)
{
...
}
+ Nếu soap extension được cấu hình thực thi bằng tập tin
web.config, ta sử dụng prototype sau, tham số Type là Type của
class mà cài đặt XML Web Service.
public override object GetInitializer(Type WebServiceType)
{
}
III.15.4. Xử lý các Soap message dựa vào các
SoapMessageStage:
Trong class mà kế thừa từ SoapExtension, phương thức chủ yếu
để ta xử lý dữ liệu là ProcessMessage. Phương thức này nó cho
phép một Soap extension nhận 1 SoapMessage để xử lý tại mỗi
thời điểm mà được mô tả bằng Enum SoapMessageStage. Tuỳ
theo trạng thái của SoapMessageStage mà ta có những xử lý
để hiệu chỉnh hay xem thông tin Soap message. Bao gồm các
trạng thái như sau:
public override void ProcessMessage(SoapMessage message)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeSerialize:
// Xử lý Soap message.
break;
case SoapMessageStage.AfterSerialize:
// Xử lý Soap message.
break;
case SoapMessageStage.BeforeDeserialize:
// Xử lý Soap message.
break;
case SoapMessageStage.AfterDeserialize:
// Xử lý Soap message.
break;
default:
throw new Exception("invalid stage");
}
}
III.15.5. Cấu hình Soap extension để chạy với Web
Service:
Một Soap Extension có thể được cấu hình để thực thi sử dụng
custom attribute hoặc là cấu hình trong file web.config.
+ Sử dụng custom attribute: để sử dụng customer attribute,
chúng ta áp đặt(apply) nó lên mỗi phương thức Web Service mà
muốn cài đặt Soap extension. Ví dụ:
[TraceExtension()]
[WebMethod]
public Address TestMethod()
{
//Nội dung phương thức TestMethod()
}
Trong đó TraceExtension() là class kế thừa từ SoapExtension cài đặt
attribute.
+ Sử dụng file web.Config: Cấu trúc tổng quát như sau:

<configuration>
<system.Web>
<webServices>
<soapExtensionTypes>
<add type="soap extension class"
priority="number"
group="0|1" />
</soapExtensionTypes>
................
</webServices>
</system.Web>
</configuration>
Qua cấu trúc trên ta thấy, bên trong element soapExtensionTypes,
ta thêm những element add cho mỗi Soap extension mà chúng ta
muốn thực thi với XML Web Service bên trong phạm vi của tập tin
config. Element add có các thuộc tính sau:

Thuộc Diễn giải


tính
Type Type của Soap extension .
Prority Quan hệ ưu tiên của Soap extension bên trong 1 nhóm
của chúng. Các Soap extension được gán độ ưu tiên để
xác định thứ tự thực thi khi nhiều Soap extension được
cấu hình để chạy với 1 phương thức web service. (0 có
độ ưu tiên cao nhất)
Group Nhóm của Soap extension. Có 3 nhóm đó là Soap
extension cấu hình sử dụng 1 attribute và Soap
extension cấu hình trong file web.config với 1 Group với
giá trị là 0 và 1, trong đó Group 0 là ưu tiên cao nhất, 1
là ưu tiên thấp nhất.

III.16 MatchAttribute: Text pattern matching cho phép 1 XML Web


Service tác động lên 1 nội dung HTML tồn tại thông qua việc phân
tích nó sử dụng các biểu thức tổng quát(regular expressions). Bao
gồm các thuộc tính:
Capture:
Group:
IgnoreCase:
MaxRepeats:
Pattern:
Tài liệu MSDN: ms-
help://MS.VSCC/MS.MSDNVS/cpguide/html/cpconattributesforaspnetwebservicesaspne
twebserviceclients.htm

29 Phương thức của Web Service:


III.17 Cú pháp:
[WebMethod]
public ReturnValues TenPhuongthuc(Parameters)
{
....
}
III.18 Diễn giải:
ReturnValues: Khi gọi một XML Web Service sử dụng phương thức SOAP
hay HTTP GET/POST, những kiểu dữ liệu sau đây có thể trả về.
Kiểu dữ liệu Diễn giải
1 Primitive Types Các kiễu dữ liệu cơ bản vd:String, Char, Byte,...
2 Enum Types Các kiểu hằng số
3 Arrays of Primitives Mảng dữ liệu cơ bản, hằng số vd: String[], int[],...
(Enums)
4 Classes and Structs Các trường (public) hay các thuộc tính (public) của class
hay struct
5 Array of Classes Mảng của các trường trên
(Structs)
6 DataSet Kiểu dữ liệu DataSet của ADO.NET
7 Array of DataSet Mảng dữ liệu DataSet
8 XMLNode Kiểu dữ liệu XMLNode
9 Array of XMLNode Mảng XMLNode

Parameters: Cả tham số by_value hay by_reference đều hổ trợ khi sử


dụng giao thức SOAP, còn khi sử dụng giao thức HTTP GET/POST thì tham
số truyền vào chỉ truyền theo tham trị và giới hạn các kiểu liệu sau hổ trợ là:
Primitive Types, Enum Types and Arrays of Primitives (Enums).

30 Gọi sử dụng Web Service từ clients:


III.19 Giao thức gọi Web Service:
Khi thực hiện truyền tham số qua mạng và chuyển kết quả từ máy
chủ về máy khách theo giao thức HTTP. Phía đối tượng sử dụng dịch vụ và
đối tượng cung cấp dịch vụ cần phải dựa trên một nguyên tắc đóng gói
hoặc chuyển tải nào đó.Việc đóng gói và chuyển tải dữ liệu của Web
Service dựa trên 3 giao thức chính là HTTP-GET, HTTP-POST và SOAP. Kết
quả trả về được đóng gói theo mô tả của tài liệu XML.
HTTP-GET: Sử dụng địa chỉ và cách truyền tham số ngay trên URL. Kết quả
trả về là một tài liệu XML đơn giản.
Ví dụ:
<?xml version="1.0" encoding="utf-8" ?>
<float xmlns="http://MyWebService.com/">25</float>
HTTP-POST: Dựa vào phương thức chuyển dữ liệu POSt của thẻ <Form>
khi ta submit. Dữ liệu chuyển bằng giao thức HTTP-POST có khả năng mã
hoá và đóng gói được số lượng lớn hơn HTTP_GET.. Kết quả trả về là một tài
liệu XML đơn giản giống như truyền theo phương thức HTTP-GET.
SOAP: Dữ liệu truyền theo GET/POST của HTTP chủ yếu dùng cơ chế đặt dữ
liệu trong các biến theo khuôn dạng name=value, nên hạn chế thông tin
chuyển đi. SOAP sử dụng mô tả dữ liệu của ngôn ngữ định dạng XML đóng
gói thông tin cần chuyển đi. Ở cấp độ kỹ thuật, SOAP không đưa ra cách
chuyển dữ liệu mới mà nó đơn thuần dựa trên HTTP-POST nhưng thêm phần
mô tả dữ liệu bằng XML.
Cấu hình giao thức Web trong tập tin web.config: Chúng ta có thể cấu hình cho
các giao thức truyền dữ liệu như thêm hay xoá giao thức trong phần tử <protocols> có
cấu trúc như sau:
<system.Web>
<webServices>
<protocols>
<add name=”protocol name”/>
<remove name=”protocol name”/>
<clear />
</protocols>
................
</webServices>
</system.Web>
</configuration>
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
HttpSoap Thêm hay xoá phương thức HTTP SOAP
Documentati Thêm phương thức đặc biệt Documentation. Khi ta gọi
on trực tiếp trang .asmx, ASP.NET chạy trang giúp đỡ cung
cấp các phương thức.
Ví dụ:
<webServices>
<protocols>
<remove name="HttLGet" />
<remove name="HttLPost" />
<add name="HttLSoap" />
<add name="Documentation" />
</protocols>
<soapExtensionTypes>
</soapExtensionTypes>
</webServices>
III.20 Tham chiếu đến Web Service:
Để đơ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ụ:
<configuration>
<appSettings><add
key="TestSOAPHeaderClient.localhost.TestSOAPHeader"

value="http://localhost/TestSOAPHeader/Service1.asmx"/></appSettings>
</configuration>
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: ms-
help://MS.VSCC/MS.MSDNVS/vsintro7/html/vxconWebReferences.htm
31 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 :
<configuration>
<system.web>
<authentication mode="Windows"/>
</system.web>
<location path="Service1.asmx">
<system.web>
<authorization>
<allow users="Administrator"/>
<allow users="DOMAIN\UserName"/>
<deny roles="BUILTIN\Power Users"/>
</authorization>
</system.web>
</location>
</configuration>
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"].DefaultView;
Authors_DataGrid.DataBind();
}
}
Minh hoạ: http://azsw0188/TestWebServicesClient/WebForm2.aspx

III.22 Custom Authentication và Authorization with Soap


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!";
}
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();
Minh hoạ: http://azsw0188/TestSOAPHeaderClient/WebForm1.aspx

32 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.

You might also like