Ở phần trên chúng ta đã biết về các khái niệm tổng quát về Active Server Page và các thành phần cần có khi xây dựng một ứng dụng.Trong chương này sẽ trình bày kỹ hơn về Active Data Object, đây chính là ưu điểm mạnh nhất cho việc phát triển ứng dụng cơ sở dữ liệu trên web (Web Database).
11 trang |
Chia sẻ: vietpd | Lượt xem: 1594 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Truy xuất cơ sở dữ liệu trong active server page, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
CHƯƠNG 3 : TRUY XUẤT CƠ SỞ DỮ LIỆU TRONG ACTIVE
SERVER PAGE
Ở phần trên chúng ta đã biết về các khái niệm tổng quát về Active Server
Page và các thành phần cần có khi xây dựng một ứng dụng.Trong chương này
sẽ trình bày kỹ hơn về Active Data Object, đây chính là ưu điểm mạnh nhất
cho việc phát triển ứng dụng cơ sở dữ liệu trên web (Web Database).
Database Access Component
Một ứng dụng Web databse viết bằng ASP có thể truy xuất dữ liệu trong
một database, bằng cách sử dụng Component Database Access của ActiveX
hay còn gọi là thư viện ADO (Active DataObject).Đây cũng chính là điểm
mạnh nhất của ASP trong việc phát triển ứng dụng Web Database.
Các Object của ADO cung cấp có thể tạo ra các kết nối(Connection) với hầu
hết các kiểu Database, cũng như việc truy xuất, cập nhật các Database này.
Hiện nay thư viện ADO là công cụ mạnh nhất trong việc phát triển các ứng
dụng database trên Internet.
Trong phần này ta sẽ xem xét các thành phần trong thư viện công cụ này.
ADO interface:
ADO được thiết kế một cách đơn giản nhất, nó giao tiếp với database thông
qua phương thức ODBC (Open Database Connectivity), chúng ta có thể sử
dụng chúng với bất kỳ loại database nào nếu như ODBC có driver hỗ trợ. Hiện
nay tồn tại driver cho hầu hết các loại database như Foxpro, Access, Oraccle,
SQl server…
Sự giao tiếp giữa ADO và các thành phần khác trong hệ thống có thể được mô
tả theo hình vẽ sau:
Active Server Pages
ODBC Driver
Active Database
Component
Active Data Object
Data Provider
Interface
DATA
Quá trình truy xuất cơ sở dữ liệu thông qua ODBC
Các Object trong ADO
Các Object chính trong đó là: Connection, RecordSet và Command, ngoài
ba Object chính này còn có các Object, tham số, thuộc tính,phương thức con.Sử
dụng Connection ta thể thiết lập sự liên kết với cơ sở dữ liệu, thông qua đó ta có
thể thực hiện các Query để lấy ra các record hoặc cập nhật một record bằng
cách sử dụng Command object. Kết quả thực hiện các query trên database sẽ
được lưu vào đối tượng RecordSet, trên đối tượng này ta có duyệt và lấy ra một
hay nhiều Record. Sau đậy ta xem xet cụ thể cấu tạo cũng như cách sử dụng
của từng của từng Object.
Tạo các custom component sử dụng trong ASP:
Ta có thể tạo một component để sử dụng trong môi trường Active Server
Pages, bằng bất cứ ngôn ngữ lập trình nào hổ trợ cho việc tạo Automation
Server. Các ngôn ngữ có hổ trợ kỹ thuật này hiện nay là Visual Basic, Visual
C++ từ các version 4.0 trở về sau. Việc chọn ngôn ngữ nào để hiện thực là tùy
thuộc vào người lập trình, phụ thuộc vào sự thân thiện với ngôn ngữ đó, các
công cụ hổ trợ, các kỹ thuật lập trình cũng như các kích thước của ứng dụng sau
khi biên dịch.
Hiện nay trong các tài liệu có liên quan đến các kỹ thuật lập trình theo cộng
nghệ ActiveX của Microsoft hầu hết đều đưa ra các công thức để hiện thực các
component này bằng Visual Basic 4.0 và 5.0. tuy nhiên trong việc lập trình
hướng tới đối tượng thật sự thì Visual C++ là một môi trường điển hình hơn, với
cấu trúc thừa kế của các thư viện chứa trong nó. Mặc dù việc hiện một code
Component chạy trên server, sử dụng trong ASP không là một công việc mới lạ
trong Visual Basic, nhưng việc hiện thực các component bằng Visual C++ lại
gần như không thấy tài liệu nào hướng dẫn một cách cụ thể, trong phấn này em
xin trình bày các bước để hiệb thực một component bằng môi trường Visual
C++ như là một cách hiện thực khác hơn trong đó sử dụng các khả năng của
công cụ ATL (Active Template Library).
Automation Server & Activex Component:
Automation Server có thể được coi là một thư viện các Object (Class), mà
khi nó đã được đăng ký trên server, nó có khả năng cho phép các ứng dụng khác
nhìn thấy và sử dựng các Class của mình. Bên trong của một component như
thế, có thể chứa một hay nhiều các Class, với Interface của nó, nhờ vào các
Interface này các ứng dụng khác có thể giao tiếp với các Object bên trong.
Thông thường các Interface này là Idispatch hoặc User Interface.
Automation Server có thể được thực hiện ở dạng in_process, thi hành trong
vùng hoạt động của controller, hoặc có thể ở dạng local, chỉ thực thi trong
không gian họat động của nó. Automation Server còn có thể thực hiện ở dạng
remote, sẽ thưcj thi trong vùng hoạt động của máy khác. Dạng biên dịch của
Automation Server có thể là DLL (Dynamic Link Library) hoặc EXE
(Excutable). Ơø dạng EXE nó chỉ có thể thực thi ở dạng local hoặc remote
Bằng Visual C++ ta có thể xây dựng các Component bằng cách viết thẳng
với C API và thiết lập bằng tay các Interface, dựa trên việc tạo và dịch các file
IDL (Interface Definition Language). Thật may là Visual C++ đã cung cấp cho
ta cộng cụ ATL, dùng để tạo ra các thư viện liên kết động, trong đó chứa các
Interface cho phép những ứng dụng khác sử dụng được các object của nó.
1. Đối tượng Connection:
Để sử dụng đối tượng Connection, trước tiên ta phải tạo ra một instance cho
nó, đây thực sự là một thể hiện của Object này trong trang ASP. Phát biểu tạo
inStance cho Connection có cú pháp như sau:
<%
Connection_name=Server.CreatObject(“ADODB.Connection”)
%>
Thông thường trong một ứng dụng nếu ta cần có một liên kết với Data Source
cố định cho tất cả các trang thì khi đó ta sẽ đặt instance của Connection có tầm
vực ở mức Application bằng cách đưa phát biểu tạo instance ở trên vào các thủ
tục Application_onStart():
<%
Sub Application_onStart()
Set Connection_name =
Server.CreateObject(“ADODB.Connection”)
End Sub
%>
Hoặc thiết lập tầm vực cho Connection ở mức session như sau:
<%
Sub Session_onStart()
Set Connection_name=
Server.CreateObject(“ADODB.Connection”)
End Sub
%>
Tuy nhiên ta có thể xem xét thêm việc tối ưu cho các Connection trong một
ứng dụng có nhiều user truy xuất tới database, đó là khả năng Connection
pooling của ODBC 3.0
Connection pooling
Các ứng dụng cơ sở dữ liệu truyền thống đều tạo một mối liên kết tới
database mà nó sử dụng, còn các ứng dụng Database trên web lại mở và đóng
các liên kết này ở mỗi trang web.Một phương pháp cho các ứng dụng Database
trên web là tạo một sự liên kết liên tục với cơ sở dữ liệu của từng user và lưu trữ
trong đối tượng Session.Tuy nhiên phương pháp này có thể làm gia tăng số
lượng các user kết nối tới cơ sở dữ liệu mà không làm việc và nó chỉ đạt được
độ tin cậy đối với các web site có sự lưu thông dữ liệu thấp(low-traffic)
Phương pháp tiện lợi hơn trong việc quản lý các kết nối với cơ sở dữ liệu của
ứng dụng web là quản lý bằng Connection Pool của ODBC 3.0 nhằm giảm bớt
số lượng liên kết rảnh rỗi.ODBC sẽ mở các kết nối và quản lý các kết nối
này.Mỗi khi có một yêu cầu kết nối mới thì thực hiện việc kiểm tra xem có liên
kết nào rảnh không, nếu không có thì sẽ tạo kết nối mới, ngược lại sẽ lấy liên
kết rảnh này mà không tạo liên kết mới.Nếu có một liên kết rảnh nào trong
Connection Pool tồn tại quá 60s thì nósẽ tự động hủy bỏ.
Connection Pooling được kích hoạt mặc nhiên trong ASP, ta có thể loại bỏ
bằng cách thiết lập giá trị Register Entry Start ConnectionPool về giá trị 0.
Các phương thức của đối tượng Connection
- Open method: Sử dụng để mở một kết nối với Database.Sau khi tạo một
instance cho Connection Object, ta có thể mở một kết nối với data source để có
thể truy xuất dữ liệu, cú pháp cho phương thức trong VBScript như sau:
Connection.Open ConnectionString User Password
Trong đó ConnectionString là chuỗi định nghĩa tên của data Source
(DNS),tên này được khai báo trong ODBC. User và Password, Sẽ thực hiện việc
mở Data Source.
- Execute method: Phương thức này cho phép thực thi một câu lệnh, tác động
lên data Source.
Theo trình tự sau khi đã có một kết nối tới Datasource, ta có thể sử dụng
nó với phương thức Execite với cú pháp trong VBScript như sau:
Connection.Execute Commantext, RecordAffected, options
Trong đó thông số option có các giá trị khác nhau tương ứng với mỗi loại
CommanText.Các giá trị của Option theo bảng sau:
Giá trị Danh hiệu hằng tương ứng Mô tả CommanText
0 adCmdUnknown Giá trị này mặc định khi định
nghĩa
1 adCmdText CommandText là một câu lệnh
(ví dụ như SQL)
2 adCmdTable Tên của Table mà tasẽ tạo một
RecordSet từ đó
3 adCmdStoredPro Một stored procedure trong
datasource
Thông thường các giá trị trên sẽ được gáncho tên (danh hiệu), hằng và
được đặt trong các file include.
-Close method: trong các trang ASP, sau khi đã xử lý xong dữ liệu trên data
source, trước khi kết thúc trang sử dụng phải đóng lại các kết nối đã mở. Việc
đóng kết nối thực hiện nhờ phương thức Close.
Cú pháp như sau:
Connection.Close
Nếu chương trình không thực hiện việc này thì ASP sẽ tự động đóng
Connection đã mở trong trang, mỗi khi người sử dụng tham khảo qua trang
khác (đi khỏi tầm vực của biến instance). Nếu ta tạo instance và mở kết nối
trong các thủ tục Application hoặc session On Start thì việc đóng các
Connection này sẽ được thể hiện trong thủ tục on End.
2. Đối tượng Command:
Thay vì phải sử dụng phương thức Execute của đối tượng Connection để query
hay update data source, ta có thể sử dụng đối tượng Command đễ thi hành các
thao tác với cơ sở dữ liệu.
Việc tạo một instance cho đối tượng Command cũng giống như đối tượng
Connection. Nghĩa là cũng sử dụng phương thức Server.CreateObject.
Command_name= Server.CreateObject(“ADODB.Command”)
Tuy nhiên để sử dụng đối tượng này ta cần xem xét các phương thức và thuộc
tính kèm theo.
Các phương thức (Method):
- Create Paramater: Dùng để tạo một đối tượng (thông số) trong tập thông số
- Execute: Dùng để thực thi câu lệnh được đặt tả trong thuộc tính
CommandText.
Các thuộc tính (Properties):
- ActiveConnection:Chỉ định đối tượng Connection nào được sử dụng trong
đối tượng Command.
- CommandText: Chỉ định câu lệnh cần thực thi trên cơ sở dữ liệu.
- CommandTimeOut: Xác định thời gian thực thi lệnh, giá trị thời gian thực
thi được tính theo giây.
- CommandType : Cho biết kiểu của query đặc tả trong CommandText
- Prepared:tạo ra lệnh chuẩn trước khi thực thi.
Tạo ActiveConnection
Sau khi đã có các instance của các Connection Object đã được kết nối với cơ
sở dữ liệu, và Command Object.Lúc này nếu muốn sử dụng Command Object ta
phải gán tên của Connection thích hợp (Connection nào kết nối tới cơ sở dữ liệu
cần làm việc) vào cho thuộc tính ActiveConnection của Command Object
Command_name. ActiveConnection = Command_name;
Thực thi Query
Ta có thể sử dụng phương thức Execute của Command gần giống như
Connection.Tuy nhiên điểm khác với Connection. Tuy nhiên điểm khác với
Connection là đối với Command nếu ta có dự định thi hành một lệnh nào thì ta
phải động cho các giá trị thuộc tính CommandText, Parameter,… Ví dụ sau là
một đoạn chương trình thực hiện một query trong datasource:
< %
oConn = Server.CreateObject(“ADODB.Connection”)
oCmd = Server.CreateObject(“ADODB.Command”)
oConn.Open (“Pubs”, “sa”, “”);
oCmd.ActiveConnetion = oConn;
ocmd.CommandText = “DELETE* FROM Table”;
oCmd.CommandType = 1; ‘ thể hiện rằng CommandText là một
SQL
oCmd.Prepared = true ‘thực hiện compile cậu lệnh
oCmd.Execute();
oCmd.ActiveConnection = nothing ;
%>
Ta gán giá trị CommandTimeOut ở giá trị thích hợp, thông thường là 30,nếu
để giá trị này là 0 thì ADO sẽ thực thi cho đến khi tác vụ được hoàn tất.
Sử dụng thông số cho các lệnh SQL
Nếu như query cần thực thi có yêu cầu thông số, thì ta phải thêm các thông
số này vào Collections parameter, trước khi thực thi câu lệnh.đối với phương
thức Execute của đối tượng Connection không có khả năng này.
Khi sử dụng query có tham số thì cú pháp của phương thức có dạng như sau:
Command.Execute({RecordAffected}, Parameter, Option);
Record và Option có chức năng và giá trị giống như trong Connection
Object. Tham số parameter là một dãy thông số được thực hiện trong một array,
mỗi một phần tử của array là một thông số, theo thứ tự các thông số trong câu
lệnh .Để tìm hiểu cách tạo ra thông số trong danh sách các thông số câu lệnh ta
xem các method và properties của Parameter collections, trong phần tiếp theo.
Tạo và thêm thông số vào Collection
Đối tượng Parameter collection là đối tượng lưu giữ các thông số cho query,
mà sẽ được thực thi bởi Command Object.Thay vì phải đưa các thông số này
ngay khi thực hiện query,Ta sẽ chuẩn bị nó trước trong Parameter collection,
điều này được phép thực hiện nhờ các method và properties của Parameter.
Các method:
- Append: Thêm một thông số vào collections.
- Delete: Xóa một thông số trong Collections.
- Refesh : cập nhật Collections để phản anh sự thay đổi thông số trong đó.
Các Properties:
- Count: trả vầ các thông số có trong Collections.
- Item : được sử dụng để lấy giá trị của một thông số trong Collections.
Mỗi phần tử của Parameter Collection có thể coi như một Parameter Object
và chúng cũng có các Properties riêng như:
- Attribute: Thể hiện kiểu dữ liệu mà thông số đó chấp nhận
- Dicrection: Thể hiện hướng củ athông số là Input hay Output,hay cả hai,
hay nó là giá trị từ stered procedure.
- Name: Tên thông số.
- NumberScale: Số chữ số thập phận trong thông số kiểu số.
- Precision: Chữ số của thông số kiểu số.
- Size: Kích thước lớn nhất, tính theo byte.
- Type : kiệu dữ liệu thông số.
- Value: Giá trị gán cho thông số.
Để thêm một thông số ới vào Collection, trước tiên ta phải tạo một instace
cho Parameter Object và thiết lập các giá trị thuộc tính cho nó.Sau đó sử dụng
phương thứcAppend.
Ví dụ các bước cần thực hiện khi tạo danh sách thông số:
< %
oParam = oCmd.CreateParameter(Name, size Direction, Value);
oCmd.Parameter.Append (oParam);
%>
Để lấy giá trị thông số trong collection ta có thể sử dụng:
OCmd.Parameter.Item(index); hoặc
oCmd.Parameter(index); hoặc
oCmd.Parameter (tên thông số);
hay là oCmd.Parameter.Item(tên_thông_số);
3. Đối tượng RecordSet:
Bằng cách sử dụng các đối tượng Connection và Command ta có thể thực thi
các query để add, update, hay delete một record trong data source. Tuy nhiên
trong các ứng dụng thì ta cũng phải thực hiện việc lấy ra các Record từ ADO, để
hiển thị giá trị chúng trong trang web. Để lấy lại kết quả trả về từ các Query,
chúng taphải sử dụng đối tượng RecordSet, thực chất nó được hiểu như một
bảng trong bộ nhớ, và nó cung cấp cho ta các phương thức, properties để dễ
dàng truy xuất các Record trong nó.
Các method:
- AddNew: Là phương thức dùng để tạo ra một record trong rUpdate
recordset.
- Close: đóng lại đối tượng Recordset và các đối tượng con của nó.
- Delete: Xóa đi record hiện hành trong Recordset.
- Move: dich chuyển vị trí Record hiện tại.
- MoveFirst
- MoveNext Các phương thức dịch chuyển con trỏ
- MovePrevious
- MoveLast
- Open : Mở một record mới,sau khi mở xong thì con trỏ nằm ở Record đầu
tiên trong recordset.
- Requery : Thực hiện lại query.Lưu các thay đổi trên Reacord hiện hành.
Các properties:
- AbsolutePosition : Số thứ tự của Record hiện tại.
- BOF(Begin Of File): Có giá trị True nếu vị trí con trỏ nằm ở record đầu
tiên. CursorType : Kiểu con trỏ được sử dụng trong RecordSet.
- EOF (End Of File): Có giá trị True nếu vị trí con trỏ nằm ở record cuối
cùng trong Recordset.
- RecordCount: Trả về số record trong Recordset.
Tạo Recordset
Để có được một biến Recordset ta sử dụng phát biểu tạo instance cho nó
như sau:
Recordset_name = Server.CreateObject (“ADODB.Recordset”);
Sau khi đã có biến recordset rồi ta có thể khởi tạo giá trị cho nó bằng cách
lưu kết quả trả về, mỗi khi thi hành các phương thức Execute của đối tượng
Connection hay Command, ví dụ như :
Recordset_name = ConnetionObject.Execute(CommandText,
Recordaffected, option);
Hoặc
Recordset_name = ConnetionObject.Execute(CommandText,
Parameter, option);
Ta cũng có thể tạo một recordset bằng cách sử dụng phương thức Open
theo cú pháp sau:
Recordset_name.Open(Source, ActiveConnection, CursorType,
LockType, Option);
Trong đó:
- Source là Command Object, hay một lệnh SQL, hoặc là một Stored
procedure.
- ActiveConnection là tên của Connection đã được mở kết nối với cơ sở dữ
liệu cần làm việc.
- CursorType là kiểu của con trỏ sử dụng khi mở Recordset, thông số này
có kiểu số, và được đặt bằng các tên hằng tương ứng như :
+ adOpenForwardOnly = 0 là giá trị mặc định, khi chọn thông số này tì
Record được mở ra chỉ để cho phép ta duyệt các record trong nó theo một
chiều từ đầu đến cuối, tùy chọn này cũng không cho phép ta cập nhật
hay xóa bỏ các record trong đó.
+ adOpenKeyset = 1 Khi mở recordset ở chế độ này, recordset được mở
có khả năng cho phép ta cập nhật các record, tuy nhiên nó ngăn cản sự
truy xuất tới một record mà User khác thêm vào Recordset.
+ adOpenKeyset = 2 Chế độ này cho phép tất cả các thao tác như thêm
vào, loại bỏ, sửa đổi record trong recordset. Cho phép thấy được sự thay
đổi đó trên record do user khác thực hiện. Ở chế độ này cho phép người
sử dụng duyệt theo tất cả các chiều (lên xuống) trong recordset.
+ adOpenStatic = 3 Gần giống như chế độ OpenForwardOnly
+ LockType là kiểu Locking sử dụng khi mở Recordset. Bao gồm các
giá trị sau:
· adLockReadOnly = 1 ta không thể thay đổi dữ liệu khi mở bằng chế
độ khóa này.
· AdLockpessimistic = 2 cho phép thay đổi dữ liệu trên record, sự thay
đổi này sẽ có tác dụng tức thời ngay trên data source.
· AdLockOpetimistic = 3 sẽ khóa record mỗi khi ta update.
· AdLockBatchOptimistic = 4 Thực hiện việc cập nhật theo bó (Batch
update)
Đóng Recordset
Sau khi sử dụng xong một Recordset, hay trước khi mở lại ta phải thực hiện
việc đóng recordset lại bằng phương thức Close với cú pháp:
Recordset_name.Close
Duyệt qua các record trên Recordset:
Khi ta đã có một Recordset, để hiển thị hay truy xuất tới mỗi record trong đó
ta có thể sử dụng các phương thức duyệt như: Movenext, Movefirst, Movelast,
MovePrevious. Với nguyên tắc gần giống nhưviệc duyệt các record trong một
file có cấu trúc, tức là ttồn tại một con trỏ tưởng tượng, vị trí hiện tại của con trỏ
cũng là record mà ta sẽ lấy được nội d