c#Oracle事务

26 篇文章 0 订阅
class Transaction
    {
        /// <summary>
        /// 测试Oracle事务
        /// </summary>
        /// <returns></returns>
        public int testTransaction()
        {
            string connectionString = "Data Source=orcl;user=" + "scott" + ";password=abc;";
            using (OracleConnection conn = new OracleConnection(connectionString))
            {
                conn.Open();
                OracleTransaction tran = conn.BeginTransaction();
                try
                {
                    OracleCommand cmd = new OracleCommand();
                    cmd.Transaction = tran;
                    string insertstr1 = "Insert into X1 (EMPNO,ENAME,HIREDATE)values('8033','wsl',TO_DATE('1991/1/1','YYYY/MM/DD'))"; ;
                    string insertstr2 = "Insert into X1 (EMPNO,ENAME,HIREDATE)values('8034','wsl',TO_DATE('1991/1/2','YYYY/MM/DD'))"; ;
                    cmd.Connection = conn;
                    cmd.CommandText = insertstr1;
                    cmd.ExecuteNonQuery();
                    cmd.CommandText = insertstr2;
                    cmd.ExecuteNonQuery();
                    tran.Commit();
                    return 1;
                }
                catch (Exception et)
                {
                    tran.Rollback();
                    return 0;
                }
                finally 
                {
                    conn.Close();
                }
            }
            
        }

    }


另一个实例:

引用自:http://www.cnblogs.com/yanghucheng/archive/2013/01/25/2876492.html

关于使用事务有几点不太明确:

   1事务对象关联的Connection对象在操作的时候不能被其他对象调用,但大部分代码没有用lock锁住,是否在OracleTransaction对象中已经封装好了呢?

   2OracleTransaction对象的创建需要借助Connection对象来做,不能独立创建么?


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data;
using Oracle.DataAccess.Client;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.Diagnostics;
using System.Data.Common;
using System.Collections;
namespace DB_Server
{
 
    #region //操作Oracle数据库
    public class OracleDBService
    {
        public OracleDBService(string ConnectionString)
        {
            OracleConStr = ConnectionString;           
        }       
        #region//连接数据库所需变量及方法   
        private string OracleConStr = "";
        private OracleConnection conn;//创建sql连接
        private OracleCommand com;//创建sql命令对象
        private OracleDataReader dr;//创建sql数据阅读器
        private OracleDataAdapter sdr;//创建sql适配器
        private DataSet ds;//创建数据集  
         
 
        /// <summary>
        /// 创建数据库连接并打开
        /// </summary>
        public void open()
        {
            //创建连接
            conn = new OracleConnection(OracleConStr);
            if (conn.State == ConnectionState.Closed)
            {              
                conn.Open();
            }
            else if (conn.State == ConnectionState.Broken)
            {
                conn.Close();
                conn.Open();
            }          
        }
        #region//事务操作数据库
        /// <summary>
        /// 提交一组(多条)SQL语句操作数据库
        /// </summary>
        /// <param name="commandStringList">SQL列表</param>
        /// <returns>执行结果</returns>
        public int UpdateBatchCommand(ArrayList commandStringList)
        {
            open();
            OracleTransaction m_OraTrans = conn.BeginTransaction();//创建事务对象
            com = new OracleCommand();
            com.Connection = conn;
            string tmpStr = "";
            int influenceRowCount = 0;
            try
            {
                foreach (string commandString in commandStringList)
                {
                    tmpStr = commandString;
                    com.CommandText = tmpStr;
                    influenceRowCount += com.ExecuteNonQuery();
                }
                m_OraTrans.Commit();
                return influenceRowCount;
            }
            catch (OracleException ex)
            {
                m_OraTrans.Rollback();
                throw ex;
            }
        }
        #endregion


另外对何时使用事务来操作仅仅有初步认识:对多个表同时进行操作时,其他还有何注意呢?

其他人的观点:Connection一旦开了一个事务,则执行的命令就必须和事务相关
要注意的是,在事务进行中,不能再对同一个数据库连接(OracleConnection)再进行事务外的数据的查询和读取
,if (trans != null) mAdp.SelectCommand.Transaction = trans;

总结:在事务块内,如果使用同样的Connection对象查询,但不指定事务,会报错,
           在事务提交后,或者不使用相同的Connection的对象查询,不会报错。


另一个实例:

引用自:http://aivii.blog.163.com/blog/static/36522566201121931222663/

开始事务:

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";

}


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值