您的位置:首页 > 数据库 > Oracle

ODP优化之Oracle事务处理中遇到的问题

2012-08-08 11:15 531 查看
前面写的ODP中没有加事务,今天加事务时遇见了个问题。写出来,记录一下

一、先把以前实训时写的事务的练习发出来,项目中的事务就是根据这写的。

SqlConnection con = new SqlConnection("server=.;database=users;uid=sa;pwd=sa;");
con.Open();
SqlTransaction tran = con.BeginTransaction();//定义一个事务
try
{

SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.Transaction = tran;//cmd的一个属性关联stc

cmd.CommandText = "insert into students (name,age) values('aa',33)";
cmd.ExecuteNonQuery();

cmd.CommandText = "select @@identity";//查询刚刚插入的那一行自动增长列的值
int a = Convert.ToInt32(cmd.ExecuteScalar());
MessageBox.Show(a.ToString());

cmd.CommandText = "insert into students values('大劫案',22)";
cmd.ExecuteNonQuery();

tran.Commit();
}
catch (Exception exc)
{
tran.Rollback();
MessageBox.Show(exc.ToString());
}
finally
{
if (con.State == ConnectionState.Open)
{
con.Close();
}
cmd.Dispose();
}


二、仿照上面的在ODP中写的时候出错了

错误:无法对属性或索引器“Oracle.DataAccess.Client.OracleCommand.Transaction”赋值 -- 它是只读的

错误语句为:command.Transaction = tran;

解决方案:把command.Transaction = tran;删掉即可。原因可能是OracleCommand对象是由 cn.CreateCommand()产生,而在此之前cn已经BeginTransaction的缘故吧。

项目中的代码:

string constr = ConfigurationManager.ConnectionStrings["connect"].ConnectionString;

OracleConnection Conn = new OracleConnection(constr);

Conn.Open();//conn必须先打开,不然下面定义tran时会找不到对象。

OracleCommand command = Conn.CreateCommand();

OracleTransaction tran = Conn.BeginTransaction(IsolationLevel.ReadCommitted);//定义事务

//command.Transaction = tran;//这个不用关联事务!注释掉即可。

下面的代码就不用写了,跟以前的例子是一样的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: