Posted: 2005/2月/16 11:53上午 | IP記錄
|
|
|
操作記錄集的高級方法
到現在為止,你只學習了如何用SQL來修改記錄集中的記錄。但是,你還可以使用許多記錄集方法修改記錄集中的記錄。下面列出了每 種方法的簡要說明:
AddNew。向記錄集中添加一條新記錄。
CancelBatch。(當記錄集處在批量更新模式時)取消一批更新。
CancelUpdate。(調用Update之前)取消對當前記錄所做的所有修改。
Delete。從記錄集中刪除一條記錄。
Update。保存對當前記錄所做的修改。
UpdateBatch。(當記錄集處於批量更新模式時)保存對一個或多個記錄的修改。
例如,你可以用AddNew方法向一個打開的記錄集中添加一條空記錄:
<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
Set RS=Sever.CreateObject(「ADODB.RecordSet」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.Open 「SELECT * FROM Mytable」,MyConn,adOpenDynamic,adCMDText
RS.AddNew
RS(「MyColumn」)=」A new column」
RS.Update
RS.Close
MyConn.Close
%>
在這個腳本中,用AddNew方法創建了一條新記錄。接著,新記錄的MyColumn域被賦值「A new column」。最後,調用Update方法保存新記錄。要使用這些方法,記錄集必須以只讀方式以外的其它鎖定方式打開。
你也可以使用SQL INSERT語句向一個表中添加新記錄,以取代AddNew方法。通常,使用SQL比使用上述的方法要好一些,因為SQL更加靈 活。本書的其餘部分將使用SQL來操作數據庫中的數據。
遍歷記錄集
記錄集對像有許多在記錄之間移動的方法。這些方法的大部分只有在記錄集以某種特定的游標打開時才可以使用。下面列出了記錄集對象 的一些方法及其功能的說明:
Move NumRecords。在記錄集中向前或向後移動指定數目的記錄數。
MoveFirst。移動到記錄集的第一條記錄。
MoveNext。移動到記錄集的下一條記錄。
MovePrevious。移動到記錄集中的上一條記錄。
MoveLast。移動到記錄集的最後一條記錄。
記錄集對像還有許多屬性,對遍歷記錄集是有用處的。同樣,許多屬性需要特定的游標類型:
AbsolutePosition。用來設置或讀取當前記錄在記錄集中的位置順序號。
BOF。標明當前位置在記錄集中的第一條記錄之前。
EOF。標明當前位置在記錄集中的最後一條記錄之後。
RecordCount。表示一個記錄集中的記錄總數。
例如,假設你想在一個記錄集中反向移動,你可以使用MoveLast和MovePrevious方法,以及BOF屬性。下面的A SP網頁演示了該如何實現:
<HTML>
<HEAD><TITLE> Backwards Recordset </TITLE></HEAD>
<BODY>
<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
Set RS=Sever.CreateObject(「ADODB.RecordSet」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.Open 「SELECT * FROM Mytable」,MyConn,adOpenStatic
RS.MoveLast
WHILE NOT RS.EOF
Response.Write(「<BR>」&RS(「MyCOlumn」))
WEND
RS.Close
MyConn.Close
%>
</BODY>
</HTML>
在這個例子中,用靜態游標打開記錄集。記錄集打開後,通過使用MoveLast和MovePrevious方法,該記錄集中的所 有記錄都被顯示,直至到達記錄集的開頭。BOF屬性用來檢測何時到達記錄集的開頭。
你可以用這種方法在一個記錄集中反向移動,但是,很難想像你有什麼理由需要這樣做。使用SQL語言自身對查詢結果進行排序是有效 的。如果你可以,你應該用ORDER BY子句對記錄進行排序。(要瞭解ORDER BY子句的更多內容,請參閱第10章,「SQL基礎」)
返回記錄數目
你可以用記錄集對象的RecordCount屬性來確定一個記錄集中的記錄總數。但是,你應該慎重使用這個屬性,因為這個屬性在 許多情況下效率極低。
對一個用前向游標打開的記錄集,你不能使用RecordCount屬性。你必須打開一個效率較低的游標才可以使用這個屬性,如下 例所示:
<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
Set RS=Sever.CreateObject(「ADODB.RecordSet」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.Open 「SELECT Mycolumn FROM Mytable」,MyConn,adOpenStatic
Response.Write(RS.RecrdCount)
RS.Close
MyConn.Close
%>
這個腳本輸出表Mytable中的記錄數目,RecordCount屬性用來返回這個數字。為了能使用RecordCount屬 性,記錄集用一個靜態游標打開。
通常,你需要一個記錄數目的唯一原因是想確定是否至少有一條記錄滿足特定的條件。例如,你也許想檢查一下,是否一個人輸入了合法 的口令。在這種情況下,你可以查詢一個保存口令的表,用RecordCount屬性確定是否有口令存在。如果RecordCou nt大於0,說明有口令存在,否則說明沒有,該口令是 非法的。
但是,用EOF屬性檢測一個查詢是否返回了結果將會更好。當用前向游標打開了一個記錄集時,你可以使用EOF屬性。這裡有一個例 子:
<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
Set RS=Sever.CreateObject(「ADODB.RecordSet」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.Open 「SELECT * FROM Password_Table
WHERE Password=」&Request.Form(「Password」),Myconn
IF RS.EOF THEN
Response.Write(「The password you entered is invalid.」)
ELSE
Response.Write(「Welcome to our web site!」)
END IF
RS.Close
MyConn.Close
%>
在這個例子中,用EOF屬性檢測是否一個查詢有返回結果。如果EOF屬性是true,說明用戶輸入的口令不在保存口令的表中。
在某些情況下,你的確需要返回記錄數目。例如,你也許想顯示在你站點上註冊的用戶總數。但是同樣,你應該避免使用RecordC ount屬性。取而代之,你可以執行一個SQL COUNT(*)查詢,如下例所示:
<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
Set RS=Sever.CreateObject(「ADODB.RecordSet」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.Open 「SELECT COUNT(*) Mycount FORM Password_Table」,MyConn
%>
There are <% =RS(「MyCount」)%> registered users at the web site.
<%
RS.Close
MyConn.Close
%>
注意這個查詢中如何使用字段別名Mycount。通過給集合函數COUNT(*)提供一個名字,你可以在輸入查詢結果時使用這個 名字。
注意
下一章將討論用SQL存儲過程返回記錄數目的方法。參見「在命令對像中使用返回狀態值」一節。
對記錄集進行分頁
假設你想顯示你站點上銷售的一系列商品。但是,你正在經營幾百種項目。在這種情況下,你可能不希望把所有的商品顯示在同一個AS P頁中。這時允許用戶進行翻頁將是個不錯的辦法。
記錄集對像有三個屬性用於此目的。你可以使用這些屬性把一個記錄集中的記錄分成許多邏輯頁。通過把記錄集中的記錄進行分頁,你可 以一次只顯示記錄集中的一部分。下面列出了這些屬性:
AbsolutePage。指定當前的頁。
PagePount。返回記錄集中的邏輯頁數。
PageSize。指定一個邏輯頁中的記錄個數,缺省值是10。
要把一個記錄集分成多個頁,你應使用PageSize屬性指定一頁中的記錄個數。然後你就可以用AbsolutePage屬性移 動到一個特定的頁。最後,PageCount屬性可以用來反回總頁數。表23.1演示了如何使用這些屬性(見圖23.2)。
表23.1 pages.asp
<HTML><HEAD><TITLE> Recordset With Pages </TITLE></HEAD><BODY><!-- #INCLUDE VIRTUAL="ADOVBS.inc" --><%' Figure out the current pageIF Request.QueryString("MOVE")="NEXT" THEN Session("CurrentPage")=Session("CurrentPage")+1END IFIF Request.QueryString("MOVE")="PREV" THEN Session("CurrentPage")=Session("CurrentPage")-1END IFIF Session("CurrentPage")="" THEN Session("CurrentPage")=1END IF%><H1>Current Page: <%=Session("CurrentPage")%></H1><HR><%' Open a Connection and RecordsetSet MyConn=Server.CreateObject("ADODB.Connection")Set RS=Server.CreateObject("ADODB.RecordSet")MyConn.Open "FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn"' Retrieve the list of productsRS.Open "SELECT ProductName FROM Products", MyConn,adOpenStatic' Set the number of records in a pageRS.PageSize=5' Set the current pageRS.AbsolutePage=Session("CurrentPage")' Show the records for the current pageWHILE NOT RS.EOF AND NumRows<RS.PageSize%><BR>Product Name: <%=RS("ProductName")%><%RS.MoveNextNumRows=NumRows+ 1WEND%><HR><% IF Session("CurrentPage")>1 THEN %><A HREF="pages.asp?MOVE=PREV"> [PREV] </A><% END IF %><% IF Session("CurrentPage")<RS.PageCount THEN %><A HREF="pages.asp?MOVE=NEXT"> [NEXT] </A><% END IF %><%RS.CloseMyConn.Close%></BODY></HTML> ;
圖23.2 對記錄集進行分頁
這個ASP網頁一次顯示表Products中的五條記錄一個session變量Currentpage被用來跟蹤記錄集的當前頁 。當用戶單擊NEXT時,就顯示下一頁記錄,當用戶單擊PREV時,就顯示上一頁。
把記錄取到數組中
在特定情況下,你將需要把記錄集中的記錄取到數組中。例如,如果你需要修改一個記錄集中的數據,擔你不想改變記錄集中的記錄本身 ,這時你可以把記錄取到數組中。
要把一個記錄集中的記錄分配給一個數組,應使用記錄集對象的GetRows()方法。這裡有一個例子:
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
Set RS=Sever.CreateObject(「ADODB.RecordSet」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.Open 「SELECT MyFirstCol,MySecondCol FORM Mytable」,MyConn
MyArray=RS.GetRows()
RS.Close
MyConn.Close
%>
在這個腳本中,記錄集RS中包含的所有記錄被分配給數組MyArray。這個數組由GetRows()方法自動創建並添入數據。 GetRows()方法創建了一個二維數組,第一個下標代表字段數,第二個下標代表記錄數。
下面的腳本可以用來顯示數組MyArray中的內容:
<%
FOR i=0 TO UBOUND(MyArray,2)
%>
<BR> First Column:<%=MyArray(0,i)%>
<BR> Second column:<%=MyArray(1,i)%>
<%
NEXT
%>
VBScript函數UBOUND()用來確定數組的第二維的維數。FOR……NEXT循環用來掃瞄數組的所有元素。這個數組代 表一個有兩個字段的記錄集。當該數組的第一個下標值是0時,代表第一個字段,當第一個下標值是1時,代表第二個字段。
指定記錄集的最大容量
假設你想顯示在你站點上發佈的最後10條信息,但是不能超過10條信息。或者你想顯示3個連接,但是不超過3個。如何能夠限制取 到一個記錄集中的記錄數?記錄集對像有一個屬性用於此目的。通過使用MaxRecords屬性,你可以限制從一個數據庫查詢返回 到一個記錄集中的記錄數目。如下例所示:
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
Set RS=Sever.CreateObject(「ADODB.RecordSet」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn
RS.MaxRecords=10
RS.Open 「SELECT MyColumn FROM Mytable」,MyConn
WHILE NOT RS.EOF
Response.Write(「<BR>」&RS(「MyColumn」))
RS.MoveNext
WEND
RS.Close
MyConn.Close
%>
在這個腳本中,MaxRecords屬性被設為10。當記錄集RS被打開時,不會有超過10個記錄被取到RS中。即使表中有10 ,000條記錄,也只有10條記錄被取出。使用MaxRecords屬性時,你必須在打開記錄集之前設置該屬性值。記錄集打開之 後,該屬性將成為只讀的。
總結
這一章討論了記錄集對象。你學會了如何在ASP網頁中使用記錄集對像顯示表中的數據。你還學會了如何用不同類型的游標和鎖定打開 記錄集。最後,你學習了記錄集對象的一些高級方法。
|