vb.net

位置:IT落伍者 >> vb.net >> 浏览文章

VB.NET使用OracleTransaction处理事务


发布日期:2018年11月16日
 
VB.NET使用OracleTransaction处理事务
数据库事务简介

数据库事务是由一组 SQL 语句组成的一个逻辑工作单元您可以把事务看作是一组不可分的 SQL 语句这些语句作为一个整体永久记录在数据库中或一并撤销比如在银行帐户之间转移资金一条 UPDATE语句将从一个帐户的资金总数中减去一部分另一条 UPDATE语句将把资金加到另一个帐户中减操作和加操作必须永久记录在数据库中或者必须一并撤销 — 否则将损失资金这个简单的示例仅使用了两条 UPDATE 语句但一个更实际的事务可能包含许多 INSERTUPDATE和 DELETE 语句

要永久记录一个事务中的 SQL 语句的结果您可以通过 COMMIT 语句来执行提交要撤销 SQL 语句的结果您可以使用 ROLLBACK 语句来执行回滚这会把所有的行重设为它们原来的状态只要您事先没有与数据库断开则您在执行回滚之前所做的任何修改都将被撤销您还可以设置一个保存点以便将事务回滚至该特定的点同时保持事务中的其他语句原封不动

使用数据库事务(主要针对)

您可以使用 OracleTransaction 类的一个对象来表示一个事务OracleTransaction 类包含多个属性其中的两个为 Connection(指定与事务关联的数据库连接)和 IsolationLevel(指定事务隔离级别)

Connection指定与该事务关联的OracleConnection对象

IsolationLevel指定该事务的IsolationLevel枚举类型用于对事物的锁定取值有ChaosReadCommitedReadUncommitedRepeatableReadSerializableUnspecified

应用程序通过针对OracleConnection对象调用 BeginTransaction 来创建OracleTransaction对象对OracleTransaction对象执行与该事务关联的所有后续操作(例如提交或中止该事务)

Commit:提交SQL数据库事务

Rollback :从挂起状态回滚事务

您还可以使用 Save() 在事务中设置一个保存点

下面的示例创建一个 OracleConnection 和一个 OracleTransaction它还演示了如何使用 BeginTransactionCommit 和 Rollback 方法(这是MSDN里的范例)

需要注意的是这些操作需要引入命名空间: OracleDataAcessClient

OracleDataAccessClient 命名空间是 ODPNET 的一部分它包含许多类其中有 OracleConnectionOracleCommand 和 OracleTransaction示例程序就用到了这些类

事务操作

Public Sub RunOracleTransaction()Sub RunOracleTransaction(myConnString As String)

Dim myConnection As New OracleConnection(myConnString)

myConnectionOpen()

Dim myCommand As OracleCommand = myConnectionCreateCommand()

Dim myTrans As OracleTransaction

Start a local transaction

myTrans = myConnectionBeginTransaction(IsolationLevelReadCommitted)

Assign transaction object for a pending local transaction

myCommandTransaction = myTrans

Try

myCommandCommandText = INSERT INTO Dept (DeptNo Dname Loc) values ( TECHNOLOGY DENVER)

myCommandExecuteNonQuery()

myCommandCommandText = INSERT INTO Dept (DeptNo Dname Loc) values ( ENGINEERING KANSAS CITY)

myCommandExecuteNonQuery()

myTransCommit()

ConsoleWriteLine(Both records are written to database)

Catch e As Exception

myTransRollback()

ConsoleWriteLine(eToString())

ConsoleWriteLine(Neither record was written to database)

Finally

myConnectionClose()

End Try

End Sub

NET 程序中设置事务保存点

正如本文前面所提到的那样您可以设置一个保存点以便将事务回滚至该特定的点同时保持事务中的其他语句原封不动您可以使用 OracleTransaction 类的 Save() 方法在事务中设置保存点

如果您有一个非常长的事务并且希望能够仅回滚到某个特定的时间点那么您可能要使用保存点例如您可能想对 个产品做一些更改然后设置一个保存点然后再对另 个产品做更改如果您在进行第二批更改时出现了错误那么您可以回滚至保存点使您的第一批更改原封不动

使用OracleTransaction对象需要注意的几点

)你需要在你整个事务执行中只能有唯一OracleConnection OracleCommand

OracleTransaction也就是说如果你事务处理过程中如果需要与数据库的操作都只能在这唯一的Command中执行类似于:

imgCommandCommandText = sSQL

imgCommandExecuteNonQuery()或其他操作

若你新建一个连接执行其他数据库操作的话整个事务过程就会抛出异常

)如果你需要在你SQL语句中加入参数则你必须在你执行完提交或相关数据库操作之后将其Command的参数清空下边举一个实际的项目里的事务函数

事务函数

<summary>

保存热点文本文件信息到数据库

</summary>

Private Function SaveTextFile()Function SaveTextFile() As Boolean

Dim sSQl As String

sSQl = select type_id from sys_file_type where file_extname=TXT

Try

imgCommandCommandText = sSQl

Dim typeID As Int = ConvertToInt(imgCommandExecuteScalar()) 文件类型

读取文本信息

Dim Textblob() As Byte = GetText()

sSQl = insert into t_watch_textcontent(image_idtext_contenttype_id) values(:imageid:textcontent:typeid)

增添SQL参数

Dim Param As OracleClientOracleParameter

Param = New OracleClientOracleParameter(imageid sNewImageID)

imgCommandParametersAdd(Param)

Param = New OracleClientOracleParameter(textcontent Textblob)

imgCommandParametersAdd(Param)

Param = New OracleClientOracleParameter(typeid typeID)

imgCommandParametersAdd(Param)

提交信息

imgCommandCommandText = sSQl

If imgCommandExecuteNonQuery() > Then

bResult = True

关键是这里需要你手动清除参数

imgCommandParametersClear()

End If

Catch ex As Exception

MeExceptionMessage = ex

bResult = False

End Try

Return bResult

End Function

上一篇:VB.NET中的TextBox控件详解

下一篇:用新VB.NET 枚举提高效率