主頁(yè) > 知識(shí)庫(kù) > ASP操作數(shù)據(jù)庫(kù)的類

ASP操作數(shù)據(jù)庫(kù)的類

熱門標(biāo)簽:Mysql連接數(shù)設(shè)置 阿里云 科大訊飛語(yǔ)音識(shí)別系統(tǒng) Linux服務(wù)器 服務(wù)器配置 電子圍欄 銀行業(yè)務(wù) 團(tuán)購(gòu)網(wǎng)站
今天俺在這裡給大家提供一種數(shù)據(jù)庫(kù)操作的思路,這些代碼是俺在長(zhǎng)期的ASP應(yīng)用中不斷完成和修正的,也已經(jīng)用它完成了很多項(xiàng)目了,應(yīng)該說(shuō)直接拿去用是沒(méi)有問(wèn)題的。當(dāng)然本人能力也有限,希望大家一起來(lái)討論。


說(shuō)明:此帖代碼均是VBScript版本。另外最好你對(duì)手寫ASP已經(jīng)有一定的基礎(chǔ)。

先簡(jiǎn)單介紹一下俺這個(gè)類的一些特點(diǎn):

可同時(shí)操作多個(gè)不同類型的數(shù)據(jù)庫(kù)。
完全不用考慮數(shù)據(jù)類型的差別,再也不用想字符型字段加不加單引號(hào)。
調(diào)用非常簡(jiǎn)單,對(duì)數(shù)據(jù)庫(kù)的主要操作一般只需要一行代碼。
支持mssql事務(wù)回滾。
可自動(dòng)生成和輸出sql語(yǔ)句方便調(diào)試。
使用方法:

1. 修改clsDbctrl.asp文件中的第1行為你自己的數(shù)據(jù)庫(kù)位置(修改方法參考下面的CreatConn函數(shù)說(shuō)明)。如需連接多個(gè)數(shù)據(jù)庫(kù)可自行添加,格式相同。

2. 在你新建的asp文件中包含此asp文件。如:
!--#include file="Inc/clsDbctrl.asp" --> 或者:
!--#include virtual="/Inc/clsDbctrl.asp"-->

3.使用如下代碼應(yīng)用此類:
一個(gè)數(shù)據(jù)庫(kù)連接:

%
OpenConn() '打開(kāi)數(shù)據(jù)庫(kù)連接
Dim db : Set db = New DbCtrl '建立對(duì)像
'Your Code Here......
Co(db) : CloseConn() '釋放對(duì)象,關(guān)閉數(shù)據(jù)庫(kù)連接
%>

或者(一個(gè)或者多個(gè)數(shù)據(jù)庫(kù)連接):

%
Dim db1 : Set db1 = New DbCtrl : db1.dbConn = Oc(a)
Dim db2 : Set db2 = New DbCtrl : db2.dbConn = Oc(b)
'Your Code Here......
Co(db1) : Co(db2)
%>

4.具體操作的例子可以參考各函數(shù)說(shuō)明內(nèi)的代碼示例。

方法和屬性概覽(詳細(xì)用法及例子在下面):

引用:
CreatConn 生成數(shù)據(jù)庫(kù)連接字符串
Oc 建立數(shù)據(jù)庫(kù)連接
Co 釋放對(duì)像
OpenConn 打開(kāi)默認(rèn)數(shù)據(jù)庫(kù)連接
CloseConn 關(guān)閉默認(rèn)數(shù)據(jù)庫(kù)連接
dbCtrl.dbConn 屬性,獲取要操作的數(shù)據(jù)庫(kù)連接,默認(rèn)值為Conn
dbCtrl.dbErr 屬性,只讀,輸出捕獲的錯(cuò)誤信息
dbCtrl.Version 屬性,只讀,程序版本信息
dbCtrl.AutoId 方法,自動(dòng)獲取唯一序列號(hào)
dbCtrl.GetRecord 方法,取得符合條件的紀(jì)錄集
dbCtrl.GetRecordBySql 方法,根據(jù)sql語(yǔ)句取得紀(jì)錄集
dbCtrl.GetRecordDetail 方法,根據(jù)某一條指定紀(jì)錄的詳細(xì)數(shù)據(jù)
dbCtrl.AddRecord 方法,添加一個(gè)新的紀(jì)錄
dbCtrl.UpdateRecord 方法,根據(jù)指定條件更新紀(jì)錄
dbCtrl.DeleteRecord 方法,刪除符合條件的紀(jì)錄
dbCtrl.ReadTable 方法,根據(jù)指定條件獲取某條紀(jì)錄中的其他字段的內(nèi)容
dbCtrl.C 方法,關(guān)閉紀(jì)錄集對(duì)像
dbCtrl.wGetRecord,
dbCtrl.wAddRecord,
dbCtrl.wUpdateRecord,
dbCtrl.wDeleteRecord 這4個(gè)方法是取得相應(yīng)的操作(前面加w)的sql語(yǔ)句


