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

下載本文檔

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

文檔簡(jiǎn)介

1、 VB 中的事務(wù)處理有一下兩種方式: 1. conn.BeginTrans '開始'執(zhí)行語(yǔ)句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 '釋放對(duì)象Exit Sub '退出過程err_trans:

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

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

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

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

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

8、,也就是說 了,也就是說這個(gè)回滾根本不是 這個(gè)回滾根本不是 VB VB 里面的 里面的 newConn.RollbackTrans newConn.RollbackTrans 代碼來(lái)完成的, 代碼來(lái)完成的,而是數(shù) 而是數(shù)據(jù)庫(kù)完成的 據(jù)庫(kù)完成的(字符型換成整型失敗 字符型換成整型失敗)由于一些特殊的業(yè)務(wù)需要,我們經(jīng)常會(huì)出現(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 了, 如果這時(shí)候調(diào)用 newConn.Execute sql,那么按照前面的分析,如果錯(cuò)誤不是發(fā)生在第一條 sql 而是在后面的 sql 的話, 那么你的得到的返回值或者提示是不正確的,也就是你看到了操作成功,但是實(shí)際上并沒有數(shù)據(jù)的情況(事實(shí)證明確實(shí)如

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

評(píng)論

0/150

提交評(píng)論