OracleTransaction trans = null;
OracleCommand comm = null;
trans = con.BeginTransaction();
comm = con.CreateCommand();
comm.Transaction = trans;
提交:
trans.Commit();
回滚:
trans.Rollback();
在事件内进行SQL语句相关执行:
comm.CommandText = "INSERT INTO .....";
comm.ExecuteNonQuery();
Connection一旦开了一个事务,则执行的命令就必须和事务相关
要注意的是,在事务进行中,不能再对同一个数据库连接(OracleConnection)再进行事务外的数据的查询和读取,也就是说,类似下边的语句是不能执行的:
OracleDataAdapter mAdp = new OracleDataAdapter(sSql, mCon);
DataTable mDst = new DataTable();
mAdp.Fill(mDst);
而是得加一条语句,在事务内进行查询:
OracleDataAdapter mAdp = new OracleDataAdapter(sSql, mCon);
if (trans != null) mAdp.SelectCommand.Transaction = trans;
DataTable mDst = new DataTable();
mAdp.Fill(mDst);
总结:在事务块内,如果使用同样的Connection对象查询,但不指定事务,会报错,
在事务提交后,或者不使用相同的Connection的对象查询,不会报错。
测试代码:
string connStr="user id=sa;password=sa;data source=127.0.0.1;initial catalog=test;persist security info=False;workstation id=CSharp;packet size=4096";
using(SqlConnection conn=new SqlConnection(connStr))
{
conn.Open();
SqlTransaction tran=conn.BeginTransaction();
string sql="insert into t_one (Name)values('111')";
SqlCommand comm=new SqlCommand(sql,conn,tran);
int row=comm.ExecuteNonQuery();
//在事务中执行其他的命令,不能在事务外进行,
//因此下面在创建Command对象时,加上事务参数
string select="select * from t_one";
SqlCommand comm1=new SqlCommand(select,conn,tran);//如果不加tran参数,会报错
SqlDataReader dr=comm1.ExecuteReader();
dr.Close();//注意关闭
// while(dr.Read())
// {
// temp=dr[0].ToString();
// }
SqlDataAdapter da=new SqlDataAdapter(select,conn);
da.SelectCommand.Transaction=tran;//在事务内查询,如果不加上此句,会报错
DataSet ds=new DataSet();
da.Fill(ds);
//代码与下面相同,但在事务未提交前查询,会报错,加上面的da.SelectCommand.Transaction=tran即可。
SqlDataAdapter da2=new SqlDataAdapter("select * from t_one",conn);
DataSet ds2=new DataSet();
da2.Fill(ds2);
tran.Commit();
//在事务提交后,可以正常获取
// SqlDataAdapter da2=new SqlDataAdapter("select * from t_one",conn);
// DataSet ds2=new DataSet();
// da2.Fill(ds2);
string a="aaa";
}