📄 ado网站资料库技术速成.txt
字号:
ADO網站資料庫技術速成(big5)(我看大家学得好辛苦,所以就。。) (1)
--------------------------------------------------------------------------------
【yanzi】 于 99-4-8 10:57:12 下午 加贴在 Joy ASP ↑:
ADO網站資料庫技術速成
刊登於RUN!PC雜誌 1999年 3月份
作者 喬篷科技 周世雄
筆者為微軟台北廳、經銷商訓練、TechNet等研討會講師,和微軟之友、RUN!PC雜誌專欄作者,著作有「ASP網站熱門應用技術」、「微軟熱門Web技術速成班」等網站網頁設計十幾本電腦書籍。現任「喬篷科技」公司總經理,從事Internet、Intranet之Web資料庫應用設計、網站網頁規劃架設等服務。
IIS 4.0示範網站:www.asp.com.tw
連絡E-mail:jackchou@tpts5.seed.net.tw。
網際網路存取資料庫
如何透過網際網路或intranet,存取伺服器資料庫的資料呢?
答案為使用瀏覽器,透過網際網路或intranet,經由於網站伺服器IIS執行的ASP(Active Server Pages)程式,來呼叫ADO(ActiveX Data Object)、或RDS(Remote Data Service)物件,再透過各種ODBC(或OLE DB)的驅動程式,即可連接到超過50種支援ODBC(或OLE DB)的資料庫,包括Access、Excel、FoxPro、dBase、SQL Server、Oracle等資料庫,也可以連接到Excel、或Text檔案。
您只要於網站伺服器IIS的電腦上,安裝這種資料庫的ODBC(或OLE DB)的驅動程式,即可以存取位於網路上任何一台電腦支援ODBC(或OLE DB)的資料庫。
ADO使用Recordset物件
使用Recordset(記錄集合)物件,將資料庫的資料先儲存到Recordset當中,就可以讓多位使用者同時存取同一個資料庫。
ADO如何使用Recordset物件呢?
ADO如何鎖定RecordSet的記錄呢?
使用Recordset(記錄集合)物件的方法如下:
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open SQL指令, Conn, 1, 1 ‘讀取
rs.Open SQL指令, Conn, 1, 3 ‘新增、修改、或刪除
到底rs.Open後接的第三個參數1和第四個參數是甚麼意思呢?為何第四個參數於讀取時要用1,新增、修改、或刪除時要用3呢?
第三個參數表示cursor類型。
第四個參數表示RecordSet的鎖定型態。
詳細介紹如下:
RecordSet的鎖定
當開啟Recordset物件時,您也可以於LockType屬性指定鎖定的型態:
1:唯讀(ReadOnly),不允許更新,為預設值。
2:悲觀鎖定( Pessimistic lock),在編輯Recordset資料或呼叫了AddNew方法,一開始執行就立即鎖定此筆資料記錄或包含資料記錄的資料頁,並維持鎖定直到使用Update方法將變更寫回到資料庫為止。
3:樂觀鎖定(Optimistic lock),使用Update方法將變更寫回到資料庫時才鎖定此筆資料記錄。
4:批次樂觀鎖定(Batch Optimistic lock),使用UpdateBatch方法將多筆變更的記錄批次寫回到資料庫時,才鎖定此批資料記錄。
當您使用悲觀鎖定(Pessimistic Lock)時,一旦編輯Recordset資料或呼叫了AddNew方法時,就會鎖定包含目前編輯RecordSet的資料對應頁,直到明確地確認(Commit)或取消這個RecordSet的變更後,它才會釋放這個鎖定。
悲觀鎖定的主要優點,是取得鎖定之後,只要RecordSet還被鎖定著,就不會發生任何鎖定衝突。由於一個使用者開始編輯RecordSet後,其他使用者就無法改變它,所以悲觀鎖定是保證應用程式能讀取到目前最新資料的唯一方法。
悲觀鎖定的缺點,是在編輯和鎖定該RecordSet當中,包含該RecordSet的整個資料對應頁都會被鎖定。如果當使用者開始編輯和鎖定RecordSet後,在RecordSet被鎖定期間過了很久才明確地確認(Commit)或取消這個RecordSet的變更,就將產生一個問題,這不僅鎖定了使用者正在編輯的RecordSet,而且還可能會鎖定存在於該被鎖定資料對應頁內其它的RecordSet。
當您使用樂觀鎖定(Optimistic Lock)時,只會在使用Update方法變更RecordSet時,才鎖定該資料對應頁,所以能使鎖定的時間為最短,這是樂觀鎖定的主要優點。
樂觀鎖定的缺點,是當使用者開始編輯RecordSet時,無法確定更新是否會成功。如果另一個使用者改變了第一個使用者正在編輯的RecordSet,那麼建立在樂觀鎖定的更新將會失敗。
譬如甲和乙都在編輯相同的RecordSet,若甲開始以樂觀鎖定編輯一個RecordSet,因為 甲使用的是樂觀鎖定,並沒有真正鎖定該RecordSet,所以無法禁止乙嘗試編輯相同的RecordSet。
於是乙開始編輯相同的RecordSet。但是,乙也不知道甲正在編輯該RecordSet,也看不到最新的資料。
因為乙也正在編輯該資料錄,所以當甲嘗試儲存他的變更時,就會收到一個錯誤。
當您使用異動(transaction)功能時,樂觀鎖定將會轉換成悲觀鎖定。因為在你做交易確認(Commit)之前,異動一直會做寫入鎖定 (Write-Lock)的功能,所以轉換成悲觀鎖定。
樂觀更新(optimistic update)是逐筆記錄進行的。您可以讓使用者能在自己的電腦中,暫存(cache)多筆記錄的變更,然後使用批次處理,一次把這些多筆變更的記錄傳給伺服器進行更新,這樣效率比較高。這個方式稱為批次樂觀更新(Batch Optimistic Update)。
批次樂觀更新使用的鎖定方式為批次樂觀鎖定(Batch Optimistic lock),使用UpdateBatch方法將多筆變更的記錄批次寫回到資料庫時,才鎖定此批資料記錄。
在Recordset物件上設定鎖定時,如果鎖定失敗,則會產生錯誤。
譬如有另一個使用者以鎖定的模式,開啟了Recordset物件時,那麼當您嘗試鎖定該Recordset物件時,就會發生錯誤。
cursor
cursor(資料指標)是一個指標或指標的集合,它指向根據某條件從資料庫中取回的資料。cursor的特性如下:
可以表示單一資料表中的部份或全部RecordSet。
可以表示多資料表的連結(join)中的部份或全部RecordSet。
可以表示沒有RecordSet。
在cursor層次上或者在資料欄層次上,cursor可以是唯讀的或可更新的。
cursor既可以雙向捲動(表示在RecordSet中能向前或向後捲動),又可以是僅向前捲動。
cursor可以存在於用戶端的電腦中,也可以存在於伺服器上。
cursor所在位置
cursor需要暫存的資源來儲存資料,這些資源為RAM、虛擬記憶體、暫存檔或資料庫。如果這些資源在用戶端的電腦中,cursor就稱為client-side(用戶端)cursor。對於這種類型的cursor,伺服器將cursor所代表的資料和cursor自身需要的資料傳到用戶端,由用戶端電腦來管理暫存的資源。
另外一種類型的cursor,稱為server-side(伺服端)cursor。對於這種類型的cursor,使用伺服器上的暫存資源來管理RecordSet物件。對於server-side cursor,只有由cursor選中的RecordSet才透過網路傳送給用戶端的電腦。因此在網路通訊或頻寬出現問題時,使用這種類型的cursor在性能上有很大的提昇。但是,因為需要伺服器上的RAM和磁碟空間等資源,因此必須保證伺服器有足夠資源來管理所有客戶端電腦請求的cursor。
CursorLocation屬性,可以選擇cursor的所在位置,是在用戶端電腦還是伺服器上:
3:使用用戶端cursor。此選項對小的RecordSet效果較好,但對大的結果集,其性能迅速下降。
2:使用伺服端cursor。對於大多數的大型作業來說,這種類型的cursor有較好的性能。
cursor類型
當開啟Recordset物件時,可以於CursorType屬性指定不同的cursor類型:
0:Forward-only(只向前):只能向前捲動,這是預設值。
1:Keyset(索引鍵集)
2:Dynamic(動態)
3:Static(靜態)
如果應用程式只需要讀取一個RecordSet,並不需要做新增、修改、刪除的動作,那麼用Forward-only(只向前)的Recordset物件,可以明顯提高應用程式的執行性能。
--------------------------------------------------------------------------------
ado网站资料库技术速成(二)
--------------------------------------------------------------------------------
【yanzi】 于 99-4-8 11:00:29 下午 加贴在 Joy ASP ↑:
ADO存取資料庫如何顯示上一筆下一筆?
ADO存取資料庫如何顯示上一筆下一筆?
若要於RecordSet移動到上一筆下一筆的位置,讓我們先學會以下RecordSet物件的屬性和方法:
BOF屬性:目前指標指到RecordSet的第一筆。
EOF屬性:目前指標指到RecordSet的最後一筆。
Move方法:移動指標到RecordSet中的某一個記錄。
AbsolutePosition屬性:目前指標在RecordSet中的位置。
bookmark(書籤)屬性:於RecordSet的一筆記錄做一個記號。
詳細介紹如下:
BOF與EOF屬性
可以撰寫程式碼來檢查BOF與EOF屬性,來得知目前指標於RecordSet的位置:
BOF與EOF都為False:表示指標位於RecordSet當中。
BOF為True:目前指標指到RecordSet的第一筆。
EOF為True:目前指標指到RecordSet的最後一筆。
BOF與EOF都為True:在RecordSet裏沒有任何的資料記錄。
Move方法
您可以用Move方法移動指標到RecordSet中的某一筆記錄:
MoveFirst方法:移至第一筆記錄。
MoveLast方法:移至最後一筆記錄。
MoveNext方法:移至下一筆記錄。
MovePrevious方法:移至上一筆記錄。
Move [n]方法:移動指標到第n筆記錄,n由0算起。
AbsolutePosition屬性
若您需要確定目前指標在RecordSet中的位置,您可以用AbsolutePosition屬性。
AbsolutePosition屬性的數值為目前指標相對於第一筆的位置,由1算起,即第一筆的AbsolutePosition為1。然而,不要誤以為AbsolutePosition是資料記錄的編號,如果目前RecordSet處於未定的狀態,則AsolutePosition的數值為–1。
另外,在存取RecordSet時,無法保證RecordSet每次都以同樣的順序出現。
若要啟用AbsolutePosition,必須先設定為使用用戶端cursor,asp碼如下:
rs2.CursorLocation = 3
Move/AbsolutePosition例子
讓我們看一個於ASP程式碼當中使用Move/AbsolutePosition做到上一筆下一筆功能的例子。
譬如ASP程式碼如下:
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ="& Server.MapPath("ntopsamp.mdb") &";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"
Set rs2 = Server.CreateObject("ADODB.Recordset")
SqlStr = "SELECT * From 著作"
'Enable AbsolutePosition
rs2.CursorLocation = 3 'adUseClient
rs2.Open SqlStr,conn1,1,1
if Request("sel") = "prev" then
Session("position") = Session("position") - 1
rs2.Move Session("position")
elseif Request("sel") = "next" then
Session("position") = Session("position") + 1
rs2.Move Session("position")
else
Session("position") = 0
end if
%>
<% = Session("position") %>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<TR>
<TD ALIGN=CENTER BGCOLOR="#008080"><FONT COLOR="#FFFFFF">書名</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080"><FONT COLOR="#FFFFFF">出版</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080"><FONT COLOR="#FFFFFF">圖片</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080"><FONT COLOR="#FFFFFF">簡介</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080"><FONT COLOR="#FFFFFF">AbsolutePosition</FONT></TD>
<TR>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs2("書名") %></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs2("出版") %></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs2("圖片") %></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs2("簡介") %></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs2.AbsolutePosition %></TD>
</TR>
</TABLE>
<% if Session("position") > 0 then %>
<A href=rs14.asp?sel=prev>上一筆</A>
<% end if %>
<% if Session("position") < rs2.RecordCount -1 then %>
<A href=rs14.asp?sel=next>下一筆</A>
<% end if %>
<% rs2.Close %>
以上的 ASP程式碼,於用戶端使用瀏覽器,瀏覽執行的結果,顯示上一筆下一筆的功能。
由Session("position")儲存這個使用者的RecordSet指標位置,當按下 [上一筆] 超連結時,由<A href=rs14.asp?sel=prev>上一筆</A>,將sel設定為prev,並重新執行rs14.asp的asp碼。由以下的程式部份,將Session("position")減一:
if Request("sel") = "prev" then
Session("position") = Session("position") - 1
rs2.Move Session("position")
elseif Request("sel") = "next" then
Session("position") = Session("position") + 1
rs2.Move Session("position")
else
Session("position") = 0
end if
然後使用Move Session("position")方法,將移動指標到第Session("position")個記錄,第一筆記錄的Session("position")值為0。
當按下 [下一筆] 超連結時,由<A href=rs14.asp?sel=next>下一筆</A>,將sel設定為next,並重新執行rs14.asp的asp碼。由以上的程式部份,將Session("position")加一,然後使用Move Session("position")方法,將移動指標到第Session("position")個記錄。
AbsolutePosition部份,首先由rs2.CursorLocation = 3設定為使用用戶端cursor,以啟用AbsolutePosition,即可由<%= rs2.AbsolutePosition %>顯示AbsolutePosition的值。
為了判斷是否要顯示 [上一筆] [下一筆] 超連結,由以下的程式部份:
<% if Session("position") > 0 then %>
<A href=rs14.asp?sel=prev>上一筆</A>
<% end if %>
<% if Session("position") < rs2.RecordCount -1 then %>
<A href=rs14.asp?sel=next>下一筆</A>
<% end if %>
就可以使用if Session("position") > 0、if Session("position") < rs2.RecordCount -1,比較目前的位置Session("position")和第一筆0、第末筆RecordCount -1的位置,來判斷是否要顯示 [上一筆] [下一筆] 的超連結。
Bookmark(書籤)
Bookmark(書籤)於RecordSet的一筆記錄做一個記號。
使用時先移動到那筆資料,然後給予Bookmark屬性一個名稱,即書籤記號的名稱,當要回到該筆記錄時,將Bookmark 屬性設為所設定書籤記號的名稱即可。
Bookmark例子
如何使用Bookmark(書籤)呢?讓我們看一個於ASP程式碼當中使用Bookmark的例子。
譬如ASP程式碼如下:
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ="& Server.MapPath("ntopsamp.mdb") &";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"
Set rs2 = Server.CreateObject("ADODB.Recordset")
SqlStr = "SELECT * From 著作"
rs2.Open SqlStr,conn1,1,1
rs2.MoveNext
if Request("sel") = "last" then
rs2.MoveLast
elseif Request("sel") = "first" then
rs2.MoveFirst
elseif Request("sel") = "prev" then
Session("position") = Session("position") - 1
rs2.Move Session("position")
elseif Request("sel") = "next" then
Session("position") = Session("position") + 1
rs2.Move Session("position")
elseif Request("sel") = "set" then
rs2.Move Session("position")
Session("bk") = rs2.Bookmark
elseif Request("sel") = "go" then
rs2.Bookmark = Session("bk")
else
Session("position") = 0
end if
%>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<TR>
<TD ALIGN=CENTER BGCOLOR="#008080"><FONT COLOR="#FFFFFF">書名</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080"><FONT COLOR="#FFFFFF">出版</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080"><FONT COLOR="#FFFFFF">圖片</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#008080"><FONT COLOR="#FFFFFF">簡介</FONT></TD>
<TR>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs2("書名")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs2("出版")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs2("圖片")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs2("簡介")%></TD>
</TR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -