专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » 在 .NET 中使用 Oracle 数据库事务 »正文

在 .NET 中使用 Oracle 数据库事务

来源: 发布时间:星期日, 2008年12月21日 浏览:2次 评论:0
在本文中您将了解到如何在 Visual Basic .NET (VB.NET) 和 Visual C# .NET (C#) 中使用数据库事务具体来讲您将系统学习数据库事务、在 .NET 中使用 OracleTransaction 对象以及如何设置事务保存点本文中引用所有脚本和文件都在这里提供本文假定您大体上熟悉 C# 和 VB.NET 编程

所需软件Software,如果您要跟随我们逐步完成本文中给出举例那么您需要安装以下软件Software:

Windows NT 4.0、Windows 2000、Windows XP Professional 或 Windows Server 2003
能够访问个已安装 Oracle 数据库(Oracle8i 版本 3 8.1.7 或更高版本)
Oracle 客户机(版本 10.1.0.2.0 或更高版本)
Oracle Net(版本 10.1.0.2.0 或更高版本)
Oracle Data Providers for .NET(版本 10.1.0.2.0 或更高版本)
Microsoft .NET Framework(版本 1.0 或更高版本)
Microsoft .NET 框架 SDK(版本 1.0 或更高版本)
如果您打算使用企业服务事务或分布式事务来开发和运行应用那么您还需要安装 Oracle Services for Microsoft Transaction Server(10.1.0.2.0 或更高版本)

您需要分别下载和安装 .NET 框架以及 SDK(先安装框架)您还需要下载和安装 Oracle 数据库 10g它包括 Oracle Data Provider for .NET (ODP.NET)您可以选择在区别计算机或同计算机上安装 ODP.NET 和数据库服务器

注意:ODP.NET 驱动针对 Oracle 数据库访问进行了优化因此可以获得最佳性能并且它们还支持 Oracle 数据库丰富特性如 BFILE、BLOB、CLOB、XMLType 等如果您正在开发基于 Oracle 数据库 .NET 应用那么就特性和性能来讲ODP.NET 无疑是最佳选择

数据库模式设置

首先您需要设置数据库模式在此我们使用个简化 Web 商店举例您必须首先创建个名为 store 用户并按以下方式将所需权限授予该用户(您必须首先以拥有 CREATE USER 权限用户身份登录数据库才能创建用户):

CREATE USER store IDENTIFIED BY store;
GRANT connect, resource TO store;
注意:您会在源代码文件 db1.sql 中找到前两个语句和该部分中出现设置 store 模式其他语句

接下语句以 store 用户身份进行连接:

CONNECT store/store;
以下语句创建了所需两个数据库表名称分别为 product_types 和 products:

CREATE TABLE product_types (
product_type_id INTEGER
CONSTRAINT product_types_pk PRIMARY KEY,
name VARCHAR2(10) NOT NULL
);

CREATE TABLE products (
product_id INTEGER
CONSTRAINT products_pk PRIMARY KEY,
product_type_id INTEGER
CONSTRAINT products_fk_product_types
REFERENCES product_types(product_type_id),
name VARCHAR2(30) NOT NULL,
description VARCHAR2(50),
price NUMBER(5, 2)
);
注意:如果您在个区别模式中为 store 用户创建了这些数据库表那么您将需要修改举例配置文件(您稍后将看到)中模式名称

表 product_types 用于存储举例在线商店可能库存产品类型名称表 products 包含了所销售产品详细信息

下面 INSERT 语句为表 product_types 和 products 添加行:

INSERT INTO product_types (
product_type_id, name
) VALUES (
1, 'Book'
);
INSERT INTO product_types (
product_type_id, name
) VALUES (
2, 'DVD'
);

INSERT INTO products (
product_id, product_type_id, name, description, price
) VALUES (
1, 1, 'Modern Science', 'A description of modern science', 19.95
);
INSERT INTO products (
product_id, product_type_id, name, description, price
) VALUES (
2, 1, 'Chemistry', 'Introduction to Chemistry', 30.00
);
INSERT INTO products (
product_id, product_type_id, name, description, price
) VALUES (
3, 2, 'Supernova', 'A star explodes', 25.99
);
INSERT INTO products (
product_id, product_type_id, name, description, price
) VALUES (
4, 2, 'Tank War', 'Action movie about a future war', 13.95
);

COMMIT;
接下来您将了解有关数据库事务内容

数据库事务介绍

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

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

在 C# 和 VB.NET 中使用数据库事务

您可以使用 OracleTransaction 类个对象来表示个事务OracleTransaction 类包含多个属性其中两个为 Connection(指定和事务关联数据库连接)和 IsolationLevel(指定事务隔离级别);本文稍后将向您介绍更多有关事务隔离级别内容

OracleTransaction 类包含许多操控事务思路方法您可以使用 Commit 思路方法永久提交 SQL 语句并可以使用 Rollback 撤销这些语句您还可以使用 Save 在事务中设置个保存点

我现在将带着您逐步完成两个举例个用 C# 编写 (TransExample1.cs)个用 VB.NET 编写 (TransExample1.vb)这些演示了如何执行个包含了两条 INSERT 语句事务条 INSERT 语句将在表 product_types 中添加第 2条将在表 products 中添加

导入命名空间

以下 C# 语句指定在中使用 和 Oracle.DataAcess.Client 命名空间:

using ;
using Oracle.DataAccess.Client;
下面是等价 VB.NET 语句:

Imports
Imports Oracle.DataAccess.Client
Oracle.DataAccess.Client 命名空间是 ODP.NET 部分它包含许多类其中有 OracleConnection、OracleCommand 和 OracleTransaction举例用到了这些类

第 1 步

创建个 OracleConnection 对象连接到 Oracle 数据库然后打开该连接

在 C# 中:

OracleConnection myOracleConnection =
OracleConnection(
"User Id=store;Password=store;Data Source=ORCL"
);
myOracleConnection.Open;
在 VB.NET 中:

Dim myOracleConnection As New OracleConnection( _
"User Id=store;Password=store;Data Source=ORCL")
myOracleConnection.Open
User Id 和 Password 属性指定了您所要连接到模式数据库用户和口令Data Source 属性指定了数据库 Oracle Net 服务名称;数据库默认服务名称为 ORCL如果您使用不是数据库或者您服务名称区别那么您需要在中修改 Data Source 属性设置

第 2 步

创建个 OracleTransaction 对象然后 OracleConnection 对象 BeginTransaction 思路方法启动事务

在 C# 中:

OracleTransaction myOracleTransaction =
myOracleConnection.BeginTransaction;
In VB.NET:

Dim myOracleTransaction As OracleTransaction = _
myOracleConnection.BeginTransaction
第 3 步

创建个 OracleCommand 对象用于存储 SQL 语句

在 C# 中:

OracleCommand myOracleCommand = myOracleConnection.CreateCommand;
在 VB.NET 中:

Dim myOracleCommand As OracleCommand =
myOracleConnection.CreateCommand
OracleCommand 对象使用 OracleConnection 对象 CreateCommand 思路方法创建所以它自动使用在第 2 步中为 OracleConnection 对象设置事务

第 4 步

将 OracleCommand 对象 CommandText 属性设为向表 product_types 中添加条 INSERT 语句

在 C# 中:

myOracleCommand.CommandText =
"INSERT INTO product_types (" +
" product_type_id, name" +
") VALUES (" +
" 3, 'Magazine'" +
")";

在 VB.NET 中:

myOracleCommand.CommandText = _
"INSERT INTO product_types (" & _
" product_type_id, name" & _
") VALUES (" & _
" 3, 'Magazine'" & _
")"
第 5 步

使用 OracleCommand 对象 ExecuteNonQuery 思路方法运行 INSERT 语句

在 C# 中:

myOracleCommand.ExecuteNonQuery;

在 VB.NET 中:

myOracleCommand.ExecuteNonQuery

第 6 和第 7 步

将 OracleCommand 对象 CommandText 属性设为向表 Products 中添加第 2条 INSERT 语句并运行它

在 C# 中:


myOracleCommand.CommandText =
"INSERT INTO products (" +
" product_id, product_type_id, name, description, price" +
") VALUES (" +
" 5, 3, 'Oracle Magazine', 'Magazine about Oracle', 4.99" +
")";
myOracleCommand.ExecuteNonQuery;
在 VB.NET 中:

myOracleCommand.CommandText = _
"INSERT INTO products (" & _
" product_id, product_type_id, name, description, price" & _
") VALUES (" & _
" 5, 3, 'Oracle Magazine', 'Magazine about Oracle', 4.99" & _
")"
myOracleCommand.ExecuteNonQuery

第 8 步

使用 OracleTransaction 对象 Commit 思路方法提交数据库中事务

在 C# 中:


myOracleTransaction.Commit;

在 VB.NET 中:


myOracleTransaction.Commit

在完成 Commit 思路方法的后由 INSERT 语句添加两行将在数据库中永久记录

第 9 步

使用 Close 思路方法关闭 OracleConnection 对象

在 C# 中:


myOracleConnection.Close;

在 VB.NET 中:


myOracleConnection.Close

编译并运行举例

要编译 C# 举例您可以使用 csc 命令运行 C# 编译器使用 Oracle Data Access DLL所以您应使用 /r 选项指定该 DLL 完整路径例如:



csc TransExample1.cs /r:C:\oracle\product\10.1.0\
Client_1\bin\Oracle.DataAccess.dll

注意:您需要用您计算机上相应路径来替换该 DLL 路径此外如果您计算机找不到 csc 编译器那么您可能需要运行 Microsoft sdkvars.bat 脚本来首先设置 .NET SDK 环境变量;您可以在安装 .NET SDK bin 目录中找到该脚本

如果您遇到以下:


Example1.cs(10,7):error CS0246:The type or name 'Oracle'
could not be found (are you missing a using directive or an assembly reference?)

这介绍说明您没有在编译命令中正确指定 Oracle Data Access DLL(有关设置信息请参阅 John Paul Cook 技术文章“在 Oracle 数据库上构建 .NET 应用)

下面是用于编译 VB.NET 等价命令:


vbc TransExample1.vb /r:C:\oracle\product\10.1.0\
Client_1\bin\Oracle.DataAccess.dll /r:system.dll /r:system.data.dll

接下来输入以下命令运行举例:


TransExample1

您将看到输出不过如果您遇到类似以下异常:


An exception was thrown
Message = ORA-12514:TNS:listener does not currently know
of service requested in connect descriptor

这介绍说明 OracleConnection 对象连接串中 Data Source 设置不正确您应当咨询您 DBA 或查阅 Oracle Net 文档以获得更多详细信息

如果您使用是 VS .NET那么您可以遵循以下指示来编译和运行 C# TransExample1.cs:

创建个新 C# 控制台应用File>New Project然后选择 Visual C# ProjectsConsole Application
将项目命名为 TransExample1
用 TransExample1.cs 中代码替换 VS .NET 生成所有代码
选择 Project>Add Reference 添加对 Oracle.DataAccess.dll 引用然后浏览至您安装 ODP.NET 目录(在我计算机上它是 C:\oracle\product\10.1.0\Client_1\bin\Oracle.DataAccess.dll)然后双击 Oracle.DataAccess.dll
选择 Debug>Start without Debugging 运行该
要编译和运行 TransExample1.vb您可以执行类似系列步骤但第 1 步应选择个 Visual Basic 控制台应用并在第 3 步用 TransExample1.vb 中代码替换生成代码

查看运行结果

当您运行完 C# 或 VB .NET 您可以在 SQL*Plus 中使用以下 SELECT 语句查看事务结果:
SELECT p.product_id, p.product_type_id, pt. name, p.name, p.description, p.price
FROM products p, product_types pt
WHERE p.product_type_id = pt.product_type_id
AND p.product_id = 5;

您将看到以下结果:
PRODUCT_ID PRODUCT_TYPE_ID NAME NAME
---------- --------------- ---------- -----------------------
DESCRIPTION PRICE
-------------------------------------------------- ----------
5 3 Magazine Oracle Magazine
Magazine about Oracle 4.99

接下来您将了解如何设置事务保存点

在 .NET 中设置事务保存点

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

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

我将带您逐步完成演示如何使用保存点 C# (TransExample2.cs) 举例和 VB.NET (TransExample2.vb) 举例相关新步骤这些向表 products 中添加设置个保存点向表 products 中添加另回滚至保存点然后从表 products 中读取这些行在回滚至保存点后只有添加到表 products 中行保留了下来:第 2行将已被删除

第 1 到第 3 步和“在 C# 和 VB.NET 中使用数据库事务”部分中所示步骤相同因此在这里将其省略

第 4 步

向表 products 中添加该行产品 ID 为 6

在 C# 中:

myOracleCommand.CommandText =
"INSERT INTO products (" +
" product_id, product_type_id, name, description, price" +
") VALUES (" +
" 6, 2, 'Man from Another World', 'Man from Venus lands _disibledevent= _
"INSERT INTO products (" & _
" product_id, product_type_id, name, description, price" & _
") VALUES (" & _
" 7, 2, 'Z-Files', 'Mysterious stories', 14.99" & _
")"
myOracleCommand.ExecuteNonQuery

第 7 步

回滚到先前在第 5 步中设置 SaveProduct 保存点

在 C# 中:

myOracleTransaction.Rollback("SaveProduct");

在 VB.NET 中:

myOracleTransaction.Rollback("SaveProduct")

完成回滚后在第 6 步中添加第 2行已被删除而在第 4 步中添加行保留了下来

TransExample2.cs 和 TransExample2.vb 中剩下步骤显示表 products 内容回滚整个事务并从数据库断开

用于 Microsoft Transaction Server Oracle 事务服务快速介绍说明

Microsoft Transaction Server 是个运行在互联网或网络服务器上专有事务处理系统Microsoft Transaction Server 为客户端计算机部署和管理应用和数据库事务请求


Microsoft Transaction Server 是以服务器为中心 3层体系结构模型个组件这种思路方法实现了将应用表示、业务逻辑和数据元素清晰地分布到在个网络中连接区别计算机上无需专门集成您就可以在和 Oracle 数据库服务器 8.0.6 版或更高版本连接 Microsoft Transaction Server 中部署个组件但首先您必须安装 Oracle Services for Microsoft Transaction Server

结论

在本文中您系统学习了在 .NET 中使用数据库事务您了解了如何创建 OracleTransaction 对象并用它们将事务提交给数据库如何使用保存点部分回滚个事务以及 Oracle 数据
标签:

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: