Trong chương 7 ta đã trình bày các vấn đề cơ bản để tạo ra một trang web động, với kỹ thuật của ASP ta có thể tùy biến giao diện và xử lý tính toán một cách hiệu quả, tuy nhiên thế mạnh của ASP là sử dụng cơ sở dữ liệu để đáp ứng yêu cầu thông tin của client. Hiện nay có hơn 90% trang web động đều sử dụng cơ sở dữ liệu quan hệ. Ta có thể tạo ra các ứng dụng chạy trên môi trường web (web base application) như như ecommercial, egovernment, elearning v.v... dựa trên kỹ thuật trang web động với công nghệ ASP, JSP, PHP v.v.. và một cơ sở dữ liệu quan hệ, tốt nhất là dùng một hệ quản trị cơ sở dữ liệu mạnh, đáp ứng mô hình clientserver như SQL server, Oracle, DB2, v.v...
Trang 1Chương 8
ASP VÀ CƠ SỞ DỮ LIỆU
Trong chương 7 ta đã trình bày các vấn đề cơ bản để tạo ra một trang web động, với kỹ thuật của ASP ta có thể tùy biến giao diện và xử lý tính toán một cách hiệu quả, tuy nhiên thế mạnh của ASP là sử dụng cơ sở dữ liệu để đáp ứng yêu cầu thông tin của client Hiện nay có hơn 90% trang web động đều sử dụng cơ sở dữ
liệu quan hệ Ta có thể tạo ra các ứng dụng chạy trên môi trường web (web base
application) như như e-commercial, e-government, e-learning v.v dựa trên kỹ
thuật trang web động với công nghệ ASP, JSP, PHP v.v và một cơ sở dữ liệu quan
hệ, tốt nhất là dùng một hệ quản trị cơ sở dữ liệu mạnh, đáp ứng mô hình client-server như SQL client-server, Oracle, DB2, v.v
8.1 GIỚI THIỆU VỀ ADO
Ngôn ngữ SQL là một chuẩn công nghiệp trong việc truy vấn cơ sở dữ liệu quan hệ, tuy nhiên để truy cập vào hệ cơ sở dữ liệu của từng DBMS và thực hiện câu lệnh SQL ta phải sử dụng các trình điều khiển (driver) do DBMS này cung cấp, đây là công việc khá phức tạp đối với người phát triển ứng dụng Để giải quyết vấn
đề này, Microsoft đưa ra cơ chế cầu nối giữa ứng dụng và cơ sở dữ liệu bất kỳ mà không quan tâm đến sự khác biệt giữa các hệ cơ sở dữ liệu, đó là cơ chế cầu nối ODBC (Open Database Connection) ODBC là một giao diện lập trình cho phép các ứng dụng truy cập dữ liệu của một hệ quản trị cơ sở dữ liệu dùng SQL làm ngôn ngữ vấn tin chính thức
Để tăng hiệu quả kết nối và truy vấn cơ sở dữ liệu, Microsoft xây dựng cơ chế cầu nối và tập lệnh truy xuất cơ sở dữ liệu tổng quát ở dạng đối tượng là OLE
DB, trong đó ADO (ActiveX Data Object) là một đối tượng COM tập trung vào xử
lý dữ liệu thông qua OLE DB Tuy nhiên vai trò của ODBC không biến mất chừng nào hệ cơ sở dữ liệu chưa có provider riêng
8.1.1 Kiến trúc ADO
ADO cho phép một ứng dụng tương tác với nguồn dữ liệu như cơ sở dữ liệu, mail, tệp văn bản hay bất cứ loại dữ liệu nào hỗ trợ cơ chế cho phép giao tiếp với một ứng dụng thông qua OLE DB Ta có mô hình sau :
8.1.2 Một số khái niệm
Provider
Trong mô hình kiến trúc ADO nêu trên, ứng dụng là một trình tiêu thụ dữ
liệu (data consumer) vì nó cần truy xuất vào nguồn dữ liệu để xử lý, các tập lệnh
cho phép truy xuất vào nguồn dữ liệu được gọi là trình cung cấp (provider), nó cho
phép giao tiếp giữa nguồn dữ liệu và tầng điều khiển của OLE-DB ADO là tầng trung gian, trao đổi với nguồn dữ liệu mà không cần biết cách làm việc của
Trang 2provider, để giúp OLE-DB biết provider nào cần giao tiếp khi mở kết nối ADO cần chỉ rõ provider phù hợp với nguồn dữ liệu
Microsoft cung cấp các provider cho các hệ cơ sở dữ liệu thông dụng sau:
• Microsoft.Jet.OLEDB.4.0 cho cơ sở dữ liệu MS Access
• SqlOLEDB.1 cho cơ sở dữ liệu SQL Server
• MsdaORA.1 cho cơ sở dữ liệu Oracle
• MsIDXS.1 cho cơ sở dữ liệu MS Indexing Service
Driver
Giữa Provider và Driver có chung đặc điểm là giao diện lập trình cho phép ứng dụng truy cập vào các hệ cơ sở dữ liệu, nhưng Driver khác hơn ở chỗ cho phép kết nối vào cơ sở dữ liệu theo chuẩn ODBC Microsoft cung cấp 22 driver thông
qua trình Data Sources (ODBC): MS Access, MS SQL, Visual Foxpro, Exel, Oracle,
Paradox, Text v.v Hình vẽ dưới đây minh họa mối quan hệ giữa OLE-DB và
ODBC
8.2 MÔ HÌNH ĐỐI TƯỢNG ADO
ADO được thiết kế để cung cấp phương pháp truy cập cơ sở dữ liệu chung
cho tất cả người sử dụng, ADO đưa ra mô hình đối tượng mà mỗi đối tượng được xem như tập các thuộc tính, phương thức, collection và các event có thể tác động
lên đối tượng Phiên bản hiện nay của ADO là 2.7, trong giáo trình này ta nghiên cứu ADO version 2.5, được cài đặt trong Windows 2000
Trang 3ADO 2.5 cung cấp 9 đối tượng : Command, Connection, Error, RecordSet, Parameter, Property, Field, Stream, Record Trong giáo trình này ta nghiên cứu 7 đối tượng đầu tiên liên quan trực tiếp đến cơ sở dữ liệu quan hệ Trong 7 đối tượng
trên cùng có chung tập hợp Properties
Mô hình đối tượng ADO 2.5
8.2.1 Đối tượng Connection
Đối tượng Connection cung cấp khả năng kết nối từ một ứng dụng đến một
cơ sở dữ liệu nào đó
Các thuộc tính
Attributes: Thiết lập hay trả về một hay nhiều thuộc tính của đối tượng connection
CommandTimeOut : Thiết lập hay trả về thời gian tối đa đợi một lệnh thực thi, mặc định là 30 giây, nếu vượt quá thời gian TimeOut thì lệnh sẽ bị hủy và phát sinh lỗi
ConnectionString : Thiết lập hay trả về chi tiết chuổi kết nối đến cơ sở dữ liệu Cú pháp: objConn.ConnectionString(Arg=value; ) Các đối số có thể là : Provider, FileName, URL, Remote Provider, Remote Server
ConnectionTimeOut : Thiết lập hay trả về thời gian đợi một kết nối được mở, mặc định là 15 giây
CursorLocation : Thiết lập hay trả về vị trí của cursor service (dùng để kiểm sóat điều hướng record, khả năng cập nhật dữ liệu) ở phía client hay server Cú pháp: objConn.CursorLocation = adUseServer | adUseClient
DefaultDatabase : Thiết lập hay trả về tên cơ sở mặc định của đối tượng connection
Provider : Thiết lập hay trả về tên của Provider trong đối tượng connection
State : Trả về giá trị mô tả tình trạng của đối tượng, mặc định là adStateClosed
Các giá trị khác : adStateOpen, adStateConnecting adStateExecuting và adState.Fetching
Các phương thức
Open/Close : Mở/Đóng kết nối
Trang 4Execute : Thực thi câu truy vấn
Cancel : Hủy bỏ một thực thi
BeginTrans : Bắt đầu một giao tác
CommitTrans: Lưu các thay đổi và kết thúc giao tác hiện hành
• Phương thức Open
Phương thức này dùng để mở một kết nối tới cơ sở dữ liệu, ngay sau khi tạo
ra một thể hiện của đối tượng kết nối, ta có thể truy cập đến cơ sở dữ liệu Cú pháp chung như sau:
‘ Tạo một thể hiện của đối tượng connection
Dim objConn
Set objConn = Server.CreateObject(“ADODB.Connection”)
‘ Mở kết nối
ObjConn.Open ConnectionString, [User], [Password] [Options]
Trong các ví dụ sau, ta giả sử rằng:
- Database Server tên : HOME
- Cơ sở dữ liệu có tên MyData (SQL)/ myData.Mdb(Access)
- DSN của cơ sở dữ liệu có alias là MyDSN
- User được phân quyền trên cơ sở dữ liệu có User ID: sa và Password
admin
Ta có thể tạo chuổi kết nối theo một trong 3 phương pháp :
Dùng OLE-DB connection string : kết nối trực tiếp đến cơ sở dữ liệu với tốc
độ nhanh, không phụ thuộc host nơi đặt ứng dụng web, đây là phương pháp nên dùng
Cơ sở dữ liệu MS-Access
Provider = Microsoft.Jet.OLEDB.4.0;_
DataSource=MapPath(‘myData.mdb’);_
User ID = sa; Password = admin
Cơ sở dữ liệu MS-SQL Server
Provider = SQLOLEDB; DataSource = HOME; Initial Catalog = MyData;_
User ID = sa; Password = admin; Network Library = dbmssocn
‘ Kết nối với giao thức TCP/IP
Riêng MS-SQL Server 2000 cho phép ta thực hiện kết nối theo sự cài đặt SQL Server với NT- authentication:
Provider = SQLOLEDB; DataSource = HOME; Initial Catalog = MyData;_
Trusted_Connection = yes;”
Cơ sở dữ liệu Oracle
Provider = MSDAORA.1; DataSource = HOME; Initial Catalog = MyData;_ User ID = sa; Password = admin
Dùng ODBC connection string : kết nối gián tiếp thông qua ODBC
• Dùng System DSN : DSN=MyDSN; UID=sa; PWD=admin
• Dùng trực tiếp Driver của cơ sở dữ liệu
Cơ sở dữ liệu MS-Access
Driver = {Microsoft Access Driver (*,mdb)}; _
Trang 5DBQ = Server.MapPath(“myData.mdb”)
Cơ sở dữ liệu MS-SQL Server
Driver = {SQL Server)}; Server=HOME; Database=MyData; _
UID=sa; PWD=admin
Cơ sở dữ liệu Oracle
Driver = {Microsoft ODBC for Oracle)}; Server=HOME; Database=MyData;_
UID=sa; PWD=admin
Chuổi kết nối như là một tham số cho phương thức Open của đối tượng Connection có khá nhiều cách khai báo Hiện tại, web site
www.connectionstrings.com đã cập nhật khá phong phú các phương pháp khai báo chuổi kết nối đến hàng trăm loại dữ liệu khác nhau Ta có bảng tham khảo sau:
1 MS Access 2000 Provider = Microsoft.Jet.OLEDB.4.0;Data Source =_
mydatabase.mdb;User Id = admin;Password =;
2 MS Access 2007 Provider = Microsoft.ACE.OLEDB.12.0;Data Source = _
myFoldermyAccess2007file.accdb;Persist Security Info=_ False;
3 SQL Server 2000 Provider = sqloledb;Data Source = myServerAddress; _
Initial Catalog = myDataBase; Integrated Security = SSPI;
4 SQL Server 2005 Provider = SQLNCLI; Server = myServerAddress;_
Database = myDataBase; Uid = myUsername;_
Pwd=myPassword;
5 MySQL Provider = MySQLProv; Data Source = mydb;User Id =_
myUsername; Password = myPassword;
6 Oracle Provider = OraOLEDB.Oracle; Data Source =_
MyOracleDB; User Id = myUsername; Password =_ myPassword;
7 DB2 Driver = {IBM DB2 ODBC DRIVER}; Database =_ myDataBase; Hostname = myServerAddress; Port = 1234;_
Protocol=TCPIP;Uid=myUsername;Pwd=myPassword;
8 MS Excel 2000 Driver={Microsoft Excel Driver (*.xls)};_
DriverId=790;Dbq=MyExcel.xls;DefaultDir=c:mypath;
9 MS Excel 2007 Provider = Microsoft.ACE.OLEDB.12.0; Data Source =_ myFoldermyExcel2007file.xlsx; Extended Properties =_
"Excel 12.0;HDR=YES";
Trang 6Sau khi mở kết nối, xử lý dữ liệu xong cần đóng kết nối và giải phóng tài nguyên của hệ thống bằng hai lệnh :
ObjConn.Close
Set ObjConn = Nothing
• Phương thức Execute
Phương thức này thi hành một câu lệnh SQL hay một Stored Procedure tác động lên cơ sở dữ liệu, kết quả trả về trên đối tượng Recordset Cú pháp:
ObjConn.Execute CommandText, RecordAffected, Options
Trong đó :CommandText : câu lệnh SQL, Stored Procedure hay Table trong
cơ sở dữ liệu
Ví dụ : Ta có thể sử dụng một trong hai cú pháp sau để truy vấn cơ sở dữ liệu
<%
Dim objConn, objRs, sqlText
Set objConn = Server.CreateObject(“ADODB.Connection”)
Set objRs = Server.CreateObject(“ADODB.Recordset”)
Set sqlText = “Select * from Customer”
objConn.Open “DSN=MyDSN”
‘ Phương pháp 1: sử dụng phương thức Open
objRs.Open sqlText, objConn
‘ Phương pháp 2: sử dụng phương thức Execute
‘ Set objRs = objConn.Exucute(sqlText)
‘
%>
Tập hợp Properties
Tập hợp Properties bao gồm các đối tượng Property của đối tượng
connection
Ví dụ :
roperties.asp
-<HTML><HEAD><TITLE> Properties</TITLE></HEAD>
<BODY>
<%
Dim objConn
Set objConn = CreateObject("ADODB.Connection")
objConn.Open "DSN=Customer; UID=sa; PWD"
For each item in objConn.Properties
Response.Write(item.name&":"&item.value&"<br>")
Next
objConn.close
set objConn=nothing
%>
</BODY></HTML>
Các sự kiện
Trang 7Trong mô hình đối tượng ADO, chỉ có hai đối tượng Connection và
Recordset mới có Event, tuy nhiên các ngôn ngữ lập trình VB, VC++ và VJ++ mới
có thể cho phép lập trình xử lý các sự kiện (handle event), do vậy trong giáo trình này ta không đề cập đến các event tương ứng cho hai đối tượng Connection và
Recordset khi lập trình với VBScript
8.2.2 Đối tượng Error
Đối tượng Error chứa các lỗi phát sinh trong quá trình truy cập và cập nhật
dữ liệu Mỗi đối tượng Error bao gồm các thông tin lỗi được lưu trữ trong tập hợp
Errors Trước khi sử dụng đối tượng Error ta phải tạo một thể hiện của đối tượng này Cú pháp :
Dim objErr
objErr = Server.CreateObject(“ADODB.Error”)
Các thuộc tính
Number : Số hiệu của lỗi
Description : Chi tiết của lỗi
Source : Nguồn gốc của lỗi
NativeError : Số hiệu lỗi do hệ quản trị cơ sở dữ liệu quy định
Tập hợp Errors
• Các thuộc tính :
Count : Số đối tượng Error có trong tập hợp Errors
Item : Một đề mục cho phép truy cập đến đối tượng Error cụ thể trong Errors
• Các phương thức:
Clear : Xóa tất cả thông tin trong đối tượng Error
Raise : Tự tạo thông báo lỗi
Ví dụ :
<%@ language = VBScript %>
<HTML><HEAD><TITLE> ADO Error </TITLE></HEAD>
<BODY>
<%
On error resume next
‘bỏ qua lỗi và tiếp tục lệnh tiếp theo
Dim objErr, objConn, objRs
Set objErr = Server.CreateObject(“ADODB.Error”)
Set objConn = Server.CreateObject(“ADODB.Connection”)
objConn.Open “DSN = MyAnotherDSN; UId=sa; Pwd=”
If objConn.Errors.Count>0
‘ Nếu có lỗi phát sinh
For each objErr in objConn.Errors
If (objErr.Number<>0) then
Response.Write objErr.Number & “<br>”
Response.Write objErr.Description & “<br>”
Response.Write objErr.Source & “<br>”
Response.Write objErr.SQLState & “<br>”
Response.Write objErr.NativeError & “<br>”
Trang 8End If Next
End if
objConn.Close
Set objErr = Nothing
Set objConn = Nothing
%>
</BODY></HTML>
Nhận xét : Tập hợp Errors là đối tượng con của đối tượng Connection, đối
tượng Errror là nột phần tử trong tập hợp Errors
8.2.3 Đối tượng Recordset
Đối tượng Recordset là đối tượng quan trọng nhất của ADO, đối tượng này dùng để truy xuất và cập nhật thông tin trong cơ sở dữ liệu Để sử dụng đối tượng Recordset phải tạo một thể hiện của đối tượng này Cú pháp:
Dim objRs
Set objRs = Server.CreateObject(“ADODB.Recordset”)
(Từ đây ta sử dụng biến đối tượng objRs trong toàn bộ các ví dụ)
ADO 2.5 cung cấp 25 thuộc tính và 25 phương thức cho đối tượng Recordset Dưới đây là các thuộc tính quan trọng và thông dụng
Các thuộc tính
Thuộc tính BOF : Trả về True nếu con trỏ mẫu tin nằm trước record đầu tiên của Recordset Ngược lại, ta có thuộc tính EOF
Thuộc tính RecordCount : Trả về số record của Recordset
Thuộc tính Sort : Thiết lập hay trả về một chuổi giá trị danh sách các field của Recordset để sắp xếp
Thuộc tính Source : Thiết lập hay trả về giá trị xác định nguồn dữ liệu cho Recordset
Các phương thức
Phương thức Open : Khi sử dụng đối tượng Recordset, điều đó có nghĩa
mở một con trỏ dùng để điều hướng các record Cú pháp :
objRs.Open Source, ActiveConnection, CursorType, LockType, Options
Trong đó:
Trang 9 Source là một trong các giá trị : tên table trong cơ sở dữ liệu, câu lệnh SQL, Stored Procedure hay View, đối tượng Command hay URL (chỉ đến đường
dẫn liên quan đến một Recordset lưu trữ dưới dạng tập tin)
ActiveConnection là cách truy cập đến cơ sở dữ liệu thông qua chuổi kết nối hay thông qua đối tượng Connection Ví dụ :
objRs.Open “myTable”, “DSN=MyData” ‘thông qua chuổi kết nối
objRs.Open “myTable”, objConn ‘thông qua đối tượng connection
CursorType là kiểu con trỏ mà cơ sở dữ liệu dùng khi mở Recordset Giá trị của CursorType được cho bởi các giá trị sau:
adOpenForwardOnly / 0 : đây là cursor mặc định, cho phép truy cập tuần tự các record trong Recordset
adOpenKeyset / 1: cho phép cập nhật các record nhưng không cho phép truy cập đến record được truy cập bởi người dùng khác
adOpenDynamic / 2: cho phép cập nhật các record ngay cả trong khi recordset được truy cập bởi người dùng khác, không hỗ trợ bookmark
adOpenStatic / 3 : Không cho phép cập nhật record khi nó được người sử dụng khác truy cập
LockType là kiểu khóa được sử dụng trong Recordset Các giá trị của LockType gồm các giá trị :
adLockReadOnly / 1 : Khóa mặc định, các record trong Recordset chỉ được phép đọc mà không dược phép cập nhật
adLockPessimistic / 2 : Cho phép cập nhật dữ liệu trên Recordset và sự thay đổi này có hiệu lực ngay trên Data Source
adLockOptimistic / 3 : được dùng khi sử dụng phương thức Update
adLockBatchOptimistic / 4 : được dùng khi cập nhật dữ liệu theo lô
Ví dụ :
<%
Dim adOpenForwardOnly = 0
Trang 10Dim adOpenReadOnly = 1
Dim strSQL = “select * from Customer”
Set objRs = Server.CreateObject(“ADODB.Recordset”)
objRs.Open strSQL, “DSN=MyDSN”, adOpenForwardOnly,
adOpenReadOnly
%>
Options là cách biên dịch tham số Source nếu Source không chứa trong đối tượng Command
Phương thức Support : Trả về giá trị boolean để kiểm tra đối tượng Recordset có cho phép Delete, Update, AdNew ? Cú pháp: objRs.Support(const)
Các hằng được chấp nhận bởi phương thức Support :
adAddNew, adApproxPosition, adBookmark, adDelete, adFind, adIndex, adHoldRecord, adMovePrevious, adNotify, adResync, adUpdate, adUpdateBatch, adSeek
Phương thức Seek : Tìm một record trong Recordset với Index, tốc độ tìm kiếm nhanh hơn phương thức Find Cú pháp:
objRs.Seek KeyValue [, SeekOption]
Phương thức Find : Tìm một record trong Recordset theo một điều kiện nào đó Cú pháp :
objRs.Find Criteria, SkipCurrent, SearchDirection, Start
Kết quả trả về trong thuộc tính EOF, nếu objRs.EOF = True thì không tìm ra, ngược lại tìm được mẫu tin
Trong đó :
Criteria : chuổi miêu tả record cần tìm
SkipCurrent : mặc định là True, bỏ qua record hiện hành
SearchDirection : Chiều tìm kiếm, mặc định là tìm kiếm tiến tới
Start : vị trí bắt đầu tìm kiếm, mặc định là record hiện thời
Ví dụ : objRs.Find “FieldName=’Thân Thị Tâm’”
Phương thức Filter : Lọc tất cả record trong Recorset thỏa mãn điều kiện nào đó Cú pháp: objRs.Filter condition
Ví dụ :
objRs.Open “Customer”, “DSN=MyData”
objRs.Filter “Ccode = ‘K01’”
Lưu ý : Phương thức Find và Filter ít khi sử dụng, thay vào đó là câu truy vấn SQL linh hoạt và mạnh hơn nhiều
Phương thức Move : cho phép di chuyển con trỏ mẫu tin đến một mẫu tin nào đó trong Recordset
Cú pháp : objRs.Move NumRecord, [Start]
Trong đó :
Nủmecord là số hiệu mẫu tin sẽ di chuyển đến kể từ vị trí hiện hành, số âm nếu lui , ngược lại số dương nếu di chuyển tới
Phương thức MoveFirst : cho phép di chuyển con trỏ mẫu tin đến mẫu tin đầu tiên trong Recordset Tương tự ta có phương thức MoveNext di chuyển con trỏ mẫu tin đến mẫu tin kế tiếp của mẫu tin hiện thời