參數(shù)約定:

由于ASP沒(méi)有Arguments對(duì)象,不能使用動(dòng)態(tài)參數(shù),所以,在本類的代碼中,使用了Array(數(shù)組)來(lái)達(dá)到這一效果。本類中的部分參數(shù)可以使用數(shù)組(參數(shù)說(shuō)明中有注明),但使用數(shù)組時(shí)應(yīng)參照以下格式:

Array("Field1:Value1", "Field2:True", "Field3:100")

對(duì),有點(diǎn)像json的格式,如果涉及到變量,那就這樣:

Array("Field1:" Value1, "Field2:" Value2, "Field3:" Value3)

可以這樣說(shuō),本類中的幾乎所有與數(shù)據(jù)庫(kù)字段相關(guān)的內(nèi)容都可以用以上的數(shù)組格式來(lái)設(shè)置條件或者是獲取內(nèi)容。而這裡最大的特點(diǎn)就是在使用時(shí)不用去考慮字段的類型,在字段后跟一個(gè)冒號(hào),接著跟上相應(yīng)的值就行了。如果你經(jīng)常手寫ASP程序的話,你很快就會(huì)感受到運(yùn)用這種方式的魅力,除了數(shù)據(jù)類型不用考慮之外,它也很方便隨時(shí)添加和刪除條件。如果你還不明白怎麼用的話沒(méi)關(guān)係,下面有很多例子可以說(shuō)明這個(gè)問(wèn)題。

要把ASP的數(shù)據(jù)庫(kù)操作封裝起來(lái)其實(shí)并不難,相信大家以前自己也做過(guò)類似的代碼或是借用過(guò)其他人的封裝好的代碼。但是就如各位知道的一樣,使用封裝后的代碼一旦出錯(cuò),排錯(cuò)是一個(gè)比較麻煩的事情,一般說(shuō)來(lái),封裝后操作越簡(jiǎn)單的排錯(cuò)也越複雜。俺在寫這些代碼的時(shí)候已經(jīng)盡我所能考慮到如果出錯(cuò)的話如何去排查錯(cuò)誤,在盡可能簡(jiǎn)化用戶操作數(shù)據(jù)庫(kù)的代碼的同時(shí)可以隨時(shí)輸出sql語(yǔ)句排查錯(cuò)誤。

最后需要說(shuō)明一點(diǎn),本文所涉及的ASP數(shù)據(jù)庫(kù)操作并不適合大型數(shù)據(jù),如你所知,操作大型數(shù)據(jù)最好還是使用存儲(chǔ)過(guò)程之類的東東比較好,以后俺會(huì)考慮把對(duì)存儲(chǔ)過(guò)程的操作也封裝進(jìn)去。還有一個(gè)效率問(wèn)題,要追求高效率的話,用ASP還是應(yīng)該考慮COM+等,所以再次聲明,本類適用的對(duì)象是中小型ASP項(xiàng)目。

好了,下面奉上詳細(xì)使用說(shuō)明:

一.?dāng)?shù)據(jù)庫(kù)連接

考慮到大多數(shù)人的使用習(xí)慣,在數(shù)據(jù)庫(kù)連接上使用了公共過(guò)程,所以需要大家在代碼裡自行修改,如果你已經(jīng)建立了數(shù)據(jù)庫(kù)連接,把這幾行注釋掉就行了。代碼中內(nèi)置了MSSql,Access,MySQL,Oracle4種數(shù)據(jù)庫(kù)的連接方式,當(dāng)然你也可以自行在源代碼中增加或刪除。修改例如:

Dim a : a = CreatConn(0, "TestData", "localhost", "username", "userpassword")
Dim b : b = CreatConn(1, "Data/%TestDb%.mdb", "", "", "")

