ADO (ActiveX Data Object) được dùng để cung cấp khả năng kết nối và xử lí trên cơ sở dữ liệu. Ta có thể sử dụng ADO để kết nối với nguồn dữ liệu tương thích với OLE DB như cơ sở dữ liệu, bảng tính, tập tin tuần tự, … OLE DB là giao diện lập trình mức hệ thống cung cấp tập các giao tiếp COM chuẩn để khai thác các chức năng quản trị hệ cơ sở dữ liệu. Ngoài ra ta cũng có thể sử dụng ADO để truy xuất đến các cơ sở dữ liệu tương thích với ODBC.
Việc sử dụng ADO để truy cập và xử lí cơ sở dữ liệu trong các trang ASP có thể chia làm các bước chính sau:
• Kết nối với dữ liệu thông qua OLE DB hoặc ODBC
• Xây dựng câu truy vấn dữ liệu và yêu cầu thực hiện câu truy vấn để thực hiện các thao tác xử lí trên cơ sở dữ liệu như thêm, xóa, sửa, lọc dữ liệu, …
• Xử lí kết quả trả về từ câu truy vấn trong trường hợp câu truy vấn lọc dữ liệu (SELECT queries)
• Ngắt kết nối với cơ sở dữ liệu, giải phóng các tài nguyên của hệ thống đã dùng.
5.1. Kết nối với cơ sở dữ liệu 5.1.1. Tạo connection string
Giống như khi bạn muốn trò chuyện bằng điện thoại, bước đầu tiên là phải quay số điện thoại của người mà bạn cần trò chuyện. Để có thể xử lí dữ liệu, bước đầu tiên, bạn phải cung cấp các thông tin cần thiết để hệ thống biết bạn muốn truy cập tới cơ sở dữ liệu nào.
Một chuỗi kí tự gọi là connection string sẽ được dùng để lưu trữ các thông tin này, bao gồm:
• Thông tin về hệ quản trị cơ sở dữ liệu được dùng để quản lí cơ sở dữ liệu của bạn. Ví dụ đó là MS Access hoặc MS SQL hay Oracle, …
• Thông tin về vị trí của cơ sở dữ liệu của bạn. Ví dụ: nếu bạn dùng MS Access, bạn phải chỉ ra cơ sở dữ liệu của bạn được lưu trong tập tin .mdb nào.
Bảng sau liệt kê các OLE DB connection string cho một số hệ quản trị cơ sở dữ liệu thông dụng:
Lê Đình Duy - ĐH KHTN Tp. HCM Email: ledduy@ieee.org
Data Source OLE DB Connection String Microsoft®
Access
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=physical path to .mdb file Microsoft SQL
Server Provider=SQLOLEDB.1;Data Source=path to database on server
Oracle Provider=MSDAORA.1;Data Source=path to database on server
Microsoft Indexing Service
Provider=MSIDXS.1;Data Source=path to file
Bảng sau liệt kê các ODBC connection string cho một số hệ quản trị cơ sở dữ liệu thông dụng:
Data Source
Driver ODBC Connection String
Microsoft®
Access Driver={Microsoft Access Driver
(*.mdb)};DBQ=physical path to .mdb file Microsoft SQL
Server
DRIVER={SQL Server};SERVER=path to server
Oracle DRIVER={Microsoft ODBC for Oracle};SERVER=path to server Microsoft Excel Driver={Microsoft Excel Driver
(*.xls)};DBQ=physical path to .xls file;
DriverID=278 Microsoft Excel
97 Driver={Microsoft Excel Driver (*.xls)};DBQ=physical path to .xls file;DriverID=790
Paradox Driver={Microsoft Paradox Driver (*.db)};DBQ=physical path to .db file;DriverID=26
Text Driver={Microsoft Text Driver
(*.txt;*.csv)};DefaultDir=physical path to .txt file
Data Source
Driver ODBC Connection String
Microsoft Visual FoxPro®
(with a database container)
Driver={Microsoft Visual FoxPro
Driver};SourceType=DBC;SourceDb=physical path to .dbc file
Microsoft Visual FoxPro (without a database container)
Driver={Microsoft Visual FoxPro
Driver};SourceType=DBF;SourceDb=physical path to .dbf file
Ta cũng có thể dễ dàng xây dựng connection string bằng cách tạo Data Source Name trong ODBC.
Để đảm bảo tính hiệu quả và tin cậy, bạn nên dùng các hệ quản trị cơ sở dữ liệu kiểu client-server (client-server database engine) khi phát triển các ứng dụng web vì nó đòi hỏi số lượng kết nối đồng thời lớn. Mặc dù ADO hỗ trợ được các nguồn dữ liệu tương thích với OLE DB nhưng nó chủ yếu được thiết kế để làm việc tốt với các hệ quản trị cơ sở dữ liệu kiểu client-server như MS SQL, Oracle, … 5.1.2. Kết nối với cơ sở dữ liệu
ADO cung cấp đối tượng Connection để hỗ trợ cho việc tạo và quản lí kết nối với cơ sở dữ liệu cần xử lí. Các thuộc tính và phương thức của đối tượng này cho phép bạn mở, đóng kết nối, đồng thời cho phép thực hiện các câu truy vấn dữ liệu,
Để thiết lập kết nối với cơ sở dữ liệu bằng ADO, bạn thực hiện tuần tự các bước sau:
• Tạo một thể hiện của đối tượng Connection bằng lệnh:
Server.CreateObject(“ADODB.Connection”).
• Sử dụng phương thức Open để mở kết nối với cơ sở dữ liệu.
Tham số cho phương thức này là chuỗi connection string.
Ví dụ sau minh họa việc tạo kết nối đến cơ sở dữ liệu được lưu bằng MS Access:
Lê Đình Duy - ĐH KHTN Tp. HCM Email: ledduy@ieee.org
<%
strDSN = “Driver={Microsoft Access Driver (*.mdb)};DBQ=” &
server.mappath(“Test.mdb”)
'Create a connection object.
Set Conn = Server.CreateObject("ADODB.Connection") 'Open a connection using the ODBC connection string.
Conn.Open strDSN
%>
5.2. Xây dựng câu truy vấn và yêu cầu thực hiện
Cách đơn giản nhất để thực hiện các thao tác trên cơ sở dữ liệu là xây dựng các câu truy vấn SQL (SQL queries) và yêu cầu hệ thống thực hiện. Phương thức Execute do đối tượng Connection cung cấp cho phép thực hiện một câu truy vấn SQL.
Ví dụ sau minh họa việc thực hiện thêm một mẩu tin vào cơ sở dữ liệu
insert.asp
<%
strDSN = “Driver={Microsoft Access Driver (*.mdb)};DBQ=” &
server.mappath(“Test.mdb”) 'Create a connection object.
Set Conn = Server.CreateObject("ADODB.Connection") 'Open a connection using the ODBC connection string.
Conn.Open strDSN 'Define SQL statement.
strSQL = "INSERT INTO Customers (FirstName, LastName) VALUES ('Jose','Lugo')"
'Use the Execute method to issue a SQL query to database.
Conn.Execute strSQL
%>
Các lệnh như DELETE, UPDATE cũng được thực hiện theo cách tương tự. Ví dụ:
update.asp
<%
strDSN = “Driver={Microsoft Access Driver (*.mdb)};DBQ=” &
server.mappath(“Test.mdb”)
'Create a connection object.
Set Conn = Server.CreateObject("ADODB.Connection") 'Open a connection using the ODBC connection string.
Conn.Open strDSN 'Define SQL statement.
strSQL = "UPDATE Customers SET FirstName = 'Jeff' WHERE LastName = 'Smith' "
'Use the Execute method to issue a SQL query to database.
Conn.Execute strSQL
%>
delete.asp
<%
strDSN = “Driver={Microsoft Access Driver (*.mdb)};DBQ=” &
server.mappath(“Test.mdb”) 'Create a connection object.
Set Conn = Server.CreateObject("ADODB.Connection") 'Open a connection using the ODBC connection string.
Conn.Open strDSN 'Define SQL statement.
strSQL = "DELETE FROM Customers WHERE LastName = 'Smith'"
'Use the Execute method to issue a SQL query to database.
Conn.Execute strSQL
%>
Một số lưu ý khi xây dựng câu truy vấn cơ sở dữ liệu
• Dữ liệu kiểu chuỗi phải được đặt trong cặp dấu nháy đơn ‘ ’ vì cặp dấu nháy kép “ “ được dùng cho việc định nghĩa hằng chuỗi. Ví dụ: Để mô tả LastName sẽ lấy giá trị là chuỗi Smith, trong câu lệnh SQL ta dùng LastName=’Smith’.
• Các dữ trường dữ liệu có khoảng trắng ở giữa, trong câu lệnh SQL ta dùng cặp dấu []. Ví dụ, trong cơ sở dữ liệu của bạn có định nghĩa trường “Last Name”, trong câu lệnh SQL, ta dùng [Last Name]=’Smith’ chứ không dùng Last Name=Smith.
Lê Đình Duy - ĐH KHTN Tp. HCM Email: ledduy@ieee.org
5.3. Xử lí kết quả trả về từ câu truy vấn lọc dữ liệu 5.3.1. Lưu trữ dữ liệu trả về
ADO sử dụng đối tượng Recordset để lưu trữ kết quả trả về từ câu truy vấn lọc dữ liệu SELECT. Vì kết quả trả về của một câu truy vấn SELECT có thể có nhiều mẩu tin, cho nên có thể xem Recordset như là một mảng các mẩu tin.
Thông thường ta dùng 2 cách sau để lấy dữ liệu từ câu truy vấn vào biến Recordset
• Lấy kết quả trả về từ việc thực hiện câu truy vấn bằng phương thức Execute của đối tượng Connection. Ví dụ: Set rs = Conn.Execute (strSQL). Trong trường hợp này rs là thể hiện của đối tượng Recordset lưu trữ kết quả trả về từ việc thực hiện câu truy vấn strSQL.
• Tạo một thể hiện của đối tượng Recordset và sử dụng phương thức Open, kết hợp với thể hiện của đối tượng Connection đã tạo. Ví dụ:
<%
strDSN = “Driver={Microsoft Access Driver (*.mdb)};DBQ=” &
server.mappath(“Test.mdb”) 'Create a connection object.
Set Conn = Server.CreateObject("ADODB.Connection") 'Instantiate a Recordset object.
Set rsCustomers = Server.CreateObject("ADODB.Recordset") 'Open a recordset using the Open method
'and use the connection established by the Connection object.
strSQL = "SELECT FirstName, LastName FROM Customers WHERE LastName = 'Smith' "
rsCustomers.Open strSQL, Conn
%>
5.3.2. Hiển thị dữ liệu trả về Có ba vấn đề lưu ý:
• Để truy cập đến dữ liệu của một trường (field) của mẩu tin hiện hành, ta chỉ định tên của trường đó như là chuỗi kí tự khóa khi truy cập đến đối tượng Recordset. Ví dụ: để truy cập
đến dữ liệu của trường FirstName trong ví dụ trên ta dùng:
rsCustomers(“FirstName”)
• Để di chuyển đến các mẩu tin được lưu trong đối tượng Recordset, ta dùng phương thức MoveNext , MovePrevious, MoveFirst, MoveLast
• Để kiểm tra vị trí của con trỏ mẩu tin hiện hành là trước mẩu tin đầu hay sau mẩu tin cuối trong Recordset, ta dùng các thuộc tính BOF hoặc EOF để kiểm tra.
Ví dụ sau minh họa việc thể hiện dữ liệu từ biến Recordset theo dạng tuần tự:
<%
strDSN = “Driver={Microsoft Access Driver (*.mdb)};DBQ=” &
server.mappath(“Test.mdb”) 'Create a connection object.
Set Conn = Server.CreateObject("ADODB.Connection") 'Instantiate a Recordset object.
Set rsCustomers = Server.CreateObject("ADODB.Recordset") 'Open a recordset using the Open method
'and use the connection established by the Connection object.
strSQL = "SELECT FirstName, LastName FROM Customers WHERE LastName = 'Smith' "
rsCustomers.Open strSQL, Conn i = 1
do while not rsCustomers.EOF
Response.Write “Customer No” & i & “. ”
Response.Write rsCustomers(“FirstName”) & “ ” &
rsCustomers(“LastName”) & “<br>”
i = i+1
rsCustomers.MoveNext loop
%>
Kết quả thể hiện sẽ có dạng:
Customer No1. Michael Platini Customer No2. Dino Zoff Customer No3. Ruddi Voller
Lê Đình Duy - ĐH KHTN Tp. HCM Email: ledduy@ieee.org
5.4. Ngắt kết nối với cơ sở dữ liệu và giải phóng tài nguyên hệ thống đã dùng
Để ngắt kết nối với cơ sở dữ liệu, ta dùng phương thức Close có trong các đối tượng Connection và Recordset. Sau đó để giải phóng tài nguyên hệ thống đã dùng cho các đối tượng này, ta dùng lệnh gán giá trị Nothing cho các biến đối tượng này. Ví dụ:
<%
rsCustomers.Close
Set rsCustomers = Nothing Conn.Close
Set Conn= Nothing
%>
Đoạn chương trình sau tổng hợp các vấn đề đã học liên quan đến việc kết nối với cơ sở dữ liệu dùng trong ứng dụng web
<%
‘ Build connection string
strDSN = “Driver={Microsoft Access Driver (*.mdb)};DBQ=” &
server.mappath(“Test.mdb”) 'Create a connection object.
Set Conn = Server.CreateObject("ADODB.Connection") 'Instantiate a Recordset object.
Set rsCustomers = Server.CreateObject("ADODB.Recordset") 'Open a recordset using the Open method
'and use the connection established by the Connection object.
strSQL = "SELECT FirstName, LastName FROM Customers WHERE LastName = 'Smith' "
rsCustomers.Open strSQL, Conn i = 1
do while not rsCustomers.EOF
Response.Write “Customer No” & i & “. ”
Response.Write rsCustomers(“FirstName”) & “ ” &
rsCustomers(“LastName”) & “<br>”
i = i+1
rsCustomers.MoveNext loop
‘ Free resource
rsCustomers.Close
Set rsCustomers = Nothing Conn.Close
Set Conn= Nothing
%>
6. NHỮNG CÂU HỎI THƯỜNG GẶP