今天俺在這裡給大家提供一種資料庫操作的思路,這些代碼是俺在長期的ASP應用中不斷完成和修正的,也已經用它完成了很多項目了,應該說直接拿去用是沒有問題的。當然本人能力也有限,希望大家一起來討論。
說明:此帖代碼均是VBScript版本。另外最好你對手寫ASP已經有一定的基礎。
先簡單介紹一下俺這個類的一些特點:
可同時操作多個不同類型的資料庫。
完全不用考慮資料類型的差別,再也不用想字元型欄位加不加單引號。
調用非常簡單,對資料庫的主要操作一般只需要一行代碼。
支援mssql交易回復。
可自動產生和輸出sql語句方便調試。
使用方法:
1. 修改clsDbctrl.asp檔案中的第1行為你自己的資料庫位置(修改方法參考下面的CreatConn函數說明)。如需串連多個資料庫可自行添加,格式相同。
2. 在你建立的asp檔案中包含此asp檔案。如:
<!--#include file="Inc/clsDbctrl.asp" --> 或者:
<!--#include virtual="/Inc/clsDbctrl.asp"-->
3.使用如下代碼應用此類:
一個資料庫連接:
<%
OpenConn() '開啟資料庫連接
Dim db : Set db = New DbCtrl '建立對像
'Your Code Here......
Co(db) : CloseConn() '釋放對象,關閉資料庫連接
%>
或者(一個或者多個資料庫連接):
<%
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.具體操作的例子可以參考各函數說明內的程式碼範例。
方法和屬性概覽(詳細用法及例子在下面):
引用:
CreatConn 產生資料庫連接字串
Oc 建立資料庫連接
Co 釋放對像
OpenConn 開啟預設資料庫串連
CloseConn 關閉預設資料庫串連
dbCtrl.dbConn 屬性,擷取要操作的資料庫連接,預設值為Conn
dbCtrl.dbErr 屬性,唯讀,輸出捕獲的錯誤資訊
dbCtrl.Version 屬性,唯讀,程式版本資訊
dbCtrl.AutoId 方法,自動擷取唯一序號
dbCtrl.GetRecord 方法,取得合格紀錄集
dbCtrl.GetRecordBySql 方法,根據sql語句取得紀錄集
dbCtrl.GetRecordDetail 方法,根據某一條指定紀錄的詳細資料
dbCtrl.AddRecord 方法,添加一個新的紀錄
dbCtrl.UpdateRecord 方法,根據指定條件更新紀錄
dbCtrl.DeleteRecord 方法,刪除合格紀錄
dbCtrl.ReadTable 方法,根據指定條件擷取某條紀錄中的其他欄位的內容
dbCtrl.C 方法,關閉紀錄集對像
dbCtrl.wGetRecord,
dbCtrl.wAddRecord,
dbCtrl.wUpdateRecord,
dbCtrl.wDeleteRecord 這4個方法是取得相應的操作(前面加w)的sql語句
參數約定:
由於ASP沒有Arguments對象,不能使用動態參數,所以,在本類的代碼中,使用了Array(數組)來達到這一效果。本類中的部分參數可以使用數組(參數說明中有註明),但使用數組時應參照以下格式:
Array("Field1:Value1", "Field2:True", "Field3:100")
對,有點像json的格式,如果涉及到變數,那就這樣:
Array("Field1:" & Value1, "Field2:" & Value2, "Field3:" & Value3)
可以這樣說,本類中的幾乎所有與資料庫欄位相關的內容都可以用以上的數組格式來設定條件或者是擷取內容。而這裡最大的特點就是在使用時不用去考慮欄位的類型,在欄位後跟一個冒號,接著跟上相應的值就行了。如果你經常手寫ASP程式的話,你很快就會感受到運用這種方式的魅力,除了資料類型不用考慮之外,它也很方便隨時添加和刪除條件。如果你還不明白怎麽用的話沒關係,下面有很多例子可以說明這個問題。
要把ASP的資料庫操作封裝起來其實並不難,相信大家以前自己也做過類似的代碼或是借用過其他人的封裝好的代碼。但是就如各位知道的一樣,使用封裝後的代碼一旦出錯,排錯是一個比較麻煩的事情,一般說來,封裝後操作越簡單的排錯也越複雜。俺在寫這些代碼的時候已經盡我所能考慮到如果出錯的話如何去排查錯誤,在儘可能簡化使用者操作資料庫的代碼的同時可以隨時輸出sql語句排查錯誤。
最後需要說明一點,本文所涉及的ASP資料庫操作並不適合大型資料,如你所知,操作大型資料最好還是使用預存程序之類的東東比較好,以後俺會考慮把對預存程序的操作也封裝進去。還有一個效率問題,要追求高效率的話,用ASP還是應該考慮COM+等,所以再次聲明,本類適用的對象是中小型ASP項目。
好了,下面奉上詳細使用說明:
一.資料庫連接
考慮到大多數人的使用習慣,在資料庫連接上使用了公用過程,所以需要大家在代碼裡自行修改,如果你已經建立了資料庫連接,把這幾行注釋掉就行了。代碼中內建了MSSql,Access,MySQL,Oracle4種資料庫的串連方式,當然你也可以自行在原始碼中增加或刪除。修改例如:
Dim a : a = CreatConn(0, "TestData", "localhost", "username", "userpassword")
Dim b : b = CreatConn(1, "Data/%TestDb%.mdb", "", "", "")
說明一下,第1個參數可以是字串。如果是使用Access,則第2個參數輸入相對路徑和絕對路徑都是可以的,如有密碼也可以在第5個參數中輸入,如:
Dim c : c = CreatConn("ACCESS", "E:\MyWeb\Data\%TestDB%.mdb", "", "", "mdbpassword")
相關函數:
原 型:CreatConn(dbType, strDB, strServer, strUid, strPwd)
功 能:建立資料庫連接字串
傳回值:String
參 數:
dbType : Integer or String 串連資料庫類型
(0 or "MSSQL") - Microsoft SQL Server
(1 or "ACCESS") - Microsoft Office Access
(2 or "MYSQL") - MySQL Server
(3 or "ORACLE") - oracle Server
strDB : String 資料庫名或資料庫地址(Access使用絕對或者相對路徑均可)
strServer : String 資料庫伺服器地址,Access請留空
strUid : String 資料庫使用者名稱,Access請留空
strPwd : String 資料庫密碼
原 型:Oc(connStr)
功 能:開啟資料庫連接
傳回值:Object 資料庫連接對像
參 數:
connStr : String 資料庫連接字串,由CreatConn函數產生
原 型:Co(obj)
功 能:關閉對像
參 數:
obj : Object 要關閉的對象名稱
原 型:OpenConn
功 能:開啟預設資料庫串連,會自動建立一個名稱為Conn的串連對像
參 數:無
原 型:CloseConn
功 能:關閉名稱為Conn的預設資料庫串連對像
參 數:無
二. 資料庫操作
下面就是本資料庫操作類的函數功能說明,應該算是手冊了,請多看例子的應用。
原 型:dbCtrl.dbConn(objConn)
功 能:擷取資料庫連接對像
參 數:
objConn : Object 已經建立的資料庫連接對像
舉 例:
Dim db : Set db = New DbCtrl
db.dbConn = Oc(CreatConn(1,"E:\WebSite\MySite\Data\%TestDb%.mdb","","",""))
Co(db)
說 明:此屬性為可選,如果不指定此屬性則預設資料連線為頁面上名稱為Conn的資料庫連接對像
原 型:dbCtrl.AutoID(TableName)
功 能:自動擷取唯一序號(自動編號)
傳回值:Integer
參 數:
TableName : String 需要獲得唯一序號的資料表名
舉 例:
Dim newId
newId = db.AutoId("TestTable")
Response.Write(newId)
原 型:dbCtrl.GetRecord(TableName,FieldsList,Condition,OrderField,ShowN)
功 能:取得合格紀錄集
傳回值:Object 紀錄集對像
參 數:
TableName : String 表名稱
FieldsList : String 欄位名稱,用逗號隔開,留空則為全部欄位
Condition : String or Array 查詢條件,如果是數組應遵循前面的參數約定
orderField : String 排序方式
ShowN : Integer 擷取紀錄的數量,相當於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)
對於以上的例子,用下面的數組方式指定條件是等價的:
Set rs = db.wGetRecord("TestTable","fId,fName,fAge", Array("fSex:男","IsActive:1"), "fName Asc", 0)
另外,你可以用下面的語句來查看這個函數產生的sql語句:
Response.Write(db.wGetRecord("TestTable","fId,fName,fAge", Array("fSex:男","IsActive:1"), "fName Asc", 0))
如你所見,只需要在原來的函數前加一個w即可。
原 型:dbCtrl.GetRecordBySQL(strSelect)
功 能:根據sql語句取得紀錄集
傳回值:Object 紀錄集對像
參 數:
strSelect : String 用於產生記錄集的SQL語句
舉 例:
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)
功 能:根據某一條指定紀錄的詳細資料
傳回值:Object 紀錄集對像
參 數:
TableName : String 表名稱
Condition : String or Array 查詢條件,如果是數組應遵循前面的參數約定
舉 例:
Dim rs, Id
Id = Request.QueryString("id")
Set rs = db.GetRecordDetail("TestTable","Id=" & id)
'Your Code here...
db.C(rs)
說 明:就像你已經看出來的一樣,這個最常用在開啟某個詳細頁面(比如新聞內容頁面)
原 型:dbCtrl.AddRecord(TableName, ValueList)
功 能:添加一個新的紀錄
傳回值:新記錄的Id號(成功) or 0 (失敗)
參 數:
TableName : String 表名稱
ValueList : Array 插入表的欄位和值,只能是數組且應遵循前面的參數約定
舉 例:
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("添加記錄成功!此記錄的自動編號Id為" & result)
End If
看見了吧,真的不用考慮欄位的類型是什麽滴。
如果你想要代碼中的欄位和值看得更清楚一點,也可以這樣寫,但憑卿之所好:
result = db.AddRecord("TestTable",Array("Name:" & fName,_
"Sex:" & fSex,_
"WorkYear:" & fWorkYear,_
"Birthday:" & fBirth,_
"IsActive:True"))
另外,你可以用下面的語句來查看這個函數產生的sql語句:
Response.Write(db.wAddRecord("TestTable",Array("Name:"&fName, "Sex:"&fSex, "WorkYear:"&fWorkYear, "Birthday:"&fBirth, "IsActive:True")))
說 明:返回的Id值用的是比較笨的方法,並不能保證在並發資料量大的時候的準確性,慎用。
原 型:dbCtrl.UpdateRecord(TableName, Condition, ValueList)
功 能:根據指定條件更新紀錄
傳回值:1 (成功) or 0 (失敗)
參 數:
TableName : String 表名稱
Condition : String or Array 更新條件,如果是數組應遵循前面的參數約定
ValueList : String or Array 更新的欄位及值,如果是數組應遵循前面的參數約定
舉 例:
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("更新資料成功!")
End If
另外,你可以用下面的語句來查看這個函數產生的sql語句:
Response.Write(db.wUpdateRecord("TestTable", "UId = 1308", Array("Name:"&fName, "WorkYear:"&fWorkYear)))
原 型:dbCtrl.DeleteRecord(TableName,IDFieldName,IDValues)
功 能:刪除合格紀錄
傳回值:1 (成功) or 0 (失敗)
參 數:
TableName : String 表名稱
IDFieldName : String 表的Id欄位的名稱
IDValues : String or Array 刪除條件,可以是由逗號隔開的多個Id號,如果是數組應遵循前面的參數約定
舉 例:
Dim ids, result
ids = Request.Form("selectid") '可以假設這裡擷取的值是 12, 34, 256, 314 (複選框提交的值都這樣)
result = db.DeleteRecord("TestTable", "UId", ids)
If result<>0 Then
Response.Write("刪除資料成功!")
End If
當然,你也可以用字串或者數組指定其它的條件,比如:
result = db.DeleteRecord("TestTable", "UId", "IsActive = 0 And FirstName = 'Tom'")
另外,你可以用下面的語句來查看這個函數產生的sql語句:
Response.Write(db.wDeleteRecord("TestTable", "UId", ids))
原 型:dbCtrl.ReadTable(TableName, Condition, GetFieldNames)
功 能:根據指定條件擷取某條紀錄中的其他欄位的內容
傳回值:String (GetFieldNames為單個欄位) or Array (GetFieldNames為多個欄位)
參 數:
TableName : String 表名稱
Condition : String or Array 查詢條件,如果是數組應遵循前面的參數約定
GetFieldNames : String 單個欄位名或者由逗號隔開的多個欄位名
舉 例:
Dim uid, result
uid = rs("postid") '假設這裡是頁面上某個記錄集中的使用者id值
result = db.ReadTable("UserTable","UId=" & uid, "UserName")
Response.Write("發佈者:" & result)
我不得不說,在實際應用中,這個函數可能是用得最多的,你上面看到的就是一個非常常用的例子,從一個值去擷取另外一個表中某欄位值等於該值的另外一個欄位的值(有點拗口,不過確實就是這個意思)。下面的例子將告訴你如何根據這個值獲得多個相應的值。
Dim uid, result
uid = rs("postid") '假設這裡是頁面上某個記錄集中的使用者id值
result = db.ReadTable("UserTable","UId=" & uid, "UserName,UserSex,UserAge")
Response.Write("發佈者:" & result(0) & "<br /> 性別:" & result(1) & "<br /> 年齡:" &result(2))
如你所見,就這麽簡單,輸入多個欄位名稱得到的是一個數組。
原 型:dbCtrl.C(objRs)
功 能:關閉紀錄集對像
參 數:
objRs : Object 頁面上的某個記錄集對像
舉 例:
Dim rs
Set rs = db.GetRecordDetail("TestTable","Id=123" )
'Your Code here...
db.C(rs)
這個函數上面的許多例子都用了,就不多解釋了,它等同於rs.close : set rs = nothing。
clsDbctrl.rar