Đối tợng RecordSet

Một phần của tài liệu Bài giảng về lập trình mạng (Trang 137)

I. File Global.asa

2. Mô hình đối tợng ADO

2.2. Đối tợng RecordSet

Là đối tợng sử dụng thờng xuyên trong ADO. Cung cấp kết quả trả về từ câu lệnh truy vấn một tập các mẩu tin. Trang ASP có thể dùng vòng lặp để duyệt qua các mẩu tin này và hiển thị dữ liệu kết xuất ra trang Web phía trình duyệt. Ngoài ra RecordSet còn cho phép thực hiện lọc dữ liệu từ tập các mẩu tin, truy xuất đến từng trờng cụ thể của mẩu tin thông qua đối tợng Field hoặc danh sách các tr- ờng trong mẩu tin thông qua đối tợng Fields.

* Khai báo đối tợng

Tơng tự nh đối tợng Connection, khi có nhu cầu lấy dữ liệu là một giá trị hay một mẫu tin, ta sử dụng phát biểu để khai báo đối tợng RecordSet với cú pháp:

Dim myRs

* Khởi tạo đối tợng

Sau khi khai báo, ta có thể khởi tạo đối tợng này bằng phát biểu Set và phơng thức CreateObject của đối tợng Server nh sau

Set myRst=CreateObject("ADODB.RecordSet")

hay Set

myRst=Server.CreateObject("ADODB.RecordSet")

* Mở tập dữ liệu

Để mở tập điều khiển ứng với phát biểu SQL dạng Select, Table, View, Query hay thủ tục nội tại của SQL Server có giá trị trả về, ta sử dụng phơng thức Open với khai báo nh sau:

myRst.Open "Phát biểu SQL", myCon, CursorType, LockType

Trong đó

myCon là đối tợng kết nối đã mở ứng với CSDL nào đó.

Hai tham số tuỳ chọn CursorType (mặc định adOpenForwardOnly), LockType (mặc định là adLockReadOnly) ứng với kiểu con trỏ và loại khoá dữ liệu. - Giá trị của CursorType

adOpenDynamic (tơng đơng với hằng số 2): Khi khai báo hằng số này, ứng với con trỏ (cursor) động, ngời sử dụng khác có thể thay đổi, xoá và di chuyển trên mẫu tin mà ta đang mở ngoại trừ bookmark.

adOpenForwardOnly (tơng đơng hằng số 0) đây là giá trị mặc định, khi khai báo hằng số này, con trỏ chỉ di chuyển một chiều. Đối với trờng hợp mở tập dữ liệu mà không điều hớng (navigation) trên mẩu tin, ta nên sử dụng tuỳ chọn với giá trị này.

adOpenKeyset (tơng đơng hằng số 1): Tơng tự nh adOpenDynamic nhng không cho phép ngời sử dụng khác thêm hay xoá hoặc sửa mẩu tin.

adOpenStatic (tơng đơng với hằng số 3): Đây là dạng con trỏ tĩnh, nghiêm cấm thay đổi, xoá mẩu tin từ ngời sử dụng khác. - Giá trị của LockType

adLockBatchOptimistic (tơng đơng với hằng số 4): Yêu cầu cập nhật tập dữ liệu theo đó.

adLockOptimistic (tơng đơng với hằng số 3): Không cho phép cập nhật mẩu tin khi gọi phơng thức Update.

adLockReadOnly (tơng đơng với hằng số 1): Chỉ cho phép đọc.

Chẳng hạn, đối tợng với trờng hợp này chúng ta tìm hiểu ví dụ sử dụng đối tợng RecordSet để mở bảng dữ liệu giaovien nh sau:

Ví dụ 2.3. Mở bảng dữ liệu. <html>

<head>

<title> Welcome to ADO and ASP 3.0 </title>

</head> <body> <h4>RecordSet</h4> <% Dim myCon,strCon strPath=request.ServerVariables("APPL_PHYSICAL_PATH" ) strCon="Provider=Microsoft.Jet.OLEDB.4.0;" &_ "Data Source= "& strPath

