truy xuất cơ sở dữ liệu trong ACTIVE sever page
Trang 1CHƯƠNG 3 : TRUY XUẤT CƠ SỞ DỮ LIỆU TRONG ACTIVESERVER 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
Trang 2Quá trình truy xuất cơ sở dữ liệu thông qua ODBCCá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
Trang 3Interface 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ủ
Trang 4Tuy 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
Trang 51 adCmdText CommandText là một câu lệnh
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:
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.
Trang 6- 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:
ocmd.CommandText = “DELETE* FROM Table”;
oCmd.CommandType = 1; ‘ thể hiện rằng CommandText là một
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
Trang 7lệ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 oCmd.Parameter (tên thông số);
hay là oCmd.Parameter.Item(tên_thông_số);
Trang 83 Đố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
- 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
Trang 9Recordset_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:
Duyệt qua các record trên Recordset:
Trang 10Khi 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 dung, khi ta muốn lấy được nội dung của Record kế tiếp, hay jphía trước, cũng như các record ở vị trí đầu, cuối của recordset, ta sử dụng các phương thức di chuyển con trỏ: Movenext, Movefirst, Movelast, MovePrevious Với cú pháp:
Recordset_name.Movenext(); Recordset_name.MoveLast(); Recordset_name.MovePrevious(); Recordset_name.MoveFirst();
Khi di chuyển như vậy để tránh việc đưa con trỏ tới các vị trí không xác định, thông thường ta sử dụng các thuộc tính của Recordset như BOF, EOF Các thuộc tính này có ý nghĩa như sau:
Nếu BOF có giá trị True nghĩa là con trỏ ở vị trí đầu Recordset, khi Recordset mới được mở thì BOF luôn có giá trị này.
Khi con trỏ đã đi qua record cuối cùng trong Recordset, thì EOF sẽ có giá trị True.
Làm việc với recordset thông qua Fields Collections:
Ta cũng có thể truy xuất tới các Fields của mỗi record trong Recordset bằng cách sử dụng Collection fields với các thuộc tính của nó như: Count, Item.
Recordset_name.Fields.Item (“tên fields”) trả về nội dung có trong Record hiện tại.
Recordset_name.Fields.Item (“Index”) trả về nội dung của fields thứ index trong Record hiện tại.
Recordset_name.Fields (“index”) trả về tên của fileds thứ index trong Record hiện tại.
Chú ý : rằng chỉ số của các fields trong Record được đánh số từ 0 cho tới giá trị Recordset_name.Fields.Count – 1.