Cnn.Open "Provider=sqloledb; User ID=sa; PassWord=; Initial Catalog=pubs; Data Source=ICBCZJP" 'Cnn.Open "Provider=sqloledb; User ID=sa; Password=; Initial Catalog=; Data Source=ICBCZJP" 'Cnn.Open "Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pvbs; Data Source=ICBCZJP"
For I = 0 To Cnn.Errors.Count - 1 'Source屬性表示造成錯(cuò)誤的來源 Response.Write "[ " & Cnn.Errors(I).Source & " ] " 'Description屬性表示錯(cuò)誤發(fā)生原因或描述 Response.Write Cnn.Errors(I).Description & "<br>" Next
If Cnn.Errors.Count > 0 Then Response.Write "連接時(shí)發(fā)生 " & Cnn.Errors.Count & " 個(gè)錯(cuò)誤" & "<br>" End If
Set rsTest = Server.CreateObject("ADODB.Recordset") rsTest.Open "jobs",Cnn,adOpenForwardOnly,adLockReadOnly,adCmdTable
If rsTest.ActiveConnection.Errors.Count > 0 Then Set session("Errs") = rsTest.ActiveConnection.Errors Response.Redirect "ErrorHandle.asp" End If
Cnn.Close Set rsTest = Nothing : Set Cnn = Nothing %> ErrorHandle.asp代碼: <% Dim I For I = 0 To Session("Errs").Count - 1 Response.Write "[ " & Session("Errs")(I).Source & " ] " Response.Write Session("Errs")(I).Description & "<br>" Next %> 分析: 在本例中,錯(cuò)誤可能在連接時(shí)發(fā)生,也可能連接是正確的,但是在使用Recordset對(duì)象時(shí)發(fā)生了錯(cuò)誤。 另外,在后面的一段代碼中,將錯(cuò)誤集合放入一個(gè)會(huì)話對(duì)象中,以便在頁面之間調(diào)用(遇到錯(cuò)誤時(shí),轉(zhuǎn)向錯(cuò)誤處理頁面ErrorHandle.asp)。 實(shí)際上,你也完全可以將Recordset對(duì)象賦給Session對(duì)象,以實(shí)現(xiàn)記錄集在頁面之間的調(diào)用。
三、 使用事務(wù) 事務(wù)這一概念是非常簡(jiǎn)單和重要的,為了說明其用途,先假設(shè)出現(xiàn)了以下情況:例如在電子商務(wù)中,在網(wǎng)上進(jìn)行貨幣轉(zhuǎn)帳時(shí),必須從某一帳戶中減去某個(gè)數(shù)額并將其對(duì)等數(shù)額添加到另一個(gè)帳戶。無論其中的哪個(gè)更新失敗,都將導(dǎo)致帳戶收支不平衡(要么這邊扣了,那邊沒有增加;要么這邊沒扣,那邊卻增加了)。如果使用事務(wù)進(jìn)行這些更改,便可確保只能選擇進(jìn)行全部更改或不作任何更改(不是被完全正確執(zhí)行,就是被全部取消)。 事務(wù)隸屬于Connection對(duì)象,Connection對(duì)象有三個(gè)與事務(wù)有關(guān)的方法: l BeginTrans 啟動(dòng)新的事務(wù)。 l CommitTrans 保存所有更改并結(jié)束當(dāng)前事務(wù)。 l RollbackTrans 取消當(dāng)前事務(wù)中所做的任何更改并結(jié)束事務(wù),通常稱為“回滾”。 我們不妨看一個(gè)實(shí)例wuf62.asp。 <%@ LANGUAGE="VBSCRIPT" %> <% Option Explicit %> <!--#include file="adovbs.inc"--> <% Response.Expires = 0 On Error Resume Next
Dim Cnn, StrSQL, rsTest Set Cnn = Server.CreateObject("ADODB.Connection") Cnn.Open "Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pubs; Data Source=ICBCZJP"
'下面第一句語句錯(cuò)誤, 第二句正確 StrSQL = "Update jobs_err SET job_desc = '事務(wù)' Where job_id = 14" 'StrSQL = "Update jobs SET job_desc = '事務(wù)' Where job_id = 14" Cnn.Execute StrSQL
If Cnn.Errors.Count > 0 Then Response.Write "發(fā)生錯(cuò)誤, 系統(tǒng)恢復(fù)事務(wù)開始時(shí)的狀態(tài), 既不會(huì)新增, 也不會(huì)修改" & "<br>" Cnn.RollbackTrans Else Response.Write "沒有錯(cuò)誤, 保存對(duì)數(shù)據(jù)庫(kù)的更改, 新增一條數(shù)據(jù), 修改一條數(shù)據(jù)" & "<br>" Cnn.CommitTrans End If
Set rsTest = Cnn.Execute("Select * From jobs where job_id>=14") While Not rsTest.EOF Response.Write rstest(0) & rstest(1) & rstest(2) & rstest(3) & "<br>" rsTest.MoveNext Wend
'該例僅為測(cè)試, 故恢復(fù)數(shù)據(jù)庫(kù)原來數(shù)據(jù) Cnn.Execute "Update jobs SET job_desc = 'Designer' Where job_id = 14" Cnn.Execute "DELETE jobs Where job_id > 14"
Cnn.Close: Set Cnn = Nothing %> 本例中,新增(Insert)和修改(Update)要么同時(shí)發(fā)生,要么都不發(fā)生,不會(huì)出現(xiàn)新增一條數(shù)據(jù),而修改卻因?yàn)檎Z句錯(cuò)誤未發(fā)生的情況。在數(shù)據(jù)庫(kù)編程時(shí)使用事務(wù)是一個(gè)非常好的習(xí)慣。
Dim Cnn, StrSQL, rsTest, I Set Cnn = Server.CreateObject("ADODB.Connection") Cnn.Open "Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pubs; Data Source=ICBCZJP"
Set rsTest = Server.CreateObject("ADODB.Recordset")
'檢索多個(gè)記錄集 StrSQL = "Select COUNT(*) AS '雇員數(shù)' From employee; Select * From jobs" rsTest.Open StrSQL, Cnn ', , ,adCmdText
While Not rsTest Is Nothing Response.Write "<Table Border = 2><tr>"
'rsTest.Fields.Count - 記錄集字段個(gè)數(shù) For I = 0 To rsTest.Fields.Count - 1 'rsTest(I).Name - 第 I 個(gè)字段的字段名 Response.Write "<td>" & rsTest(I).Name & "</td>" Next Response.Write "</tr>"
While Not rsTest.EOF Response.Write "<tr>" '用循環(huán)輸出每一個(gè)字段的值 For I = 0 To rsTest.Fields.Count - 1 Response.Write "<td>" & rsTest(I) & "</td>" Next Response.Write "</tr>" rsTest.MoveNext Wend
'讀取下一個(gè)Recordset對(duì)象 Set rsTest = rsTest.NextRecordset Wend
Cnn.Close Set rsTest = Nothing: Set Cnn = Nothing %> 說明:SQL Server數(shù)據(jù)庫(kù)支持多個(gè)記錄集,而Access數(shù)據(jù)庫(kù)不支持。