&"\DATABASE\BTTNCD.mdb"

Set myCon=CreateObject("ADODB.Connection") Set myRst=CreateObject("ADODB.RecordSet") myCon.Open strCon

if myCon.State=1 then

Response.Write "Ket noi duoc : " else

Response.Write "Khong ket noi duoc.." end if

strSQL="Select * from giaovien" myRst.Open strSQL , myCon

Response.Write "Existing records" else

Response.Write "Record not found" end if myRst.Close myCon.Close Set myRst=Nothing Set myCon=Nothing %>

<hr size=1 color=red> </body>

</html>

* Xử lý dữ liệu

Sau khi mở tập mẩu tin với các tuỳ chọn trên, tuỳ thuộc vào loại cursor mà ta có thể thêm, xoá, cập nhật hay di chuyển trên từng mẩu tin.

Đối tợng RecordSet cung cấp các phơng thức và thuộc tính cho phép duyệt hay xử lý dữ liệu trong tập dữ liệu đang nắm giữ bởi đối tợng này.

EOF: trả về giá True nếu cursor đang nằm sau mẩu tin cuối cùng. Trong trờng hợp đối tợng RecordSet không nắm giữ mẩu tin nào, thuộc tính này có giá trị là True, ngợc lại có giá trị là False.

Ví dụ, ta kiểm tra mẩu tin trong đối tợng RecordSet có tồn tại hay không nh sau:

if Not myRst.EOF then Tồn tại

else

Không tồn tại end if

BOF: Trả về giá trị True nếu cursor đang nằm trên mẩu tin đầu tiên. Trong trờng hợp đối tợng RecordSet không nắm giữ mẩu tin nào, thuộc tính này sẽ có giá trị là True, ngợc lại có giá trị là False.

Ví dụ, ta kiểm tra mẩu tin trong đối tợng RecordSet có tồn tại hay không nh sau:

if myRst.BOF then Tồn tại

else

Không tồn tại end if

Fields("Fieldname"): Gán hay lấy giá trị của cột trong bảng dữ liệu.

Ví dụ: myRst.Fields("MaGV")="NHA"

RecordCount: Trả về giá trị là tổng số mẩu tin đang có trong đối tợng RecordSet với loại cursor động.

Ví dụ, ta lấy số mẩu tin trong đối tợng RecordSet nh sau

Dim i

i=myRst.RecordCount

MoveLast: Di chuyển cursor đến mẩu tin cuối cùng.

MoveNext: Di chuyển cursor đến mẩu tin kế tiếp.

MovePrevious: Di chuyển cursor đến mẩu tin trớc đó.

Ví dụ: Duyệt qua các mẫu tin và truy xuất vào các trờng cuả mẫu tin

Do While not rs.eof

Rs [.fields](“field_name”) rs.movenext

loop

rs.close

Các cách truy cập hợp lệ và tơng đơng: Rs(“field_name”)

Rs.fields(“field_name”)

Rs.fields(“field_name”).value Rs(1).value

Rs.fields(1).Value

Nếu muốn duyệt qua tất cả các trờng trong mẩu tin ta có thể dùng lệnh:

For each Fld in rs.fields

Response.write fld.name + “:” + fld.value + “<br>”

Next

Có thể lọc qua các mẫu tin trong RecordSet

Có thể sử dụng mệnh đề Where của câu lệnh Select hoặc có thể sử dụng thuộc tính Filter của RecordSet để chỉ định điều kiện lọc sau khi đã trích xuất dữ liệu. Ví dụ:

sqlStr=”Select * from Products” rs.open sqlStr,conn

rs.filter= “ productCode=’” & SpecialCode & “’”

Thuộc tính Filter cho phép sử dụng mệnh đề lọc gần giống với mệnh đề Where

PageSize: Thuộc tính này cho phép gán hay đọc số mẩu tin trình bày trên một trang. điều này có nghĩa là khi ta có nhiều mẩu tin muốn trình bày, bằng cách sử dụng thuộc tính này để yêu cầu kết xuất số mẩu tin chỉ định, ví dụ 10 mẩu tin/1trang.

