一 分頁技術 前面我們介紹了如何檢索數據並輸出到浏覽器端
對少量數據而言
那樣簡單的輸出處理是完全可以的
但是若數據量很大
有幾百條甚至上千條
一次將如此多的數據全部輸出到客戶端是不現實的
一來頁面從上到下拉得很長
二來客戶端等待的時間過長
三來服務器的負載過大
所以采取分頁輸出非常必要
要求
輸出Northwind
mdb
產品
表中的數據至浏覽器
每頁顯示
條
例wuf
asp
這段代碼還是有點難度的
要多看多體會
AdoAccess
asp在上講中提到過
注
該例程吸收了某些書籍中好的部分
特此聲明
<%@ LANGUAGE=
VBSCRIPT
%>
<!
#include file=
AdoAccess
asp
>
<!
#include file=
adovbs
inc
>
<%
Dim RecordPerPage
absPageNum
TotalPages
absRecordNum
rsTest
StrSQL
absPageNum
當前頁為第幾頁
TotalPages
總的頁數
absRecordNum
當前頁中某一條記錄的序號
如
RecordPerPage =
每頁顯示的記錄數
取得所輸出數據的 當前頁碼
If Request
ServerVariables(
CONTENT_LENGTH
) =
Then
若沒收到表單遞交的數據(如首次加載該頁時)
則從第
頁開始顯示
absPageNum =
Else
取出按 按鈕 時的頁碼
absPageNum = CInt(Request
Form(
PressPageNum
))
如按 上一頁 則頁碼
按 下一頁
則頁碼 +
If Request
Form(
Submit
) =
上一頁
Then
absPageNum = absPageNum
ElseIf Request
Form(
Submit
) =
下一頁
Then
absPageNum = absPageNum +
End If
End If
創建記錄集對象
Set rsTest = Server
CreateObject(
ADODB
Recordset
)
rsTest
CursorLocation = adUseClient
這樣設置可減輕數據庫負載
rsTest
CursorType = adOpenStatic
游標需要前後移動
不能設為僅向前
rsTest
CacheSize = RecordPerPage
設置這個選項會提高性能
StrSQL =
SELECT * FROM 產品 Order By 產品ID
rsTest
Open StrSQL
Cnn
adCmdText
rsTest
PageSize = RecordPerPage
設置每一頁的記錄數
If Not(rsTest
EOF) Then
rsTest
AbsolutePage = absPageNum
End If
TotalPages = rsTest
PageCount
%>
<%
下面部分 輸出當前頁的數據至浏覽器 %>
<Html><Boby>
<table colspan=
cellpadding=
border=
>
<tr>
<td align=CENTER bgcolor=
#
width=
> <font color=
#ffffff
size=
>單價</font></td>
<td align=CENTER width=
bgcolor=
#
> <font color=
#ffffff
size=
>產品名稱</font></td>
</tr>
<%
用循環輸出當前頁的
條數據
For absRecordNum =
to rsTest
PageSize
%>
<tr>
<td bgcolor=
f
efde
align=CENTER> <font size=
><%= rsTest(
單價
)%></font></td>
<td bgcolor=
f
efde
align=CENTER> <font size=
><%= rsTest(
產品名稱
)%></font></td>
</tr>
<%
rsTest
MoveNext
If rsTest
EOF Then
Exit For
如果已到記錄尾
退出
如最後一頁數據不滿頁時
End If
Next
rsTest
Close : Cnn
Close
Set rsTest = Nothing : Set Cnn = Nothing
%>
</table>
<%
下面部分 是兩個按鈕
上一頁
下一頁
%>
<Form Action =
<%= Request
ServerVariables(
SCRIPT_NAME
) %>
Method=
Post
>
<Input Type=
Hidden
Name=
PressPageNum
Value=
<%= absPageNum%>
>
<%
If absPageNum >
Then
如果當前不是第一頁
則顯示上一頁按鈕 %>
<Input Type=
Submit
Name=
Submit
Value=
上一頁
>
<% End If
If absPageNum <> TotalPages Then
如果當前頁不是最後一頁
則顯示下一頁按鈕%>
<Input Type=
Submit
Name=
Submit
Value=
下一頁
>
<% End If %>
</Form>
<P><Center> [ 第 <font color=
#CC
><%= absPageNum %></font> 頁
共 <font color=
#CC
><%= TotalPages %></font> 頁 ] </Center></P>
</BODY></HTML>
分析
.Recordset對象一些有用的屬性
l rsTest
CursorLocation = adUseClient
也可以不要這句
但這樣做可以減輕數據庫負載
l rsTest
CacheSize = RecordPerPage
CacheSize屬性用來決定每次用戶端從數據庫服務器取得的數據多少
l rsTest
PageSize
PageSize屬性用來設置每一頁記錄數的多少
l rsTest
AbsolutePage
AbsolutePage屬性設置當前數據在Recordset對象中的絕對頁數
l rsTest
PageCount
PageCount屬性用來獲取記錄集的總頁數
.本例Form表單中使用了一個隱含字段PressPageNum 用來傳遞點擊按鈕時為第幾頁
二 錯誤處理 代碼執行的過程中
可能因各種原因發生錯誤
如
代碼本身有問題
網絡斷開等等
所以在程序中設置錯誤捕獲和處理是非常必要的
在ASP中
我們可以通過Connection對象的Errors數據集合取得代碼運行時所發生的錯誤或警告信息
其使用方法如下
. 直接對Connection對象來使用
Set Errs = Cnn
Errors
或者
Cnn
Errors
. 建立Recordset對象或Command對象後
再通過其ActiveConnection屬性來使用Connection對象
Set Errs = rsTest
ActiveConnection
Errors
或者
rsTest
ActiveConnection
Errors
說起來太粗象
舉一實例吧
wuf
asp
<%@ LANGUAGE=
VBSCRIPT
%>
<% Option Explicit %>
<!
#include file=
adovbs
inc
>
<%
Response
Expires =
下面這句保證: 即使腳本遇到錯誤
也繼續執行下一句
On Error Resume Next
Dim Cnn
rsTest
Errs
I
Set Cnn = Server
CreateObject(
ADODB
Connection
)
CommandTimeout
與數據庫連接的最長等待時間
缺省為
秒
Cnn
CommandTimeout =
你可以分別在下面三種情況下檢測錯誤發生情況
以SQL Server為例
完全正確;
未設置初始數據庫;
數據庫名誤為 pvbs
Cnn
Open
Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pubs; Data Source=ICBCZJP
Cnn
Open
Provider=sqloledb; User ID=sa; Password=; Initial Catalog=; Data Source=ICBCZJP
Cnn
Open
Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pvbs; Data Source=ICBCZJP
For I =
To Cnn
Errors
Count
Source屬性表示造成錯誤的來源
Response
Write
[
& Cnn
Errors(I)
Source &
]
Description屬性表示錯誤發生原因或描述
Response
Write Cnn
Errors(I)
Description &
<br>
Next
If Cnn
Errors
Count >
Then
Response
Write
連接時發生
& Cnn
Errors
Count &
個錯誤
&
<br>
End If
Set rsTest = Server
CreateObject(
ADODB
Recordset
)
rsTest
Open
jobs
Cnn
adOpenForwardOnly
adLockReadOnly
adCmdTable
If rsTest
ActiveConnection
Errors
Count >
Then
Set Session(
Errs
) = rsTest
ActiveConnection
Errors
Response
Redirect
ErrorHandle
asp
End If
Cnn
Close
Set rsTest = Nothing : Set Cnn = Nothing
%>
ErrorHandle
asp代碼
<%
Dim I
For I =
To Session(
Errs
)
Count
Response
Write
[
& Session(
Errs
)(I)
Source &
]
Response
Write Session(
Errs
)(I)
Description &
<br>
Next
%>
分析
在本例中
錯誤可能在連接時發生
也可能連接是正確的
但是在使用Recordset對象時發生了錯誤
另外
在後面的一段代碼中
將錯誤集合放入一個會話對象中
以便在頁面之間調用(遇到錯誤時
轉向錯誤處理頁面ErrorHandle
asp)
實際上
你也完全可以將Recordset對象賦給Session對象
以實現記錄集在頁面之間的調用
三 使用事務 事務這一概念是非常簡單和重要的
為了說明其用途
先假設出現了以下情況
例如在電子商務中
在網上進行貨幣轉帳時
必須從某一帳戶中減去某個數額並將其對等數額添加到另一個帳戶
無論其中的哪個更新失敗
都將導致帳戶收支不平衡(要麼這邊扣了
那邊沒有增加
要麼這邊沒扣
那邊卻增加了)
如果使用事務進行這些更改
便可確保只能選擇進行全部更改或不作任何更改(不是被完全正確執行
就是被全部取消)
事務隸屬於Connection對象
From:http://tw.wingwit.com/Article/program/net/201311/13103.html