說(shuō)明一下,第1個(gè)參數(shù)可以是字符串。如果是使用Access,則第2個(gè)參數(shù)輸入相對(duì)路徑和絕對(duì)路徑都是可以的,如有密碼也可以在第5個(gè)參數(shù)中輸入,如:

Dim c : c = CreatConn("ACCESS", "E:\MyWeb\Data\%TestDB%.mdb", "", "", "mdbpassword")

相關(guān)函數(shù):

原 型:CreatConn(dbType, strDB, strServer, strUid, strPwd)
功 能:建立數(shù)據(jù)庫(kù)連接字符串
返回值:String
參 數(shù):
dbType : Integer or String 連接數(shù)據(jù)庫(kù)類型
(0 or "MSSQL") - Microsoft SQL Server
(1 or "ACCESS") - Microsoft Office Access
(2 or "MYSQL") - MySQL Server
(3 or "ORACLE") - oracle Server
strDB : String 數(shù)據(jù)庫(kù)名或數(shù)據(jù)庫(kù)地址(Access使用絕對(duì)或者相對(duì)路徑均可)
strServer : String 數(shù)據(jù)庫(kù)服務(wù)器地址,Access請(qǐng)留空
strUid : String 數(shù)據(jù)庫(kù)用戶名,Access請(qǐng)留空
strPwd : String 數(shù)據(jù)庫(kù)密碼

原 型:Oc(connStr)
功 能:打開(kāi)數(shù)據(jù)庫(kù)連接
返回值:Object 數(shù)據(jù)庫(kù)連接對(duì)像
參 數(shù):
connStr : String 數(shù)據(jù)庫(kù)連接字符串,由CreatConn函數(shù)生成

原 型:Co(obj)
功 能:關(guān)閉對(duì)像
參 數(shù):
obj : Object 要關(guān)閉的對(duì)象名稱

原 型:OpenConn
功 能:打開(kāi)默認(rèn)數(shù)據(jù)庫(kù)連接,會(huì)自動(dòng)建立一個(gè)名稱為Conn的連接對(duì)像
參 數(shù):無(wú)

原 型:CloseConn
功 能:關(guān)閉名稱為Conn的默認(rèn)數(shù)據(jù)庫(kù)連接對(duì)像
參 數(shù):無(wú)

二. 數(shù)據(jù)庫(kù)操作

下面就是本數(shù)據(jù)庫(kù)操作類的函數(shù)功能說(shuō)明,應(yīng)該算是手冊(cè)了,請(qǐng)多看例子的應(yīng)用。

原 型:dbCtrl.dbConn(objConn)
功 能:獲取數(shù)據(jù)庫(kù)連接對(duì)像
參 數(shù):
objConn : Object 已經(jīng)建立的數(shù)據(jù)庫(kù)連接對(duì)像
舉 例:
Dim db : Set db = New DbCtrl
db.dbConn = Oc(CreatConn(1,"E:\WebSite\MySite\Data\%TestDb%.mdb","","",""))
Co(db)

說(shuō) 明:此屬性為可選,如果不指定此屬性則默認(rèn)數(shù)據(jù)連接為頁(yè)面上名稱為Conn的數(shù)據(jù)庫(kù)連接對(duì)像

原 型:dbCtrl.AutoID(TableName)
功 能:自動(dòng)獲取唯一序列號(hào)(自動(dòng)編號(hào))
返回值:Integer
參 數(shù):
TableName : String 需要獲得唯一序列號(hào)的數(shù)據(jù)表名
舉 例:
Dim newId
newId = db.AutoId("TestTable")
Response.Write(newId)

原 型:dbCtrl.GetRecord(TableName,FieldsList,Condition,OrderField,ShowN)
功 能:取得符合條件的紀(jì)錄集
返回值:Object 紀(jì)錄集對(duì)像
參 數(shù):
TableName : String 表名稱
FieldsList : String 字段名稱,用逗號(hào)隔開(kāi),留空則為全部字段
Condition : String or Array 查詢條件,如果是數(shù)組應(yīng)遵循前面的參數(shù)約定
orderField : String 排序方式
ShowN : Integer 獲取紀(jì)錄的數(shù)量,相當(dāng)于sql中的 Select Top N
舉 例:
Dim rs
Set rs = db.GetRecord("TestTable","fId,fName,fAge","fSex='男' And IsActive = 1","fName Asc", 0)
While Not rs.eof
Response.Write ("Name is:" rs(1) " Age is:" rs(2) "br />")
rs.movenext()
Wend
db.C(rs)

對(duì)于以上的例子,用下面的數(shù)組方式指定條件是等價(jià)的:

Set rs = db.wGetRecord("TestTable","fId,fName,fAge", Array("fSex:男","IsActive:1"), "fName Asc", 0)

另外,你可以用下面的語(yǔ)句來(lái)查看這個(gè)函數(shù)生成的sql語(yǔ)句:

Response.Write(db.wGetRecord("TestTable","fId,fName,fAge", Array("fSex:男","IsActive:1"), "fName Asc", 0))

如你所見(jiàn),只需要在原來(lái)的函數(shù)前加一個(gè)w即可。

原 型:dbCtrl.GetRecordBySQL(strSelect)
功 能:根據(jù)sql語(yǔ)句取得紀(jì)錄集
返回值:Object 紀(jì)錄集對(duì)像
參 數(shù):
strSelect : String 用于生成記錄集的SQL語(yǔ)句
舉 例:
Dim rs
Set rs = db.GetRecordBySQL("Select a.Id, a.LastName, b.Group From User a InnerJoin Depart b On a.GroupId = b.GroupId")
'Your Code Here ...
db.C(rs)

原 型:dbCtrl.GetRecordDetail(TableName, Condition)
功 能:根據(jù)某一條指定紀(jì)錄的詳細(xì)數(shù)據(jù)
返回值:Object 紀(jì)錄集對(duì)像
參 數(shù):
TableName : String 表名稱
Condition : String or Array 查詢條件,如果是數(shù)組應(yīng)遵循前面的參數(shù)約定
舉 例:
Dim rs, Id
Id = Request.QueryString("id")
Set rs = db.GetRecordDetail("TestTable","Id=" id)
'Your Code here...
db.C(rs)

說(shuō) 明:就像你已經(jīng)看出來(lái)的一樣,這個(gè)最常用在打開(kāi)某個(gè)詳細(xì)頁(yè)面(比如新聞內(nèi)容頁(yè)面)

原 型:dbCtrl.AddRecord(TableName, ValueList)
功 能:添加一個(gè)新的紀(jì)錄
返回值:新記錄的Id號(hào)(成功) or 0 (失敗)
參 數(shù):
TableName : String 表名稱
ValueList : Array 插入表的字段和值,只能是數(shù)組且應(yīng)遵循前面的參數(shù)約定
舉 例:
Dim fName, fSex, fWorkYear, fBirth
fName = "王二壇"
fSex = "男"
fWorkYear = 12
fBirth = Cdate("1981-10-23")
Dim result
result = db.AddRecord("TestTable",Array("Name:"fName, "Sex:"fSex, "WorkYear:"fWorkYear, "Birthday:"fBirth, "IsActive:True"))
If result>0 Then
Response.Write("添加記錄成功!此記錄的自動(dòng)編號(hào)Id為" result)
End If

看見(jiàn)了吧,真的不用考慮字段的類型是什麼滴。
如果你想要代碼中的字段和值看得更清楚一點(diǎn),也可以這樣寫,但憑卿之所好:

result = db.AddRecord("TestTable",Array("Name:" fName,_
"Sex:" fSex,_
"WorkYear:" fWorkYear,_
"Birthday:" fBirth,_
"IsActive:True"))

另外,你可以用下面的語(yǔ)句來(lái)查看這個(gè)函數(shù)生成的sql語(yǔ)句:

Response.Write(db.wAddRecord("TestTable",Array("Name:"fName, "Sex:"fSex, "WorkYear:"fWorkYear, "Birthday:"fBirth, "IsActive:True")))

說(shuō) 明:返回的Id值用的是比較笨的方法,并不能保證在并發(fā)數(shù)據(jù)量大的時(shí)候的準(zhǔn)確性,慎用。

原 型:dbCtrl.UpdateRecord(TableName, Condition, ValueList)
功 能:根據(jù)指定條件更新紀(jì)錄
返回值:1 (成功) or 0 (失敗)
參 數(shù):
TableName : String 表名稱
Condition : String or Array 更新條件,如果是數(shù)組應(yīng)遵循前面的參數(shù)約定
ValueList : String or Array 更新的字段及值,如果是數(shù)組應(yīng)遵循前面的參數(shù)約定
舉 例:
Dim fName, fWorkYear
fName = "王三壇"
fWorkYear = 10
Dim result
result = db.UpdateRecord("TestTable", "UId = 1308", Array("Name:"fName, "WorkYear:"fWorkYear))
If result>0 Then
Response.Write("更新數(shù)據(jù)成功!")
End If

