白健
摘要:指出基于ASP+Access架構(gòu)的網(wǎng)站項(xiàng)目中,采用多數(shù)據(jù)庫設(shè)計(jì),能有效彌補(bǔ)Access數(shù)據(jù)庫的一些局限性。給出了在同一ASP頁面中訪問多個(gè)Access數(shù)據(jù)庫的三種簡單方法: 利用ASP+Cookie技術(shù)訪問不同數(shù)據(jù)庫;利用FOR循環(huán)結(jié)構(gòu)+Cookie技術(shù)同時(shí)訪問多個(gè)數(shù)據(jù)庫;利用FOR循環(huán)結(jié)構(gòu)+FSO組件同時(shí)訪問多個(gè)數(shù)據(jù)庫。給出了以上方法的ASP代碼。
關(guān)鍵詞:ASP;Access;多數(shù)據(jù)庫;網(wǎng)站建設(shè)
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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)略的實(shí)施,越來越多的教師根據(jù)自己的工作實(shí)際,嘗試建立具有獨(dú)立知識(shí)產(chǎn)權(quán)的教學(xué)資源網(wǎng)站。由于ASP技術(shù)成熟,簡單易學(xué);Microsoft Office是教師常用的辦公系統(tǒng),其集成的Access數(shù)據(jù)庫簡單好用;基于ASP+Access架構(gòu)的網(wǎng)站架設(shè)簡單,空間服務(wù)商廣泛支持,適合非專業(yè)人員架設(shè)動(dòng)態(tài)網(wǎng)站。因此,許多教師采用ASP+Access架構(gòu)構(gòu)建自己的教學(xué)資源網(wǎng)站。
但Access本身具有一定的局限性(見Microsoft Access軟件中的幫助信息),如:庫文件不能太大;最多只支持255個(gè)并發(fā)用戶,實(shí)際運(yùn)行中支持的更少;單表記錄數(shù)不能太多,否則運(yùn)行明顯變慢。為克服以上不足,采用ASP+Access架構(gòu)開發(fā)項(xiàng)目時(shí),把以往只使用一個(gè)核心數(shù)據(jù)庫的設(shè)計(jì),改成使用多個(gè)同構(gòu)數(shù)據(jù)庫設(shè)計(jì),這些同構(gòu)數(shù)據(jù)庫由系統(tǒng)根據(jù)后臺(tái)設(shè)置的數(shù)據(jù)類別動(dòng)態(tài)生成。實(shí)踐證明,這一方法有效彌補(bǔ)了Access數(shù)據(jù)庫容量小、并發(fā)訪問用戶少等不足,并且增加了網(wǎng)站使用的智能性和廣泛性。
2 多數(shù)據(jù)庫的建立
項(xiàng)目網(wǎng)站中共設(shè)計(jì)兩類數(shù)據(jù)庫:一類是基本信息數(shù)據(jù)庫,只有一個(gè),用于存儲(chǔ)數(shù)據(jù)類別、對(duì)應(yīng)的核心數(shù)據(jù)庫編號(hào)、用戶登錄信息等基本信息,由后臺(tái)管理員管理;一類是核心數(shù)據(jù)庫,由多個(gè)數(shù)據(jù)庫組成,用于存儲(chǔ)網(wǎng)站提供的各種資源信息、網(wǎng)站用戶輸入的數(shù)據(jù)等,不同類別的數(shù)據(jù)單獨(dú)建庫,以編號(hào)區(qū)分,即本文所指的多數(shù)據(jù)庫。
在建立網(wǎng)站的核心數(shù)據(jù)庫時(shí),首先根據(jù)實(shí)際需要建立模板數(shù)據(jù)庫,命名為Datamodel.mdb。運(yùn)行時(shí),系統(tǒng)根據(jù)管理員設(shè)置的不同數(shù)據(jù)類別,利用模板數(shù)據(jù)庫動(dòng)態(tài)生成編號(hào)不同的系列同構(gòu)數(shù)據(jù)庫,可分別命名為data11.mdb、data12.mdb、…,data21.mdb、data22.mdb、…,data31.mdb、data32.mdb、…,等等,數(shù)據(jù)庫名稱中的數(shù)字為基本信息庫中的數(shù)據(jù)類別編號(hào),取1~99范圍內(nèi)的半角英文數(shù)字。
這樣,就需要解決兩個(gè)問題:一是用戶在操作不同的數(shù)據(jù)類別時(shí),需要訪問不同的數(shù)據(jù)庫;二是在數(shù)據(jù)統(tǒng)計(jì)時(shí)需要同時(shí)查詢多個(gè)數(shù)據(jù)庫。采用以下方法,較好地解決了以上問題,簡單易行,不需要太深的專業(yè)知識(shí),特別適合非專業(yè)人員采用。
3 多數(shù)據(jù)庫的訪問方法
3.1 利用ASP+Cookie技術(shù)動(dòng)態(tài)訪問不同數(shù)據(jù)庫
用戶訪問網(wǎng)站時(shí),根據(jù)用戶選擇的數(shù)據(jù)類別不同,系統(tǒng)將對(duì)應(yīng)的數(shù)據(jù)庫編號(hào)寫入Cookie(Reponse.cookies("userinfo")("chnum")=編號(hào)變量)。在數(shù)據(jù)庫連接文件中讀出Cookie中的編號(hào),賦值給數(shù)據(jù)庫編號(hào)變量,根據(jù)編號(hào)變量建立相應(yīng)數(shù)據(jù)庫的連接。這樣就實(shí)現(xiàn)了根據(jù)用戶選擇動(dòng)態(tài)建立不同數(shù)據(jù)庫的連接。
連接文件conn.asp代碼如下:
<% dim chnum
chnum=Request.cookies("userinfo")("chnum")
db="data/data"&chnum;&".mdb"‘?dāng)?shù)據(jù)庫存儲(chǔ)路徑為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
%>
…
通過這種方法,實(shí)現(xiàn)了動(dòng)態(tài)訪問不同數(shù)據(jù)庫的目的。
3.2 利用FOR循環(huán)結(jié)構(gòu)+Cookie技術(shù)同時(shí)訪問多個(gè)數(shù)據(jù)庫
網(wǎng)站在統(tǒng)計(jì)數(shù)據(jù)時(shí),要根據(jù)統(tǒng)計(jì)需要訪問多個(gè)乃至所有核心數(shù)據(jù)庫(data11.mdb、data12.mdb、…,data21.mdb、data22.mdb、…,data31.mdb、data32.mdb、…)。后臺(tái)管理員和用戶可能并不知道究竟有多少個(gè)數(shù)據(jù)庫,也不知道數(shù)據(jù)庫文件名。可利用ASP的FOR循環(huán)結(jié)構(gòu)和瀏覽器的Cookie技術(shù)實(shí)現(xiàn)多個(gè)數(shù)據(jù)庫的同時(shí)查詢。
通過瀏覽器打開統(tǒng)計(jì)頁面,首先將基本信息數(shù)據(jù)庫中的所有數(shù)據(jù)類別對(duì)應(yīng)的數(shù)據(jù)庫編號(hào)分別寫入Cookie。在數(shù)據(jù)庫連接文件中讀出Cookie中的編號(hào)值,賦值給數(shù)據(jù)庫編號(hào)變量,根據(jù)編號(hào)變量建立相應(yīng)數(shù)據(jù)庫的連接。這樣就實(shí)現(xiàn)了動(dòng)態(tài)建立多個(gè)數(shù)據(jù)庫的連接。
連接文件connmulti. asp代碼如下:
<%dim j,dbnum(99),connstr(99),conndb(99)
for j=1 to 99‘j的范圍可根據(jù)實(shí)際情況指定
coochnum=Request.dookies("userinfo")("chnum"&j;)‘從Cookie中讀出數(shù)據(jù)庫編號(hào)
if coochnum<>"" then ‘非空的為有效編號(hào),數(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‘判斷是否建立了連接,對(duì)應(yīng)連接文件中的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
…%>
…
通過這種方法,實(shí)現(xiàn)了在一個(gè)ASP頁面訪問多個(gè)數(shù)據(jù)庫的目的。
3.3 利用FOR循環(huán)結(jié)構(gòu)+FSO組件同時(shí)訪問多個(gè)數(shù)據(jù)庫
如果覺得使用Cookie技術(shù)比較麻煩,在建立多數(shù)據(jù)庫的連接時(shí),可用FSO組件判斷數(shù)據(jù)庫是否存在,但需要遠(yuǎn)程服務(wù)器支持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中的相應(yīng)代碼,此處略。
這種方法要在所有數(shù)據(jù)庫都有效的情況下使用。如果路
徑中存在廢棄的數(shù)據(jù)庫,可能導(dǎo)致錯(cuò)誤的結(jié)果。在這里仍可結(jié)合Cookie技術(shù),以避免出錯(cuò)。
4 結(jié)束語
以上方法均在實(shí)際項(xiàng)目中驗(yàn)證通過,達(dá)到預(yù)期效果。實(shí)際項(xiàng)目中,可根據(jù)需要調(diào)整FOR循環(huán)變量的范圍,一般設(shè)置為1~99,就可滿足各學(xué)科教學(xué)資源網(wǎng)站的需要。當(dāng)數(shù)據(jù)庫數(shù)量較多時(shí),查詢的速度會(huì)有一定下降。但現(xiàn)在的計(jì)算機(jī)運(yùn)行速度都很快,而且同時(shí)訪問多數(shù)據(jù)庫的頁面很少,因此,這樣的設(shè)計(jì)不會(huì)對(duì)網(wǎng)站的運(yùn)行速度有太大的影響。如果同時(shí)查詢的數(shù)據(jù)庫個(gè)數(shù)很少,且數(shù)據(jù)庫名稱確定,則沒必要用以上方法,直接建立數(shù)據(jù)庫連接即可。
參考文獻(xiàn):
[1] 劉瑞新.ASP網(wǎng)頁數(shù)據(jù)庫短訓(xùn)教程[M].北京:機(jī)械工業(yè)出版社,2004年:205-237.
[2] 楊英潔.簡析ASP的數(shù)據(jù)庫連接[J].電腦知識(shí)與技術(shù),2009(5):1031,1043.
[通聯(lián)編輯:王力]