vb中的事務(wù)處理_第1頁
已閱讀1頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、 VB 中的事務(wù)處理有一下兩種方式: 1. conn.BeginTrans '開始'執(zhí)行語句conn.Execute sqlIf Err.Number = 0 Thenconn.CommitTrans '---提交事務(wù)Elseconn.RollbackTransactionMsgBox “失敗“End If2.On Error GoTo err_transintTrans = newConn.BeginTra

2、ns '開始事務(wù)newConn.Execute sqlnewConn.CommitTrans '提交事務(wù)intTrans = 0newConn.Close '關(guān)閉連接MsgBox “OK“exit_trans:Set newConn = Nothing '釋放對象Exit Sub '退出過程err_trans:

3、 '錯誤跳到這兒處理'如果是事務(wù)處理中出錯,則事務(wù)回滾If intTrans = 1 ThennewConn.RollbackTransEnd IfResume exit_trans看起來兩種方式都沒什么問題,但是在我的項目里使用第一種方式卻遇到 了一個很奇怪的錯誤,大家見 下圖:很明顯我使用的是 sql,不是存儲過程,而且我的 sql 在查詢分析器里運行insert into Sales(dish_id,uid) v

4、alues ('aaaa',2);“insert into Sales(dish_id,uid) values ('aaaa',2);“再次執(zhí)行,讓我驚訝的是居然彈出了“OK“,怎么會這樣呢,急忙查看數(shù)據(jù) 庫發(fā)現(xiàn)數(shù)據(jù)并沒有增加,還好!靜下心來思考,一番,大概對 VB 的事務(wù)形式做了如下推斷:1.正常情況下,正常執(zhí)行,這個沒有任何問題2.如果傳給 Execute 方法的 sql 不是一條語句,而是多條語句的

5、,那么:a. a.如果第一條語句發(fā)生了錯誤,那么它會跳到 如果第一條語句發(fā)生了錯誤,那么它會跳到 newConn.RollbackTrans newConn.RollbackTrans代碼處,正常的回滾事務(wù),如果在這 里我們需要返回值或者給出提示的話是可 代碼處,正常的回滾事務(wù),如果在這 里我們需要返回值或者給出提示的話是可以給出正確的提示的 以給出正確的提示的(可以返 回 可以返 回 false false 或者提示 操作失敗 或者

6、提示 操作失敗)b.b.如果在這多條 如果在這多條 sql sql 中,不是第一條發(fā)生錯誤的,那么就有問題了,你 中,不是第一條發(fā)生錯誤的,那么就有問題了,你會發(fā)現(xiàn),這時候無法給出正確的提示了,操作人員會看到返回 會發(fā)現(xiàn),這時候無法給出正確的提示了,操作人員會看到返回 true true,或者提示 ,或者提示操作成功,可是鬼魅的是數(shù)據(jù)庫里并沒有增加記錄 操作成功,可是鬼魅的是數(shù)據(jù)庫里并沒有增加記錄(包括前面正常的數(shù)據(jù)也沒有 包括前面正常

7、的數(shù)據(jù)也沒有被插入 被插入),我通過單步調(diào)試發(fā)現(xiàn),確實程序的并沒有執(zhí)行到 ,我通過單步調(diào)試發(fā)現(xiàn),確實程序的并沒有執(zhí)行到newConn.RollbackTrans newConn.RollbackTrans 這句代碼,可是數(shù)據(jù)確實回滾了,這說明了第一條語 這句代碼,可是數(shù)據(jù)確實回滾了,這說明了第一條語句執(zhí)行成功, 句執(zhí)行成功,VB VB 接收到了這個返回值,就把整個事務(wù)給 接收到了這個返回值,就把整個事務(wù)給 commit commit 了

8、,也就是說 了,也就是說這個回滾根本不是 這個回滾根本不是 VB VB 里面的 里面的 newConn.RollbackTrans newConn.RollbackTrans 代碼來完成的, 代碼來完成的,而是數(shù) 而是數(shù)據(jù)庫完成的 據(jù)庫完成的(字符型換成整型失敗 字符型換成整型失敗)由于一些特殊的業(yè)務(wù)需要,我們經(jīng)常會出現(xiàn)拼接 sql 的情況,也就是下面的情況:For j = 0 To 10 '注意減 1sql=sql &am

9、p; “insert into Sales(dish_id,uid) values.......“Next j我這里只是一些事例代碼,但是可以看出上面的 sql 已經(jīng)是 10 條 sql 了, 如果這時候調(diào)用 newConn.Execute sql,那么按照前面的分析,如果錯誤不是發(fā)生在第一條 sql 而是在后面的 sql 的話, 那么你的得到的返回值或者提示是不正確的,也就是你看到了操作成功,但是實際上并沒有數(shù)據(jù)的情況(事實證明確實如

10、 此)。解決的辦法很簡單,在 for 之前開始事務(wù),并在其中一句一句執(zhí)行 sql,在 next 后面做事務(wù)的處理,如下代碼:On Error GoTo err_transintTrans = conn.BeginTrans '開始事務(wù)X = countFor i = 0 To Xsql=“insert into Sales(dish_id,uid) values.......“conn.Execute sqlNext jco

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論