PageCount: Thuộc tính này trả về số trang đợc tính dựa trên thuộc tính PageSize, chẳng hạn tổng số mẩu tin có trong đối t- ợng RecordSet là 153 mẩu tin, nếu ta khai báo thuộc tính PageSize là 15 (15 mẩu tin/1trang), khi đó thuộc tính PageCount sẽ tả về 11 trang.

Có thể phân trang với đối t ợng RecordSet

Đối tợng RecordSet cung cấp 3 thuộc tính quan trọng sau để sử dụng phân trang:

PageSize: Kích thớc mẩu tin trong một trang

PageCount: Tổng số trang RecordSet truy vấn đợc

AbsolutePage: Chỉ định trang hiện hành đang cần đợc đọc Để RecordSet có khả năng phân trang, cần thiết lập thêm tham số cho RecordSet trớc khi thực hiện truy vấn:

Rs.CursorLocation=3 ‘ Có thể sử dụng hằng adUseClient

Rs.PageSize=15 ‘ 15 bản ghi trong một trang Tiếp theo mở đối tợng RecordSet truy vấn dữ liệu với tuỳ chọn là các hằng adOpenForwardOnly(0), adLockReadOnly (1) truy vấn cho phơng thức Open nh sau:

Rs.open sqlStr, Conn, 0,1

Công việc sau cùng là định vị trang thông qua thuộc tính AbsolutePage. Ta lu lại vị trí hiện hành của trang dữ liệu

thông qua giá trị chứa trong thẻ <input hidden>. Giá trị này sẽ đợc chuyển về trình chủ mỗi khi ngời dùng kích vào.

Xét ví dụ sau:

<%sqlStr="SELECT * FROM Products " ' page navigate session here ...

Dim lCurrentPage Dim lPageCount lCurrentPage = CLng(Request("page")) If lCurrentPage < 1 Then lCurrentPage = 1 End If rs.CursorLocation = 3 rs.PageSize = 15

rs.Open sqlStr, conn, 0, 1 'Const

adOpenForwardOnly=0,adLockReadOnly = 1 lPageCount = rs.PageCount

If lCurrentPage > lPageCount Then lCurrentPage = lPageCount

End If

if not rs.eof then

rs.AbsolutePage = lCurrentPage end if

call

ShowPageNavigation(lCurrentPage,lPageCount)

Do While rs.AbsolutePage = lCurrentPage And Not rs.Eof

Response.write rs("ProductName")

rs.movenext loop

%>

<form name="viewFrm">

<input type=hidden name=page> </form>

<%

Sub ShowPageNavigation (lCurrentPage,lPageCount) If lCurrentPage <> 1 AND lCurrentPage <> 0 Then

%>

<A HREF="javascript:setValue('<%= lCurrentPage - 1 %>');">Previous

<% Else %> Previous

<% End If%>

<A HREF="javascript:setValue('<%= lCurrentPage + 1%>');">Next

<% Else %> Next

<% End If%><BR>Page<B><%= lCurrentPage%></B> <%= lPageCount%>

<%End Sub %>

<script language=javascript> function setValue(page){

viewFrm.page.value= page; viewFrm.submit();

}

</script>

CursorLocation: Là loại cursor (mặc định là adUseServer) áp dụng cho đối tợng RecordSet khi mở tập tin, nếu giá trị gán là adUseClient, cursor thực hiện phía trình khách.

AddNew: Thêm mẩu tin mới vào bảng dữ liệu quản lý bởi phơng thức RecordSet.

Update: Cập nhật mẩu tin vào dữ liệu nguồn. Ví dụ

sqlStr=”Select * From Accounts” rs.open sqlStr,Conn

‘ Thêm tài khoản mới vào bảng Accounts

rs.Addnew

‘gán giá trị cho mẩu tin

with rs

.fields(“username”)= ‘New User’ .fields(“password”)=’***’

