zoukankan      html  css  js  c++  java
  • C#使用事务操作ORACLE数据库

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

       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的对象查询,不会报错。

  • 相关阅读:
    Python+paramiko实现绕过跳板机免密登录服务端
    ssh-keygen生成公钥私钥
    连接MySQL报 unblock with 'mysqladmin flush-hosts' 问题解决
    查询MySQL连接数
    Git常用操作命令
    cmd命令、Python脚本生成任意大小任意格式文件
    颜色渐变实现
    4月简单总结
    大佬经历读后感
    Echarts实践-实现3D地球
  • 原文地址:https://www.cnblogs.com/yanghucheng/p/2876492.html
Copyright © 2011-2022 走看看