另外,你可以用下面的語(yǔ)句來(lái)查看這個(gè)函數(shù)生成的sql語(yǔ)句:

Response.Write(db.wUpdateRecord("TestTable", "UId = 1308", Array("Name:"fName, "WorkYear:"fWorkYear)))

原 型:dbCtrl.DeleteRecord(TableName,IDFieldName,IDValues)
功 能:刪除符合條件的紀(jì)錄
返回值:1 (成功) or 0 (失敗)
參 數(shù):
TableName : String 表名稱
IDFieldName : String 表的Id字段的名稱
IDValues : String or Array 刪除條件,可以是由逗號(hào)隔開(kāi)的多個(gè)Id號(hào),如果是數(shù)組應(yīng)遵循前面的參數(shù)約定
舉 例:
Dim ids, result
ids = Request.Form("selectid") '可以假設(shè)這裡獲取的值是 12, 34, 256, 314 (復(fù)選框提交的值都這樣)
result = db.DeleteRecord("TestTable", "UId", ids)
If result>0 Then
Response.Write("刪除數(shù)據(jù)成功!")
End If

當(dāng)然,你也可以用字符串或者數(shù)組指定其它的條件,比如:

result = db.DeleteRecord("TestTable", "UId", "IsActive = 0 And FirstName = 'Tom'")

另外,你可以用下面的語(yǔ)句來(lái)查看這個(gè)函數(shù)生成的sql語(yǔ)句:

Response.Write(db.wDeleteRecord("TestTable", "UId", ids))

原 型:dbCtrl.ReadTable(TableName, Condition, GetFieldNames)
功 能:根據(jù)指定條件獲取某條紀(jì)錄中的其他字段的內(nèi)容
返回值:String (GetFieldNames為單個(gè)字段) or Array (GetFieldNames為多個(gè)字段)
參 數(shù):
TableName : String 表名稱
Condition : String or Array 查詢條件,如果是數(shù)組應(yīng)遵循前面的參數(shù)約定
GetFieldNames : String 單個(gè)字段名或者由逗號(hào)隔開(kāi)的多個(gè)字段名
舉 例:
Dim uid, result
uid = rs("postid") '假設(shè)這裡是頁(yè)面上某個(gè)記錄集中的用戶id值
result = db.ReadTable("UserTable","UId=" uid, "UserName")
Response.Write("發(fā)佈者:" result)

我不得不說(shuō),在實(shí)際應(yīng)用中,這個(gè)函數(shù)可能是用得最多的,你上面看到的就是一個(gè)非常常用的例子,從一個(gè)值去獲取另外一個(gè)表中某字段值等于該值的另外一個(gè)字段的值(有點(diǎn)拗口,不過(guò)確實(shí)就是這個(gè)意思)。下面的例子將告訴你如何根據(jù)這個(gè)值獲得多個(gè)相應(yīng)的值。

Dim uid, result
uid = rs("postid") '假設(shè)這裡是頁(yè)面上某個(gè)記錄集中的用戶id值
result = db.ReadTable("UserTable","UId=" uid, "UserName,UserSex,UserAge")
Response.Write("發(fā)佈者:" result(0) "br /> 性別:" result(1) "br /> 年齡:" result(2))

如你所見(jiàn),就這麼簡(jiǎn)單,輸入多個(gè)字段名稱得到的是一個(gè)數(shù)組。

原 型:dbCtrl.C(objRs)
功 能:關(guān)閉紀(jì)錄集對(duì)像
參 數(shù):
objRs : Object 頁(yè)面上的某個(gè)記錄集對(duì)像
舉 例:
Dim rs
Set rs = db.GetRecordDetail("TestTable","Id=123" )
'Your Code here...
db.C(rs)

這個(gè)函數(shù)上面的許多例子都用了,就不多解釋了,它等同于rs.close : set rs = nothing。
clsDbctrl.rar

標(biāo)簽:萍鄉(xiāng) 廣元 衢州 江蘇 棗莊 衡水 大理 蚌埠

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ASP操作數(shù)據(jù)庫(kù)的類》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266