Chương 6: Truy xuất cơ sở dữ liệu

11 457 0
Chương 6: Truy xuất cơ sở dữ liệu

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Chương 6: Truy xuất cơ sở dữ liệu

CHƯƠNG 3 : TRUY XUẤT SƠÛ DỮ LIỆU TRONG ACTIVESERVER PAGÛ phần trên chúng ta đã biết về các khái niệm tổng quát về Active ServerPage và các thành phần cần khi xây dựng một ứng dụng.Trong chương nàysẽ trình bày kỹ hơn về Active Data Object, đây chính là ưu điểm mạnh nhấtcho việc phát triển ứng dụng sở dữ liệu trên web (Web Database).Database Access ComponentMột ứng dụng Web databse viết bằng ASP thể truy xuất dữ liệu trongmột database, bằng cách sử dụng Component Database Access của ActiveXhay còn gọi là thư viện ADO (Active DataObject).Đây cũng chính là điểmmạ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 thể tạo ra các kết nối(Connection) với hầuhế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 ứngdụ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ôngqua phương thức ODBC (Open Database Connectivity), chúng ta thể sửdụng chúng với bất kỳ loại database nào nếu như ODBC driver hỗ trợ. Hiệnnay 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 thể được môtả theo hình vẽ sau:Active Server PagesODBC DriverActive DatabaseComponentActive Data ObjectData ProviderInterfaceDATA Quá trình truy xuất sở dữ liệu thông qua ODBCCác Object trong ADOCác Object chính trong đó là: Connection, RecordSet và Command, ngoàiba Object chính này còn 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 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ằngcá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 duyệt và lấy ra mộthay nhiều Record. Sau đậy ta xem xet cụ thể cấu tạo cũng như cách sử dụngcủa từng của từng Object.Tạo các custom component sử dụng trong ASP:Ta thể tạo một component để sử dụng trong môi trường Active ServerPages, bằng bất cứ ngôn ngữ lập trình nào hổ trợ cho việc tạo AutomationServer. Các ngôn ngữ hổ trợ kỹ thuật này hiện nay là Visual Basic, VisualC++ từ các version 4.0 trở về sau. Việc chọn ngôn ngữ nào để hiện thực là tùythuộ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áccô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 saukhi biên dòch.Hiện nay trong các tài liệu liên quan đến các kỹ thuật lập trình theo cộngnghệ ActiveX của Microsoft hầu hết đều đưa ra các công thức để hiện thực cáccomponent này bằng Visual Basic 4.0 và 5.0. tuy nhiên trong việc lập trìnhhướ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ớicấu trúc thừa kế của các thư viện chứa trong nó. Mặc việc hiện một codeComponent 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ạigầ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 emxin trình bày các bước để hiệb thực một component bằng môi trường VisualC++ như là một cách hiện thực khác hơn trong đó sử dụng các khả năng củacông cụ ATL (Active Template Library).Automation Server & Activex Component:Automation Server thể được coi là một thư viện các Object (Class), màkhi nó đã được đăng ký trên server, nó khả năng cho phép các ứng dụng khácnhìn thấy và sử dựng các Class của mình. Bên trong của một component nhưthế, 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 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 thể được thực hiện ở dạng in_process, thi hành trongvùng hoạt động của controller, hoặc thể ở dạng local, chỉ thực thi trongkhông gian họat động của nó. Automation Server còn thể thực hiện ở dạngremote, sẽ thưcj thi trong vùng hoạt động của máy khác. Dạng biên dòch củaAutomation Server thể là DLL (Dynamic Link Library) hoặc EXE(Excutable). dạng EXE nó chỉ thể thực thi ở dạng local hoặc remoteBằng Visual C++ ta thể xây dựng các Component bằng cách viết thẳngvớ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 fileIDL (Interface Definition Language). Thật may là Visual C++ đã cung cấp chota cộng cụ ATL, dùng để tạo ra các thư viện liên kết động, trong đó chứa cácInterface 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 chonó, đây thực sự là một thể hiện của Object này trong trang ASP. Phát biểu tạoinStance cho Connection 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 một liên kết với Data Sourcecố đònh cho tất cả các trang thì khi đó ta sẽ đặt instance của Connection tầmvự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 thể xem xét thêm việc tối ưu cho các Connection trong mộtứng dụng nhiều user truy xuất tới database, đó là khả năng Connectionpooling của ODBC 3.0Connection poolingCá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ớidatabase mà nó sử dụng, còn các ứng dụng Database trên web lại mở và đóngcác liên kết này ở mỗi trang web.Một phương pháp cho các ứng dụng Databasetrê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 thể làm gia tăng sốlượng các user kết nối tới 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 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ủùng dụng web là quản lý bằng Connection Pool của ODBC 3.0 nhằm giảm bớtsố 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ốinày.Mỗi khi một yêu cầu kết nối mới thì thực hiện việc kiểm tra xem liênkết nào rảnh không, nếu không thì sẽ tạo kết nối mới, ngược lại sẽ lấy liênkết rảnh này mà không tạo liên kết mới.Nếu một liên kết rảnh nào trongConnection 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 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ộtinstance cho Connection Object, ta 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 PasswordTrong đó 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ệcmở Data Source.- Execute method: Phương thức này cho phép thực thi một câu lệnh, tác độnglên data Source.Theo trình tự sau khi đã một kết nối tới Datasource, ta thể sử dụngnó với phương thức Execite với cú pháp trong VBScript như sau:Connection.Execute Commantext, RecordAffected, optionsTrong đó thông số option các giá trò khác nhau tương ứng với mỗi loạiCommanText.Các giá trò của Option theo bảng sau:Giá trò Danh hiệu hằng tương ứng Mô tả CommanText0 adCmdUnknown Giá trò này mặc đònh khi đònhnghó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ộtRecordSet từ đó3 adCmdStoredPro Một stored procedure trongdatasourceThô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 datasource, 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.CloseNếu chương trình không thực hiện việc này thì ASP sẽ tự động đóngConnection đã mở trong trang, mỗi khi người sử dụng tham khảo qua trangkhác (đi khỏi tầm vực của biến instance). Nếu ta tạo instance và mở kết nốitrong các thủ tục Application hoặc session On Start thì việc đóng cácConnection 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 để queryhay update data source, ta thể sử dụng đối tượng Command đễ thi hành cácthao tác với sở dữ liệu.Việc tạo một instance cho đối tượng Command cũng giống như đối tượngConnection. 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ộctí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ínhCommandText.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 sở dữ liệu. - CommandTimeOut: Xác đònh thời gian thực thi lệnh, giá trò thời gian thựcthi đượ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 ActiveConnectionSau khi đã 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 taphả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ệucần làm việc) vào cho thuộc tính ActiveConnection của Command ObjectCommand_name. ActiveConnection = Command_name;Thực thi QueryTa 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ớiConnection là đối với Command nếu ta dự đònh thi hành một lệnh nào thì taphả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ộtSQLoCmd.Prepared = true ‘thực hiện compile cậu lệnhoCmd.Execute();oCmd.ActiveConnection = nothing ;%>Ta gán giá trò CommandTimeOut ở giá trò thích hợp, thông thường là 30,nếể 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 SQLNếu như query cần thực thi yêu cầu thông số, thì ta phải thêm các thôngsố này vào Collections parameter, trước khi thực thi câu lệnh.đối với phươngthức Execute của đối tượng Connection không khả năng này.Khi sử dụng query tham số thì cú pháp của phương thức dạng như sau:Command.Execute({RecordAffected}, Parameter, Option);Record và Option chức năng và giá trò giống như trong ConnectionObject. 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 taxem 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àyngay 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ố 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 thể coi như một Parameter Objectvà chúng cũng 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 instacecho Parameter Object và thiết lập các giá trò thuộc tính cho nó.Sau đó sử dụngphươ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 thể sử dụng:OCmd.Parameter.Item(index); hoặcoCmd.Parameter(index); hoặcoCmd.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 thể thực thicác query để add, update, hay delete một record trong data source. Tuy nhiêntrong 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ộtbả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 rUpdaterecordset.- 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 đầutiê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): giá trò True nếu vò trí con trỏ nằm ở record đầutiên. CursorType : Kiểu con trỏ được sử dụng trong RecordSet.- EOF (End Of File): giá trò True nếu vò trí con trỏ nằm ở record cuốicùng trong Recordset.- RecordCount: Trả về số record trong Recordset.Tạo RecordsetĐể đượ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 đã biến recordset rồi ta thể khởi tạo giá trò cho nó bằng cáchlưu kết quả trả về, mỗi khi thi hành các phương thức Execute của đối tượngConnection hay Command, ví dụ như :Recordset_name = ConnetionObject.Execute(CommandText,Recordaffected, option);Hoặc Recordset_name = ConnetionObject.Execute(CommandText,Parameter, option);Ta cũng thể tạo một recordset bằng cách sử dụng phương thức Opentheo 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 Storedprocedure.- ActiveConnection là tên của Connection đã được mở kết nối với 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àycó 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ộtchiều từ đầu đến cuối, tùy chọn này cũng không cho phép ta cập nhậthay 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êmvào, loại bỏ, sửa đổi record trong recordset. Cho phép thấy được sự thaổi đó trên record do user khác thực hiện. ƠÛ chế độ này cho phép ngườisử 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ácgiá 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ự thaổi này sẽ 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ó (Batchupdate)Đóng RecordsetSau khi sử dụng xong một Recordset, hay trước khi mở lại ta phải thực hiệnviệc đóng recordset lại bằng phương thức Close với cú pháp:Recordset_name.CloseDuyệt qua các record trên Recordset: Khi ta đã một Recordset, để hiển thò hay truy xuất tới mỗi record trong đóta 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ộtfile 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ủaRecord kế tiếp, hay jphía trước, cũng như các record ở vò trí đầu, cuối củarecordset, 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ácthuộc tính này ý nghóa như sau:Nếu BOF giá trò True nghóa là con trỏ ở vò trí đầu Recordset, khiRecordset mới được mở thì BOF luôn giá trò này.Khi con trỏ đã đi qua record cuối cùng trong Recordset, thì EOF sẽ giátrò True.Làm việc với recordset thông qua Fields Collections:Ta cũng thể truy xuất tới các Fields của mỗi record trong Recordset bằngcá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 trong Recordhiện tại.Recordset_name.Fields.Item (“Index”) trả về nội dung của fields thứ indextrong Record hiện tại.Recordset_name.Fields (“index”) trả về tên của fileds thứ index trongRecord 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. . 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. với c sở dữ liệu, và Command Object.Lúc này nếu muốn sử dụng Command Object taphả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ệucần

Ngày đăng: 31/10/2012, 15:03

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan