白健
摘要:指出基于ASP+Access架構的網(wǎng)站項目中,采用多數(shù)據(jù)庫設計,能有效彌補Access數(shù)據(jù)庫的一些局限性。給出了在同一ASP頁面中訪問多個Access數(shù)據(jù)庫的三種簡單方法: 利用ASP+Cookie技術訪問不同數(shù)據(jù)庫;利用FOR循環(huán)結構+Cookie技術同時訪問多個數(shù)據(jù)庫;利用FOR循環(huán)結構+FSO組件同時訪問多個數(shù)據(jù)庫。給出了以上方法的ASP代碼。
關鍵詞:ASP;Access;多數(shù)據(jù)庫;網(wǎng)站建設
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2018)27-0012-02
Several Simple Methods for ASP to Access Multiple Access Databases
BAI Jian
(Department of Basic Courses, Hebei Construction Material Vocational & Technical College, Qinhuangdao 066004, China)
Abstract: The paper points out that the use of multi-database design in website projects Based on ASP+Access architecture can effectively make up for some limitations of Access databases. Three simple methods to access multi-databases in same ASP pages are presented: Using the FOR-loop-structure and Cookie technology to access multi-database at the same time; Using the FOR- loop-structure and FSO component to access multi-database at the same time. The ASP code of the above methods is given.
Key words: ASP; Access databases; Multi-database; Website construction
1 概述
隨著互聯(lián)網(wǎng)+戰(zhàn)略的實施,越來越多的教師根據(jù)自己的工作實際,嘗試建立具有獨立知識產(chǎn)權的教學資源網(wǎng)站。由于ASP技術成熟,簡單易學;Microsoft Office是教師常用的辦公系統(tǒng),其集成的Access數(shù)據(jù)庫簡單好用;基于ASP+Access架構的網(wǎng)站架設簡單,空間服務商廣泛支持,適合非專業(yè)人員架設動態(tài)網(wǎng)站。因此,許多教師采用ASP+Access架構構建自己的教學資源網(wǎng)站。
但Access本身具有一定的局限性(見Microsoft Access軟件中的幫助信息),如:庫文件不能太大;最多只支持255個并發(fā)用戶,實際運行中支持的更少;單表記錄數(shù)不能太多,否則運行明顯變慢。為克服以上不足,采用ASP+Access架構開發(fā)項目時,把以往只使用一個核心數(shù)據(jù)庫的設計,改成使用多個同構數(shù)據(jù)庫設計,這些同構數(shù)據(jù)庫由系統(tǒng)根據(jù)后臺設置的數(shù)據(jù)類別動態(tài)生成。實踐證明,這一方法有效彌補了Access數(shù)據(jù)庫容量小、并發(fā)訪問用戶少等不足,并且增加了網(wǎng)站使用的智能性和廣泛性。
2 多數(shù)據(jù)庫的建立
項目網(wǎng)站中共設計兩類數(shù)據(jù)庫:一類是基本信息數(shù)據(jù)庫,只有一個,用于存儲數(shù)據(jù)類別、對應的核心數(shù)據(jù)庫編號、用戶登錄信息等基本信息,由后臺管理員管理;一類是核心數(shù)據(jù)庫,由多個數(shù)據(jù)庫組成,用于存儲網(wǎng)站提供的各種資源信息、網(wǎng)站用戶輸入的數(shù)據(jù)等,不同類別的數(shù)據(jù)單獨建庫,以編號區(qū)分,即本文所指的多數(shù)據(jù)庫。
在建立網(wǎng)站的核心數(shù)據(jù)庫時,首先根據(jù)實際需要建立模板數(shù)據(jù)庫,命名為Datamodel.mdb。運行時,系統(tǒng)根據(jù)管理員設置的不同數(shù)據(jù)類別,利用模板數(shù)據(jù)庫動態(tài)生成編號不同的系列同構數(shù)據(jù)庫,可分別命名為data11.mdb、data12.mdb、…,data21.mdb、data22.mdb、…,data31.mdb、data32.mdb、…,等等,數(shù)據(jù)庫名稱中的數(shù)字為基本信息庫中的數(shù)據(jù)類別編號,取1~99范圍內的半角英文數(shù)字。
這樣,就需要解決兩個問題:一是用戶在操作不同的數(shù)據(jù)類別時,需要訪問不同的數(shù)據(jù)庫;二是在數(shù)據(jù)統(tǒng)計時需要同時查詢多個數(shù)據(jù)庫。采用以下方法,較好地解決了以上問題,簡單易行,不需要太深的專業(yè)知識,特別適合非專業(yè)人員采用。
3 多數(shù)據(jù)庫的訪問方法
3.1 利用ASP+Cookie技術動態(tài)訪問不同數(shù)據(jù)庫
用戶訪問網(wǎng)站時,根據(jù)用戶選擇的數(shù)據(jù)類別不同,系統(tǒng)將對應的數(shù)據(jù)庫編號寫入Cookie(Reponse.cookies("userinfo")("chnum")=編號變量)。在數(shù)據(jù)庫連接文件中讀出Cookie中的編號,賦值給數(shù)據(jù)庫編號變量,根據(jù)編號變量建立相應數(shù)據(jù)庫的連接。這樣就實現(xiàn)了根據(jù)用戶選擇動態(tài)建立不同數(shù)據(jù)庫的連接。
連接文件conn.asp代碼如下:
<% dim chnum
chnum=Request.cookies("userinfo")("chnum")
db="data/data"&chnum;&".mdb"‘數(shù)據(jù)庫存儲路徑為data/
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};pwd=;
dbq=" &Server.MapPath;(db)
%>
在訪問數(shù)據(jù)庫頁面建立查詢代碼如下(以訪問數(shù)據(jù)庫中的表result為例):
<!—#include file="inc/conn.asp"—>
…
<%
sql="select * from result order by snoasc"
setrs=server.createobject("adodb.recordset")
rs.open sql,conn,1,1
if not rs.eof then
toptotal=rs("toptotal")
…
end if
rs.close
setrs=nothing
%>
…
通過這種方法,實現(xiàn)了動態(tài)訪問不同數(shù)據(jù)庫的目的。
3.2 利用FOR循環(huán)結構+Cookie技術同時訪問多個數(shù)據(jù)庫
網(wǎng)站在統(tǒng)計數(shù)據(jù)時,要根據(jù)統(tǒng)計需要訪問多個乃至所有核心數(shù)據(jù)庫(data11.mdb、data12.mdb、…,data21.mdb、data22.mdb、…,data31.mdb、data32.mdb、…)。后臺管理員和用戶可能并不知道究竟有多少個數(shù)據(jù)庫,也不知道數(shù)據(jù)庫文件名。可利用ASP的FOR循環(huán)結構和瀏覽器的Cookie技術實現(xiàn)多個數(shù)據(jù)庫的同時查詢。
通過瀏覽器打開統(tǒng)計頁面,首先將基本信息數(shù)據(jù)庫中的所有數(shù)據(jù)類別對應的數(shù)據(jù)庫編號分別寫入Cookie。在數(shù)據(jù)庫連接文件中讀出Cookie中的編號值,賦值給數(shù)據(jù)庫編號變量,根據(jù)編號變量建立相應數(shù)據(jù)庫的連接。這樣就實現(xiàn)了動態(tài)建立多個數(shù)據(jù)庫的連接。
連接文件connmulti. asp代碼如下:
<%dim j,dbnum(99),connstr(99),conndb(99)
for j=1 to 99‘j的范圍可根據(jù)實際情況指定
coochnum=Request.dookies("userinfo")("chnum"&j;)‘從Cookie中讀出數(shù)據(jù)庫編號
if coochnum<>"" then ‘非空的為有效編號,數(shù)據(jù)庫存在,建立連接
dbnum(j)="data/data"&coochnum;&".mdb"
connstr(j) = "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database;
password=;Data Source=" &Server.MapPath;(dbnum(j))
setconndb(j)=server.createobject("ADODB.CONNECTION")
conndb(j).open connstr(j)
end if
next
%>
在訪問數(shù)據(jù)庫頁面包含連接文件connmulti. asp,建立查詢代碼如下(以訪問數(shù)據(jù)庫中的表result為例):
<!—#include file="inc/connmulti.asp"—>
…
<%
score=0
for chnum1=1 to 99
if conndb(chnum1)<>"" then‘判斷是否建立了連接,對應連接文件中的conndb(j)。
sql="select * from result where sno='"&sno;&"' "
setrs=server.createobject("adodb.recordset")
rs.opensql,conndb(chnum1),1,1
if not rs.eof then
score=score +rs("toptotal")
…
end if
rs.close
setrs=nothing
end if
next
…%>
…
通過這種方法,實現(xiàn)了在一個ASP頁面訪問多個數(shù)據(jù)庫的目的。
3.3 利用FOR循環(huán)結構+FSO組件同時訪問多個數(shù)據(jù)庫
如果覺得使用Cookie技術比較麻煩,在建立多數(shù)據(jù)庫的連接時,可用FSO組件判斷數(shù)據(jù)庫是否存在,但需要遠程服務器支持FSO組件。
連接文件connmulti.asp代碼如下:
<% dimj,dbnum(99),connstr(99),conndb(99)
Set Fso=Server.CreateObject("Scripting.FileSystemObject")
for j=1 to 99
If Fso.FileExists(Serer.mappath("data/data"&j;&".mdb") then
dbnum(j)="data/data"& j &".mdb"
connstr(j) = "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=;Data Source=" &Server.MapPath;(dbnum(j))
setconndb(j)=server.createobject("ADODB.CONNECTION")
conndb(j).open connstr(j)
end If
next
Set oFile=Nothing
Set oFso=Nothing
%>
在查詢頁面建立查詢代碼同3.2中的相應代碼,此處略。
這種方法要在所有數(shù)據(jù)庫都有效的情況下使用。如果路
徑中存在廢棄的數(shù)據(jù)庫,可能導致錯誤的結果。在這里仍可結合Cookie技術,以避免出錯。
4 結束語
以上方法均在實際項目中驗證通過,達到預期效果。實際項目中,可根據(jù)需要調整FOR循環(huán)變量的范圍,一般設置為1~99,就可滿足各學科教學資源網(wǎng)站的需要。當數(shù)據(jù)庫數(shù)量較多時,查詢的速度會有一定下降。但現(xiàn)在的計算機運行速度都很快,而且同時訪問多數(shù)據(jù)庫的頁面很少,因此,這樣的設計不會對網(wǎng)站的運行速度有太大的影響。如果同時查詢的數(shù)據(jù)庫個數(shù)很少,且數(shù)據(jù)庫名稱確定,則沒必要用以上方法,直接建立數(shù)據(jù)庫連接即可。
參考文獻:
[1] 劉瑞新.ASP網(wǎng)頁數(shù)據(jù)庫短訓教程[M].北京:機械工業(yè)出版社,2004年:205-237.
[2] 楊英潔.簡析ASP的數(shù)據(jù)庫連接[J].電腦知識與技術,2009(5):1031,1043.
[通聯(lián)編輯:王力]