Hầu hết các ứng dụng Web động đều lưu trữ dữ liệu trong Database. Vì vậy các thao tác kết nối vào Database, xem, thêm, sửa, xóa dữ liệu trong các bảng là phần quan trọng đối với các ngôn ngữ lập trình web như ASP.
Chúng ta sẽ học các kỹ thuật sử dụng Asp để thao tác với dữ liệu trong Database thông qua kiến trúc ADO.
1. Sử dụng #INCLUDE
Trong trường hợp muốn trộn mã nguồn từ 1 file asp vào 1 file asp khác trước khi server thực thi nó, người ta dùng thẻ định hướng #include. Thông thường các nội dung trong file đó chứa các hàm và các biến toàn cục, các header, footer, hoặc những gì dùng chung cho nhiều trang.
Cú pháp:
<!--#include file= filename>
hoặc
<!--#include virtual= filename>
|
trong đó filename là tên của tập tin muốn include vào.
Từ khóa file để chỉ rằng đường dẫn đến tập tin là đường dẫn tương đối, đường dẫn này bắt đầu từ thư mục chứa tập tin. Còn từ khóa virtual để chỉ ra rằng đường dẫn đến tập tin bắt đầu từ thư mục ảo.
Ví dụ trong ứng dụng ASP có nhiều trang cần thao tác với database, chúng ta sẽ viết riêng module thao tác với database ra một file myConnection.asp, rồi include file này vào trang asp nào muốn thao tác với database
<!--#include file=“myConnection.asp"-->
<%
‘ mã nguồn
%>
|
Lưu ý là include file được thực hiện trước khi script chạy. Vì vậy đoạn lệnh sau đây là không hợp lệ:
<% filename=”myConnection.asp”%>
<!--#include file=“<%=filename%>"-->
2. Các cú pháp căn bản để truy xuất dữ liệu từ DB
Để thao tác với dữ liệu trong các bảng của DB, có 4 thao tác chính với câu lệnh SQL tương ứng như sau:
(Lấy ví dụ với một Database cụ thể Quanlyhocvien.mdb, trong đó có một bảng HosoHocVien (MaHV:text, Ten: text)
1.1 Lựa chọn
Lấy tất cả các bản ghi trong bảng:
“Select * from HosoHocVien”
|
Nếu lựa chọn có điều kiện:
“Select * from HosoHocVien where MaHV=’10’ “
|
Nếu chỉ lựa chọn một số trường trong bảng:
“Select Ten from HosoHocVien where MaHV=’10’ ”
|
2.2 Thêm dữ liệu vào bảng
“Insert into HosoHocVien values (‘001’,’Tran Van A’) “
|
2.3 Sửa dữ liệu
“Update HosoHocVien set Ten=’Tran Van B’ where MaHV=’001’ “
|
2.4 Xoá dữ liệu
“Delete from HosoHocVien where MaHV=’001’ “
|
Chúng ta có thể sử dụng các lệnh SQL phức tạp hơn để có được kết quả mong muốn như sử dụng các lệnh join, order by, group by, having...
3. Đối tượng Connection
Đối tượng Connection cho phép tạo kết nối đến một DB.
Các bước sử dụng Connection:
- Khai báo đối tượng Connection
- Khởi tạo
- Tạo chuỗi kết nối
- Mở Connection với chuỗi kết nối trên
- Sử dụng Connection
- Đóng và Hủy Connection
Ví dụ sau đây kết nối đến database Access QuanlyHocvien.mdb (database này nằm trong cùng thư mục với file Asp)
<%
dim conn ‘khai báo
set conn=server.createObject("ADODB.connection") ‘khởi tạo
stringconn="provider=microsoft.jet.OLEDB.4.0;data
source="&server.mappath("QuanlyHocVien.mdb")&";" ‘chuỗi kết nối
conn.open stringconn ‘mở connection
‘ các thao tác với DB sử dụng connection này
‘.......
conn.close ‘đóng connection
Set conn=nothing ‘hủy connection
%>
|
(chuỗi “stringconn=…” viết trên 1 dòng, trong đó: “… data source = …”chú ý có một dấu cách giữa “data” và “source”, chuỗi này chỉ đúng với Access)
4. Đối tượng Recordset
Đối tượng Recordset thường dùng để xem, thêm, sửa, xóa các bản ghi trong bảng dữ liệu của Database. Nó trỏ đến tập hợp các bản ghi là kết quả trả về từ câu lệnh select.
Các bước sử dụng đối tượng Recordset :
- Khai báo đối tượng Recorset
- Khởi tạo
- Tạo sql query
- Mở Recordset với chuỗi sql query và connection đã mở
- Sử dụng Recordset
- Đóng và Hủy Recordset
Ví dụ sau đây cho phép lấy các bản ghi trong bảng và hiển thị ra ngoài trang web.
<%
Dim rs ‘ khai báo Recordset
set rs=server.createObject("ADODB.Recordset") ‘Khởi tạo
SQLstring="select * from HosoHocVien" ‘SQL query
rs.open SQLstring ,conn ‘Mở Recordset
‘ dùng vòng lặp để hiển thị toàn bộ các bản ghi ra màn hình
do while not rs.EOF
response.write RS(“MaHV”)
response.write RS(“Ten”)
response.write “<BR>”
rs.movenext ‘dịch con trỏ rs tới bản ghi tiếp theo
loop
rs.close ‘đóng recordset
set rs=nothing ‘hủy recordset
%>
|
Chúng ta có thể kết hợp giữa script và thẻ html để dữ liệu được hiển thị ra ngoài trang web với giao diện theo ý muốn :
<table border="1">
<tr>
<td>MA HOC VIEN</td>
<td>TEN</td>
</tr>
<%do while not rs.eof%>
<tr>
<td ><%=rs("MaHV")%></td>
<td ><%=rs("Ten")%></td>
</tr>
<%rs.movenext
loop
rs.close
%>
</table>
|
Sau đây là một ví dụ hoàn chỉnh liệt kê các user trong bảng tblUser ra trang web:
Connection.asp
<%
dim conn
Sub openConn()
set conn=server.createobject("adodb.connection")
connstr="provider=microsoft.jet.oledb.4.0;
data
source="&server.mappath("myDB.mdb")&";"
conn.open connstr
End Sub
Sub destroyConn()
conn.close
set conn=nothing
End Sub
%>
|
ListUser.asp
<!--#include file ="Connection.asp"-->
<%openConn
set rs = server.createobject("ADODB.Recordset")
rs.open "select * from tblUser", conn%>
<table border="1" width="200">
<tr><td>ID</td><td>Username</td><td>Address</td>
<% do
while not rs.EOF
<tr>
<td><%=rs("id")%></td>
<td><%=rs("username")%></td>
<td><%=rs("address")%></td>
</tr>
<% rs.movenext
loop
rs.close
destroyConn%>
</table>
|
5. Thêm sửa xóa dữ liệu trong DB:
Với một connection đã mở chúng ta có thể dùng nó để thực thi câu lệnh SQL dạng insert, update, delete:
Thêm dữ liệu:
<%Conn.execute “Insert into HosoHocvien values(‘001’,’Tran Van A’)”%>
|
Sửa dữ liệu:
<%
Conn.execute "Update HosoHocVien set Ten=’Tran Van B’ where MaHV=’001’ “
%>
|
Xoá dữ liệu:
<%Conn.execute “Delete from HosoHocVien where MaHV=’001’ “ %>
|
Ngoài ra chúng ta có thể dùng Recordset để thêm, sửa, xóa dữ liệu trong database bằng cách duyệt qua tập hợp các bản ghi trong bảng
Thêm dữ liệu:
<%
Dim RS
set rs=server.createObject("ADODB.recordset")
SQLstring="select * from HosoHocVien"
rs.open SQLstring ,conn,3,2
‘rs.open SQLstring ,conn,adOpenStatic,adLockPessimistic
rs.addnew
‘Thêm một bản ghi
rs(“MaHV”)=”001”
‘ gán giá trị cho các trường của bản ghi
rs(“Ten”)=”Tran Van A”
rs.update
‘ Xác nhận thêm xong
rs.close
‘đóng recordset
%>
|
Sửa:
<%
Set rs=server.createObject("ADODB.recordset")
‘Khởi tạo
SQLString="select * from HosoHocVien where ma=’001’
‘ lấy ra bản ghi cần sửa
rs.open SQLString ,conn,3,2
rs(“Ten”)=”Tran Van B”
‘sửa lại giá trị trường “Ten”
rs.update
‘ xác nhận sửa xong
rs.close
‘đóng recordset
%>
|
Xóa:
<%
Set rs=server.createObject("ADODB.recordset")
‘Khởi tạo
SQLString="select * from HosoHocVien where MaHV=’001’ "
‘Câu lệnh
SQL lấy ra đúng bản ghi cần xóa
rs.open SQLString ,conn,3,2
rs.delete
‘xóa bản ghi này
rs.close
‘đóng recordset
%>
|
6. Tìm kiếm dữ liệu trong database
Để tìm kiếm dữ liệu trong bảng của Database chúng ta dựa vào câu lệnh SQL:
“select * from Tenbang where Tencot like ‘%giatri%’ “
|
Ví dụ đoạn chương trình sau cho phép hiển thị những Sinh Viên trong bảng “HosoHV” của DB “Sinhvien.mdb” có tên được tìm kiếm bởi từ khoá “Anh” (Ví dụ : Tuấn Anh, Vân Anh, Việt Anh...)
<%
set conn=server.createobject("adodb.connection")
connstring="provider=microsoft.jet.oledb.4.0;data
source="&server.mappath("sinhvien.mdb")&";"
conn.open connstring
set rs=server.createobject("adodb.recordset")
rs.open "select * from HosoSV where ten like '%Anh%' ",conn
do while not rs.eof
response.write rs("MaSV")
response.write " "
response.write rs("Ten")
response.write " "
response.write rs("Lop")
response.write "<BR>"
rs.movenext
loop
rs.close
%>
|
Thông thường người sử dụng nhập từ khoá cần tìm kiếm vào một trường của form. như vậy ta chỉ việc dùng lệnh request.form để lấy lại từ khoá cần tìm kiếm và đưa vào câu lệnh SQL ở trên. Chẳng hạn người sử dụng nhập từ khoá cần tìm vào trường “Ten” trong form thì chúng ta sẽ mở bảng bằng câu lệnh SQL sau:
<% ten=request.form(“Ten”)
‘validate
rs.open "select * from HosoSV where Ten like '%”&ten&”%' ",conn
‘... %>
|
Nếu không tìm thấy bản ghi nào thì giá trị rs.EOF sẽ true.
<%
If rs.eof then response.write “Không tìm thấy kết quả nào”
%>
|
7. Phân trang
Trong nhiều trường hợp do kết quả câu lệnh “select ....” trả về quá nhiều bản ghi, nếu chúng ta hiển thị tất cả trên cùng 1 trang web thì sẽ bất tiện trong việc đọc chúng, khi đó người ta tiến hành phân nó ra để hiển thị thành nhiều trang, đây gọi là kỹ thuật phân trang. So với cách đọc và hiển thị dữ liệu thông thường, thì phân trang đòi hỏi phải thiết lập thêm một số thuộc tính:
- Số bản ghi cần hiển thị trên một trang RS.PageSize
- Trang nào đang được hiển thị: RS.AbsolutePage,
- Khi mở Recordset đòi hỏi phải thêm các tham số CursorType và
- LockType :rs.open SQLstring ,conn,3,3
- Vòng lặp hiển thị dữ liệu cần có cơ chế đảm bảo nó chỉ chạy đúng số
- bản ghi trên một trang (rs.pagesize) là phải thoát khỏi vòng lặp.
Ví dụ để hiển thị bảng HosoHocVien với yêu cầu chỉ hiển thị 4 bản ghi/1 trang:
Home.asp
<%
dim x
‘biến này dùng để xác định xem cần hiển thị trang nào
x=request.querystring(“PageNumber”)
‘nhận lại PageNumber khi người
dùng nhấn vào các nút “Trước” và “Tiếp”
if x=”” then
‘đầu tiên sẽ hiển thị trang 1
x=1
end if
dim conn
set conn=server.createObject("ADODB.connection")
stringconn="provider=microsoft.jet.OLEDB.4.0;data
source="&server.mappath("QuanlyHocVien.mdb")&";"
conn.open stringconn
Dim RS
set rs=server.createObject("ADODB.recordset")
SQLstring="select * from HosoHocVien"
rs.pagesize= 4 ‘chỉ hiển thị 4 bản ghi/1 trang
rs.open SQLstring ,conn,3,3
rs.AbsolutePage=x
‘trang cần hiển thị
dem=0
‘biến này để đảm bảo vòng lặp chỉ thực hiện tối đa 4 lần lặp
do while not rs.EOF and dem<rs.pagesize
response.write RS(“MaHV”)
response.write RS(“Ten”)
response.write “<BR>”
dem=dem+1
rs.movenext
loop
%>
<% ‘Hiển thị nút “Trước”
if x>1 then
%>
<a href=”home.asp?pageNumber=<%=x-1%>”>Trước</a>
<%end if%>
<% ‘Hiển thị nút “Tiếp”
if not RS.EOF then
%>
<a href=”home.asp?pageNumber=<%=x+1%>”>Tiếp</a>
<%end if
rs.close ‘đóng recordset
%>
|
_______________________________-!- -!- -!-________________________________