国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

VB.NET使用OracleTransaction處理事務

2024-07-10 13:09:58
字體:
來源:轉載
供稿:網友
  數據庫事務簡介

  數據庫事務是由一組 sql 語句組成的一個邏輯工作單元。您可以把事務看作是一組不可分的 sql 語句,這些語句作為一個整體永久記錄在數據庫中或一并撤銷。比如在銀行帳戶之間轉移資金:一條 update語句將從一個帳戶的資金總數中減去一部分,另一條 update語句將把資金加到另一個帳戶中。減操作和加操作必須永久記錄在數據庫中,或者必須一并撤銷 — 否則將損失資金。這個簡單的示例僅使用了兩條 update 語句,但一個更實際的事務可能包含許多 insert、update和 delete 語句。

  要永久記錄一個事務中的 sql 語句的結果,您可以通過 commit 語句來執行提交。要撤銷 sql 語句的結果,您可以使用 rollback 語句來執行回滾,這會把所有的行重設為它們原來的狀態。只要您事先沒有與數據庫斷開,則您在執行回滾之前所做的任何修改都將被撤銷。您還可以設置一個保存點,以便將事務回滾至該特定的點,同時保持事務中的其他語句原封不動。

  使用數據庫事務(主要針對vb.net)

  您可以使用 oracletransaction 類的一個對象來表示一個事務。oracletransaction 類包含多個屬性,其中的兩個為 connection(指定與事務關聯的數據庫連接)和 isolationlevel(指定事務隔離級別)

  connection,指定與該事務關聯的oracleconnection對象;
  isolationlevel,指定該事務的isolationlevel;枚舉類型,用于對事物的鎖定,取值有chaos、readcommited、readuncommited、repeatableread、serializable、unspecified。

  應用程序通過針對oracleconnection對象調用 begintransaction 來創建oracletransaction對象。對oracletransaction對象執行與該事務關聯的所有后續操作(例如提交或中止該事務)。

  commit:提交sql數據庫事務;
  rollback :從掛起狀態回滾事務;

  您還可以使用 save() 在事務中設置一個保存點。

  下面的示例創建一個 oracleconnection 和一個 oracletransaction。它還演示了如何使用 begintransaction、commit 和 rollback 方法。(這是msdn里的范例)

  需要注意的是,這些操作需要引入命名空間: oracle.dataacess.client

  oracle.dataaccess.client 命名空間是 odp.net 的一部分,它包含許多類,其中有 oracleconnection、oraclecommand 和 oracletransaction。示例程序就用到了這些類。

  事務操作

1public sub runoracletransaction()sub runoracletransaction(myconnstring as string)
2 dim myconnection as new oracleconnection(myconnstring)
3 myconnection.open()
4
5 dim mycommand as oraclecommand = myconnection.createcommand()
6 dim mytrans as oracletransaction
7
8 ' start a local transaction
9 mytrans = myconnection.begintransaction(isolationlevel.readcommitted)
10 ' assign transaction object for a pending local transaction
11 mycommand.transaction = mytrans
12
13 try
14 mycommand.commandtext = "insert into dept (deptno, dname, loc) values (50, 'technology', 'denver')"
15 mycommand.executenonquery()
16 mycommand.commandtext = "insert into dept (deptno, dname, loc) values (60, 'engineering', 'kansas city')"
17 mycommand.executenonquery()
18 mytrans.commit()
19 console.writeline("both records are written to database.")
20 catch e as exception
21 mytrans.rollback()
22 console.writeline(e.tostring())
23 console.writeline("neither record was written to database.")
24 finally
25 myconnection.close()
26 end try
27end sub
28

  在 .net 程序中設置事務保存點

  正如本文前面所提到的那樣,您可以設置一個保存點,以便將事務回滾至該特定的點,同時保持事務中的其他語句原封不動。您可以使用 oracletransaction 類的 save() 方法在事務中設置保存點。

  如果您有一個非常長的事務并且希望能夠僅回滾到某個特定的時間點,那么您可能要使用保存點。例如,您可能想對 10 個產品做一些更改,然后設置一個保存點,然后再對另 10 個產品做更改;如果您在進行第二批更改時出現了錯誤,那么您可以回滾至保存點,使您的第一批更改原封不動。

  使用oracletransaction對象需要注意的幾點:

  1)你需要在你整個事務執行中只能有唯一oracleconnection ,oraclecommand,oracletransaction,也就是說如果你事務處理過程中如果需要與數據庫的操作都只能在這唯一的command中執行,類似于:

imgcommand.commandtext = ssql
imgcommand.executenonquery()或其他操作

  若你新建一個連接執行其他數據庫操作的話,整個事務過程就會拋出異常

  2)如果你需要在你sql語句中加入參數,則你必須在你執行完提交或相關數據庫操作之后將其command的參數清空,下邊舉一個實際的項目里的事務函數:

  事務函數

1 ''' <summary>
2 ''' 保存熱點文本文件信息到數據庫
3 ''' </summary>
4 private function savetextfile()function savetextfile() as boolean
5 dim ssql as string
6 ssql = "select type_id from sys_file_type where file_extname='txt'"
7 try
8 imgcommand.commandtext = ssql
9 dim typeid as int32 = convert.toint32(imgcommand.executescalar()) '文件類型
10 '讀取文本信息
11 dim textblob() as byte = gettext()
12
13 ssql = "insert into t_watch_textcontent(image_id,text_content,type_id) values(:imageid,:textcontent,:typeid)"
14 '增添sql參數
15 dim param as oracleclient.oracleparameter
16 param = new oracleclient.oracleparameter("imageid", snewimageid)
17 imgcommand.parameters.add(param)
18 param = new oracleclient.oracleparameter("textcontent", textblob)
19 imgcommand.parameters.add(param)
20 param = new oracleclient.oracleparameter("typeid", typeid)
21 imgcommand.parameters.add(param)
22
23 '提交信息
24 imgcommand.commandtext = ssql
25 if imgcommand.executenonquery() > 0 then
26 bresult = true
27 '關鍵是這里,需要你手動清除參數
28 imgcommand.parameters.clear()
29 end if
30 catch ex as exception
31 me.exceptionmessage = ex
32 bresult = false
33 end try
34
35 return bresult
36 end function
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳谷县| 绩溪县| 合阳县| 凤翔县| 漳浦县| 潜江市| 杂多县| 繁昌县| 同江市| 崇州市| 安顺市| 双流县| 昭觉县| 宝鸡市| 中山市| 武鸣县| 福安市| 西城区| 东乌珠穆沁旗| 内黄县| 左权县| 涪陵区| 四川省| 浮山县| 东阿县| 项城市| 崇左市| 滦南县| 营口市| 呼伦贝尔市| 宜君县| 华亭县| 普洱| 五常市| 凤翔县| 芷江| 灵川县| 金沙县| 钦州市| 三明市| 汪清县|