end with

‘lu lại

rs.update

Chỉnh sửa nội dung trong mẩu tin hiện hành

sqlStr=”Select * From Accounts” rs.open sqlStr,Conn

with rs

end with

‘lu lại

rs.update

Delete: Xoá mẩu tin hiện hành trong RecordSet tự động xoá mẩu tin trong dữ liệu nguồn.

sqlStr=”Select * From Accounts where username= ‘” &mkuser &”’”

rs.open sqlStr,Conn rs.delete

* Đóng tập dữ liệu

Sau khi kết thức quá trình làm việc trên đối tợng RecordSet, ta sử dụng phơng thức close để đóng đối tợng.

myRst.Close * Giải phóng đối tợng

Tơng tự nh đôí tợng Connection, khi không có nhu cầu mở tiếp tập mẩu tin khác, ta nên sử dụng phát biểu Set để giải phóng bộ nhớ cấp cho đối tợng này nh sau:

Set myRst=Nothing 2.3. Đối tợng Command

Đối tợng này dùng cho mục đích thực thi câu lệnh tốt hơn Connection. Cho phép ta chuyển tham số vào các lệnh thực thi SQL. Tham số có thể chỉ định kiểu hoặc giá trị tờng minh. Các tham số có thể nhận trị trả về sau khi thực thi... Command có thể dùng cho cả 2 mục đích: thực thi câu lệnh SQL không cần nhận kết quả trả về nh Insert, Update, Delete, Procedure Store, hoặc thực thi các lệnh trả về tập RecordSet nh lệnh Select.

* Tạo đối tợng Command set

cmdUpdate=Server.CreateObject(“ADODB.Comma nd”)

sqlUpdate=”update accounts set password =’abc’ where

username= ‘” & username & “’”

cmdUpdate.ActiveConnection=strConn cmdUpdate.CommandText=strUpdate cmdUpdate.CommandType=adcmdText cmdUpdate.Execute

Đối tợng Command cũng đợc dùng để nhận kết quả trả về từ câu lệnh Select hoặc từ một tên bảng dữ liệu, ví dụ để lấy toàn bộ nội dung bảng dữ liệu Accounts, ta chỉ cần chỉ ra tên bảng và mở RecordSet dựa vào đối tợng Command:

cmdTable.ActiveConnection=strConn cmdTable.CommandText=”Accounts” cmdTable.CommandType=adCmdTable rs.open cmdTable

3. Làm việc với dữ liệu Access3.1. Liệt kê dữ liệu Access 3.1. Liệt kê dữ liệu Access

Để liệt kê mẫu tin trong CSDL Access chúng ta sử dụng một số thuộc tính RecordCount, Fields, EOF và các phơng thức nh: MoveNext, MoveFirst, MovePrevious và MoveLast của đối tợng RecordSet.

Ví dụ 3.1. Liệt kê dữ liệu Access <html>

<head>

<title> Welcome to Access and ASP 3.0 </title>

<!-- Sử dụng Style trong tập tin Style Sheet -->

<LINK href="../style.css" rel=stylesheet>

<!-- Trỡnh bày dữ liệu Unicode -->

<META http-equiv=Content-Type content="text/html; charset=utf-8">

<body>

<h4>Danh sỏch giỏo viờn hướng dẫn</h4>

<table width=450 cellspacing=2 cellpadding=2> <tr class=text>

<td colspan=4><hr size=1 color=red></td> </tr> <tr class=text> <td><b>Mó giỏo viờn</b></td> <td><b>Tờn giỏo viờn</b></td> <td><b>Học hàm</b></td> <td><b>Học vị</b></td> </tr> <tr class=text>

<td colspan=4><hr size=1 color=red></td> </tr>

<%

Session.CodePage=65001

Dim myCon, myRst, strCon, strSQL, i

Set myCon= CreateObject("ADODB.Connection") Set myRst=CreateObject("ADODB.RecordSet")

strPath=request.ServerVariables("APPL_PHYSICAL_PATH" )

strCon="Provider= Microsoft.Jet.OLEDB.4.0; Data Source= " & strPath &_

"\DATABASE\BTTNCD.mdb"

myCon.Open strCon

myRst.CursorLocation=3

strSQL="Select * from giaovien " myRst.Open strSQL, myCon, 0 ,3 i=myRst.RecordCount

Do Until myRst.EOF %>

<td><%=myRst("TenGV")%></td> <td><%=myRst("MaHH")%></td> <td><%=myRst("MaHV")%></td> </tr> <% myRst.MoveNext Loop myRst.Close myCon.Close Set myRst=Nothing Set myCon=Nothing %> </table>

<hr size=1 color=red> </body>

Nếu ta muốn liệt kê danh sách mẫu tin trong bảng GIAOVIEN theo tiểu ban, tức là phụ thuộc vào giá trị Tiểu ban muốn hiển thị đợc chọn trên màn hình.

Ví dụ 3.2. Hiển thị danh sách giáo viên theo tiểu ban <%

Session.CodePage=65001

Dim myCon, myRst, strCon, strSQL, i, strCate,MaTB MaTB=Request.Form("MaTB")

Set myCon= CreateObject("ADODB.Connection") Set myRst=CreateObject("ADODB.RecordSet") strPath=request.ServerVariables( _

"APPL_PHYSICAL_PATH") strCon="Provider=" & _

"Microsoft.Jet.OLEDB.4.0;" & _ "Data Source= " & strPath & _ "\Database\BTTNCD.mdb"

myCon.Open strCon

myRst.CursorLocation=3

strCate="<option value=''>All </option>" strSQL="Select * from tieuban"

myRst.Open strSQL, myCon, 0 ,3 Do Until myRst.EOF

strCate=strCate & "<option value='" & myRst("MaTB") & "' "

if Trim(myRst("MaTB"))=MaTB then strCate=strCate & " selected" End If

strCate=strCate & ">" & myRst("TenTB") & "</option>" myRst.MoveNext Loop myRst.Close %> <html> <head>

<LINK href="../style.css" rel=stylesheet> <META http-equiv=Content-Type

content="text/html; charset=utf-8"> </head>

<body>

<h4>Danh sỏch tiểu ban</h4>

<table width=450 cellspacing=2 cellpadding=2> <form action=dstban.asp method=post name=form1>

<tr class=text>

<td nowrap>Tiểu ban cần hiện thời:</td> <td><select name=MaTB

onchange="document.form1.submit();"> <%=strCate%>

</select></td>

<td><input type=submit value="Xem"></td> </tr>

</form> </table>

<table width= 600 cellspacing=2 cellpadding=2> <tr class=text>

<td colspan=4 width="600"><hr size=1 color=red></td>

</tr>

<tr class=text>

<td width="130"><b> Tờn giỏo viờn </b></td> <td width="60"><b>Học hàm </b></td>

<td width="60"><b> Học vị </b></td>

<td width="130"><b> Vai trũ trong TB</b></td> </tr>

<tr class=text>

<td colspan=4 width="600"><hr size=1 color=red></td>

</tr> <%

strSQL="Select * from giaovien" If maTB<>"" then

strSQL=strSQL & " Where MaTB='"& MaTB & "'" End If

myRst.Open strSQL, myCon, 0 ,3 i=myRst.RecordCount Do Until myRst.EOF %> <tr class=text> <td width="130"><%=myRst("TenGV")%></td> <td width="60"><%=myRst("MaHH")%></td> <td width="60"><%=myRst("MaHV")%></td> <td width="130"><%=myRst("CVTB")%></td> </tr> <% myRst.MoveNext Loop myRst.Close myCon.Close Set myRst=Nothing Set myCon=Nothing if i=0 then %> <tr class=text>

<td colspan=4 align=center width="440">Item not found!</td>

</tr>

<%End If%>

<td colspan=4 width="600"><hr size=1 color=red></td>

</table>

<% Response.Write(MaTB)%> </body>

3.2. Thêm, cập nhật, xóa dữ liệu Access

Cơ sở dữ liệu nói chung và CSDL Access nói riêng đều sử dụng phát biểu SQL để thêm, cập nhật hay xoá mẫu tin.

3.2.1. Thêm và cập nhật mẫu tin

Để thêm mẫu tin vào bảng dữ liệu hay cập nhật mẫu tin của CSDL Access, ta có thể sử dụng phơng thức Execute của đối tợng connection để thực thi phát biểu SQL dạng Insert, Update hay hai phơng thức Addnew và update của đối tợng RecordSet.

Để cho phép ngời sử dụng thêm mới mẫu tin vào bảng giáo viên (giaovien), ta xây dựng trang Addgvien.asp liệt kê danh sách các giáo viên đang có, dới có các nút Addnew (addnew.asp) và Delete nh sau:

Ví dụ 3.2.1. Liệt kê danh mục các giáo viên (trang Addgvien.asp) <html>

<head>

<title> Welcome to Access and ASP 3.0 </title> <LINK href="../style.css" rel=stylesheet>

<META http-equiv=Content-Type content="text/html; charset=utf-8">

</head> <body>

<h4> Danh sỏch giỏo viờn hướng dẫn</h4> <table width=700 cellspacing=2 cellpadding=2

height="119">

<tr class=text>

<td colspan=5 width="700"><hr size=1 color=red></td></tr>

<tr class=text><td width="28" ><b>#</b></td> <td width=130><b>Tờn giỏo viờn</b></td> <td width="70" ><b>Điện thoại </b></td> <td width="100" ><b>Thời gian gặp </b></td> <td width="200" ><b>Địa điểm </b></td></tr>

<form action=delete.asp method=post>

<tr class=text><td colspan=5 width="700" > <hr size=1 color=red></td></tr>

<%

Session("isSave")=""

Session.CodePage=65001

Dim myCon, myRst, strCon, strSQL, i

Set myCon= CreateObject("ADODB.Connection")

Set myRst=CreateObject("ADODB.RecordSet") <!—Lấy địa chỉ vật lý của ứng dụng -->

strPath=request.ServerVariables("APPL_PHYSICAL_PATH") strCon="Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & strPath &_

"\Database\BTTNCD.mdb" <!—Mở kết nối CSDL-->

myCon.Open strCon

myRst.CursorLocation=3

strSQL="Select * from giaovien where HD=Yes order by TenGV"

myRst.Open strSQL, myCon, 0 ,3

i=myRst.RecordCount

Do Until myRst.EOF %>

<tr class=text> <!-- Khai bỏo nỳt Checkbox cho phộp chọn-->

<td width="28" height="15"> <input type=checkbox value=<%=myRst("MaGV")%> name=chkid></td>

<td width="130" height="15">

<!—Khai bỏo thẻ liờn kết cho phộp sửa--> <a href="addnew.asp?id=<%=myRst("MaGV")%>">< %=myRst("TenGV")%><a/> <td width="60" height="15"><%=myRst("SoDT") %></td>

<td width="100" height="15">< %=myRst("thoigian")%></td>

<td width="200" height="15">< %=myRst("diadiem")%></td></tr> <% myRst.MoveNext Loop myRst.Close myCon.Close Set myRst=Nothing Set myCon=Nothing if i=0 then %> <tr class=text>

<td colspan=5 align=center >Không tÃơm thỏºƠy giÃĂo viÃên!</td></tr>

<%End If%>

<td colspan=5 width="700"><hr size=1 color=red></td> </table>

<table width=200 cellspacing=2 cellpadding=2> <tr class=text> <!-- Khai bỏo nỳt thờm tin-->

<td colspan=2> <input type=button onclick="window.open('addnew.asp', target='_main');" value="AddNew"> <!-- Khai bỏo nỳt xúa mẫu tin-->

<input type=submit value="Delete"> </td></tr> </form>

</table>

</body>

Một phần của tài liệu Bài giảng về lập trình mạng (Trang 137)