C#连接Oracle增删改查


框架:.NET core 5.0

驱动包:Oracle.ManagedDataAccess.Core

 

代码:

using Oracle.ManagedDataAccess.Client;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CP_Demo.DAL
{
    /// <summary>
    /// 数据库操作类
    /// </summary>
    public class DbHelp
    {
        private OracleCommand cmd = null;
        private OracleConnection conn = null;
        private string connstr = "User Id=sgylmes;Password=sgyl2019mes1314;Data Source=10.196.200.20:1521/orcl;";
        //private string connstr = "Data Source=(DESCRIPTION = (ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.196.200.20)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME =ORCL) ));User ID=sgylmes;Password=sgyl2019mes1314;";
        private static string connString = "User Id=sgylmes;Password=sgyl2019mes1314;Data Source=10.196.200.20:1521/orcl;";


        //private Common common = new Common();
        private OracleTransaction transaction;





        private static DbHelp instance;
        private static readonly object objlock = new object();

        public static DbHelp GetDbHelpInstance()
        {
            //if (instance == null)
            //{
            //    lock (objlock)
            //    {
            //        if (instance == null)
            //        {
            //            instance = new DbHelp();
            //        }
            //    }
            //}
            //return instance;
            return new DbHelp();
        }

        #region 构造
        private DbHelp()
        {

        }
        #endregion

        #region 建立数据库连接对象
        /// <summary>
        /// 建立数据库连接
        /// </summary>
        /// <returns>返回一个数据库的连接OracleConnection对象</returns>
        public OracleConnection init(string connStr)
        {
            try
            {
                if (transaction != null && conn != null)
                    return conn;
                if (string.IsNullOrEmpty(connStr))
                {
                    connStr = "connStr";
                }
                if (conn != null && conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
                //if (conn != null)
                //{
                //    conn.Close();
                //}
                conn = new OracleConnection(connstr);
                if (conn.State != ConnectionState.Open)
                {
                    conn.Open();
                }
                if (conn == null)
                {
                    string str = "";

                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message.ToString());
            }
            return conn;
        }
        #endregion

        #region 设置OracleCommand对象
        /// <summary>
        /// 设置OracleCommand对象       
        /// </summary>
        /// <param name="cmd">OracleCommand对象 </param>
        /// <param name="cmdText">命令文本</param>
        /// <param name="cmdType">命令类型</param>
        /// <param name="cmdParms">参数集合</param>
        private void SetCommand(OracleCommand cmd, string cmdText, CommandType cmdType, OracleParameter[] cmdParms)
        {
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            cmd.CommandType = cmdType;
            if (cmdParms != null)
            {
                cmd.Parameters.AddRange(cmdParms);
            }
        }
        #endregion

        #region 执行相应的sql语句,返回相应的DataSet对象
        /// <summary>
        /// 执行相应的sql语句,返回相应的DataSet对象
        /// </summary>
        /// <param name="sqlstr">sql语句</param>
        /// <returns>返回相应的DataSet对象</returns>
        public DataSet GetDataSet(string sqlstr, string connStr)
        {
            DataSet set = new DataSet();
            try
            {
                init(connStr);
                OracleDataAdapter adp = new OracleDataAdapter(sqlstr, conn);
                adp.Fill(set, "DefaultTable");
                //conn.Close();
            }
            catch (Exception e)
            {
                //conn.Close();
                throw new Exception(e.Message.ToString());
            }
            finally
            {
                if (transaction == null)
                { }
                conn.Close();
                conn.Dispose();
            }
            return set;
        }
        #endregion

        #region 执行相应的sql语句,返回相应的DataSet对象
        /// <summary>
        /// 执行相应的sql语句,返回相应的DataSet对象
        /// </summary>
        /// <param name="sqlstr">sql语句</param>
        /// <param name="tableName">表名</param>
        /// <returns>返回相应的DataSet对象</returns>
        public DataSet GetDataSet(string sqlstr, string tableName, string connStr)
        {
            DataSet set = new DataSet();
            try
            {
                init(connStr);
                OracleDataAdapter adp = new OracleDataAdapter(sqlstr, conn);
                adp.Fill(set, tableName);
                //conn.Close();
            }
            catch (Exception e)
            {
                //conn.Close();
                throw new Exception(e.Message.ToString());
            }
            finally
            {
                if (transaction == null)
                { }
                conn.Close();
                conn.Dispose();
            }
            return set;
        }
        #endregion

        #region 执行不带参数sql语句,返回所影响的行数
        /// <summary>
        /// 执行不带参数sql语句,返回所影响的行数
        /// </summary>
        /// <param name="cmdstr">增,删,改sql语句</param>
        /// <returns>返回所影响的行数</returns>
        public int ExecuteNonQuery(string cmdText, string connStr)
        {
            int count;
            try
            {
                init(connStr);
                cmd = new OracleCommand(cmdText, conn);
                count = cmd.ExecuteNonQuery();
                //conn.Close();
            }
            catch (Exception ex)
            {
                //conn.Close();
                throw new Exception(ex.Message.ToString());
            }
            finally
            {
                if (transaction == null)
                { }
                conn.Close();
                conn.Dispose();
            }
            return count;
        }
        #endregion

        #region 执行带参数sql语句或存储过程,返回所影响的行数
        /// <summary>
        ///  执行带参数sql语句或存储过程,返回所影响的行数
        /// </summary>
        /// <param name="cmdText">带参数的sql语句和存储过程名</param>
        /// <param name="cmdType">命令类型</param>
        /// <param name="cmdParms">参数集合</param>
        /// <returns>返回所影响的行数</returns>
        public int ExecuteNonQuery(string cmdText, string connStr, CommandType cmdType, OracleParameter[] cmdParms)
        {
            int count;
            try
            {
                init(connStr);
                cmd = new OracleCommand();
                SetCommand(cmd, cmdText, cmdType, cmdParms);
                count = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                //conn.Close();
            }
            catch (Exception ex)
            {
                //conn.Close();
                throw new Exception(ex.Message.ToString());
            }
            finally
            {
                if (transaction == null)
                { }
                conn.Close();
                conn.Dispose();
            }
            return count;
        }
        #endregion

        #region 执行不带参数sql语句,返回一个从数据源读取数据的OracleDataReader对象
        /// <summary>
        /// 执行不带参数sql语句,返回一个从数据源读取数据的OracleDataReader对象
        /// </summary>
        /// <param name="cmdstr">相应的sql语句</param>
        /// <returns>返回一个从数据源读取数据的OracleDataReader对象</returns>
        public OracleDataReader ExecuteReader(string cmdText, string connStr)
        {
            OracleDataReader reader;
            try
            {
                init(connStr);
                cmd = new OracleCommand(cmdText, conn);
                reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (Exception ex)
            {
                //conn.Close();
                throw new Exception(ex.Message.ToString());
            }
            finally
            {
                if (transaction == null)
                { }
                conn.Close();
                conn.Dispose();
            }
            return reader;
        }
        #endregion

        #region 执行带参数的sql语句或存储过程,返回一个从数据源读取数据的OracleDataReader对象
        /// <summary>
        /// 执行带参数的sql语句或存储过程,返回一个从数据源读取数据的OracleDataReader对象
        /// </summary>
        /// <param name="cmdText">sql语句或存储过程名</param>
        /// <param name="cmdType">命令类型</param>
        /// <param name="cmdParms">参数集合</param>
        /// <returns>返回一个从数据源读取数据的OracleDataReader对象</returns>
        public OracleDataReader ExecuteReader(string cmdText, string connStr, CommandType cmdType, OracleParameter[] cmdParms)
        {
            OracleDataReader reader;
            try
            {
                init(connStr);
                cmd = new OracleCommand();
                SetCommand(cmd, cmdText, cmdType, cmdParms);
                reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (Exception ex)
            {
                //conn.Close();
                throw new Exception(ex.Message.ToString());
            }
            finally
            {
                if (transaction == null)
                { }
                conn.Close();
                conn.Dispose();
            }
            return reader;
        }
        #endregion

        #region 执行不带参数sql语句,返回结果集首行首列的值object
        /// <summary>
        /// 执行不带参数sql语句,返回结果集首行首列的值object
        /// </summary>
        /// <param name="cmdstr">相应的sql语句</param>
        /// <returns>返回结果集首行首列的值object</returns>
        public object ExecuteScalar(string cmdText, string connStr)
        {
            object obj;
            try
            {
                init(connStr);
                cmd = new OracleCommand(cmdText, conn);
                obj = cmd.ExecuteScalar();
                //conn.Close();
            }
            catch (Exception ex)
            {
                //conn.Close();
                throw new Exception(ex.Message.ToString());
            }
            finally
            {
                if (transaction == null)
                { }
                conn.Close();
                conn.Dispose();
            }
            return obj;
        }
        #endregion

        #region 执行带参数sql语句或存储过程,返回结果集首行首列的值object
        /// <summary>
        /// 执行带参数sql语句或存储过程,返回结果集首行首列的值object
        /// </summary>
        /// <param name="cmdText">sql语句或存储过程名</param>
        /// <param name="cmdType">命令类型</param>
        /// <param name="cmdParms">返回结果集首行首列的值object</param>
        /// <returns></returns>
        public object ExecuteScalar(string cmdText, string connStr, CommandType cmdType, OracleParameter[] cmdParms)
        {
            object obj;
            try
            {
                init(connStr);
                cmd = new OracleCommand();
                SetCommand(cmd, cmdText, cmdType, cmdParms);
                obj = cmd.ExecuteScalar();
                //conn.Close();
            }
            catch (Exception ex)
            {
                //conn.Close();
                throw new Exception(ex.Message.ToString());
            }
            finally
            {
                if (transaction == null)
                { }
                conn.Close();
                conn.Dispose();
            }
            return obj;
        }
        #endregion

        #region 批量插入数据
        /// <summary>
        /// 批量插入数据
        /// </summary>
        /// <param name="tableName">表名称</param>
        /// <param name="columnRowData">键-值存储的批量数据:键是列名称,值是对应的数据集合</param>
        /// <param name="len">每次批处理数据的大小</param>
        /// <returns></returns>
        public string BatchInsert(string tableName, Dictionary<string, object> columnRowData, int len, string connStr)
        {
            if (string.IsNullOrEmpty(tableName))
            {
                return "FALSE:表名不能为空";
            }

            if (columnRowData == null || columnRowData.Count < 1)
            {
                return "FALSE:字段名称不能为空";
            }

            if (string.IsNullOrEmpty(connStr))
            {
                connStr = "connStr";
            }

            string sResult = "FALSE";
            string[] dbColumns = columnRowData.Keys.ToArray();
            StringBuilder sbCmdText = new StringBuilder();
            if (columnRowData.Count > 0)
            {
                //准备插入的SQL
                sbCmdText.AppendFormat("INSERT INTO {0}(", tableName);
                sbCmdText.Append(string.Join(",", dbColumns));
                sbCmdText.Append(") VALUES (");
                sbCmdText.Append(":" + string.Join(",:", dbColumns));
                sbCmdText.Append(")");

                using (OracleConnection conn = new OracleConnection(connstr))//(ConfigurationManager.ConnectionStrings[connStr].ConnectionString))
                {
                    using (OracleCommand cmd = conn.CreateCommand())
                    {
                        //绑定批处理的行数
                        cmd.ArrayBindCount = len;
                        cmd.BindByName = true;
                        cmd.CommandType = CommandType.Text;
                        cmd.CommandText = sbCmdText.ToString();
                        cmd.CommandTimeout = 600;

                        //创建参数
                        OracleParameter oraParam;
                        OracleDbType dbType = OracleDbType.Varchar2;
                        foreach (string colName in dbColumns)
                        {
                            dbType = GetOracleDbType(columnRowData[colName]);
                            oraParam = new OracleParameter(colName, dbType);
                            oraParam.Direction = ParameterDirection.Input;
                            oraParam.OracleDbType = dbType;
                            oraParam.Value = columnRowData[colName];
                            cmd.Parameters.Add(oraParam);
                        }

                        //打开连接
                        conn.Open();

                        /*执行批处理*/
                        var trans = conn.BeginTransaction();
                        try
                        {
                            cmd.Transaction = trans;
                            if (cmd.ExecuteNonQuery() > 0)
                            {
                                sResult = "TRUE";
                            }
                            trans.Commit();
                        }
                        catch (Exception ex)
                        {
                            trans.Rollback();
                            sResult = ex.Message;
                        }
                        finally
                        {
                            if (conn != null) { conn.Close(); conn.Dispose(); }
                        }
                    }
                }
            }
            return sResult;
        }
        #endregion

        #region 根据数据类型获取OracleDbType
        /// <summary>
        /// 根据数据类型获取OracleDbType
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        private OracleDbType GetOracleDbType(object value)
        {
            OracleDbType dataType = OracleDbType.Varchar2;
            if (value is string[])
            {
                dataType = OracleDbType.Varchar2;
            }
            else if (value is DateTime[])
            {
                dataType = OracleDbType.TimeStamp;
            }
            else if (value is int[] || value is short[])
            {
                dataType = OracleDbType.Int32;
            }
            else if (value is long[])
            {
                dataType = OracleDbType.Int64;
            }
            else if (value is decimal[] || value is double[] || value is float[])
            {
                dataType = OracleDbType.Decimal;
            }
            else if (value is Guid[])
            {
                dataType = OracleDbType.Varchar2;
            }
            else if (value is bool[] || value is Boolean[])
            {
                dataType = OracleDbType.Byte;
            }
            else if (value is byte[])
            {
                dataType = OracleDbType.Blob;
            }
            else if (value is char[])
            {
                dataType = OracleDbType.Char;
            }
            return dataType;
        }

        /// <summary>
        /// 通过类型进行转换
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public OracleDbType GetOracleDbType(Type type)
        {
            OracleDbType dataType = OracleDbType.Varchar2;
            if (type == typeof(String))
            {
                dataType = OracleDbType.Varchar2;
            }
            else if (type == typeof(DateTime))
            {
                dataType = OracleDbType.Date;
            }
            else if (type == typeof(int) || type == typeof(short))
            {
                dataType = OracleDbType.Int32;
            }
            else if (type == typeof(long))
            {
                dataType = OracleDbType.Int64;
            }
            else if (type == typeof(Decimal) || type == typeof(Double) || type == typeof(float))
            {
                dataType = OracleDbType.Decimal;
            }
            else if (type == typeof(Guid))
            {
                dataType = OracleDbType.Varchar2;
            }
            else if (type == typeof(bool) || type == typeof(Boolean))
            {
                dataType = OracleDbType.Byte;
            }
            else if (type == typeof(byte))
            {
                dataType = OracleDbType.Blob;
            }
            else if (type == typeof(char))
            {
                dataType = OracleDbType.Char;
            }
            return dataType;
        }
        #endregion

        public string BatchInsert(string tableName, Dictionary<string, object> columnRowData, int len)
        {
            if (string.IsNullOrEmpty(tableName))
            {
                return "FALSE:表名不能为空";
            }
            if ((columnRowData == null) || (columnRowData.Count < 1))
            {
                return "FALSE:字段名称不能为空";
            }
            string sMsg = "FALSE";
            string[] strArray = columnRowData.Keys.ToArray<string>();
            StringBuilder builder = new StringBuilder();
            if (columnRowData.Count > 0)
            {
                builder.AppendFormat("INSERT INTO {0}(", tableName);
                builder.Append(string.Join(",", strArray));
                builder.Append(") VALUES (");
                builder.Append(":" + string.Join(",:", strArray));
                builder.Append(")");
                using (OracleConnection connection = new OracleConnection(this.connstr))
                {
                    using (OracleCommand command = connection.CreateCommand())
                    {
                        command.ArrayBindCount = len;
                        command.BindByName = true;
                        command.CommandType = CommandType.Text;
                        command.CommandText = builder.ToString();
                        command.CommandTimeout = 600;
                        OracleDbType oraType = OracleDbType.Varchar2;
                        foreach (string str2 in strArray)
                        {
                            oraType = this.GetOracleDbType(columnRowData[str2]);
                            OracleParameter param = new OracleParameter(str2, oraType);
                            param.Direction = ParameterDirection.Input;
                            param.OracleDbType = oraType;
                            param.Value = columnRowData[str2];
                            command.Parameters.Add(param);
                        }
                        connection.Open();
                        OracleTransaction transaction = connection.BeginTransaction();
                        try
                        {
                            try
                            {
                                command.Transaction = transaction;
                                if (command.ExecuteNonQuery() > 0)
                                {
                                    sMsg = "TRUE";
                                }
                                transaction.Commit();
                            }
                            catch (Exception exception)
                            {
                                transaction.Rollback();
                                sMsg = exception.Message;
                            }
                            return sMsg;
                        }
                        finally
                        {
                            if (connection != null)
                            {
                                connection.Close();
                                connection.Dispose();
                            }
                            // this.common.SaveIP("BatchInsert", sMsg);
                        }
                    }
                }
            }
            return sMsg;
        }

        #region 批量更新/新增操作
        private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, string cmdText, OracleParameter[] cmdParms)
        {

            if (conn.State != ConnectionState.Open)
                conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            cmd.BindByName = true;

            if (trans != null)
                cmd.Transaction = trans;
            cmd.CommandType = CommandType.Text;//cmdType;
            if (cmdParms != null)
            {
                foreach (OracleParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }

        }

        /// <summary>
        /// 批量更新/导入底层
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="rownum"></param>
        /// <param name="cmdParms"></param>
        /// <returns></returns>
        private bool BatchImport(string sql, int rownum, params OracleParameter[] cmdParms)
        {
            using (OracleConnection connection = new OracleConnection(this.connstr))
            {

                using (OracleCommand cmd = new OracleCommand(sql, connection))
                {
                    try
                    {
                        cmd.CommandType = CommandType.Text;
                        cmd.ArrayBindCount = rownum;
                        PrepareCommand(cmd, connection, null, sql, cmdParms);

                        int rows = cmd.ExecuteNonQuery();

                        return rows >= 0 ? true : false;
                    }
                    catch (Oracle.ManagedDataAccess.Client.OracleException Err)
                    {
                        connection.Close();
                        connection.Dispose();

                        throw Err;
                    }
                }
            }
        }
        /// <summary>
        /// 组建参数用
        /// </summary>
        /// <param name="name"></param>
        /// <param name="oracleType"></param>
        /// <param name="direction"></param>
        /// <param name="size"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        private OracleParameter BuildOracleParameter(string name, OracleDbType oracleType, ParameterDirection direction, int size, object value)
        {
            OracleParameter paramerer = new OracleParameter(name, value);
            paramerer.ParameterName = name;
            paramerer.OracleDbType = oracleType;
            paramerer.Direction = direction;
            if (size > 0)
            {
                paramerer.Size = size;
            }
            return paramerer;
        }

        /// <summary>
        /// 批量更新表
        /// </summary>
        /// <param name="dataTable">数据表,其它表名不能为空且在系统中存在</param>
        /// <param name="primaryCol">更新的主键列:目前只支持单主键操作</param>
        /// <param name="updateCols">要更新的列:支持多个列,多个列采用英文逗号隔开</param>
        /// <returns></returns>
        public string BatchUpdate(DataTable dataTable, string primaryCol, string updateCols)
        {
            string result = "FALSE";
            if (string.IsNullOrEmpty(dataTable.TableName))
            {
                return "FALSE:表名不能为空";
            }

            //支持多列同时更新
            string[] updateColsArray = updateCols.Split(new string[] { "," }, StringSplitOptions.None);
            int nUpdateColCount = updateColsArray.Length;
            int nStep = 0;
            StringBuilder strBuilder = new StringBuilder();
            strBuilder.AppendFormat(" update {0} set ", dataTable.TableName);
            foreach (string str in updateColsArray)
            {
                nStep++;
                if (nStep == nUpdateColCount)
                {
                    strBuilder.AppendFormat(" {0} = :{0} ", str);
                }
                else
                {
                    strBuilder.AppendFormat(" {0} = :{0}, ", str);
                }
            }

            strBuilder.AppendFormat(" where {0} = :{0}", primaryCol);

            string sql = strBuilder.ToString();
            List<OracleParameter> listParameter = new List<OracleParameter>();
            foreach (string column in updateColsArray)
            {
                DataColumn dataColumn = dataTable.Columns[column];

                string columnName = dataColumn.ColumnName;
                //保存string
                List<string> listValue = new List<string>();
                //保存DateTime
                List<DateTime> listDate = new List<DateTime>();
                List<Decimal> listDouble = new List<decimal>();

                List<string> listValuePk = new List<string>();
                List<DateTime> listDatePk = new List<DateTime>();
                List<Decimal> listDoublePk = new List<Decimal>();
                Type type = dataColumn.DataType;
                OracleDbType dbType = GetOracleDbType(type);
                OracleDbType dbTypePk = GetOracleDbType(dataTable.Columns[primaryCol].DataType);

                foreach (DataRow dr in dataTable.Rows)
                {
                    string str = dr[columnName].ToString();
                    if (dbType == OracleDbType.Date)
                    {
                        listDate.Add(string.IsNullOrEmpty(str) ? DateTime.Now : Convert.ToDateTime(str));
                    }
                    else if (dbType == OracleDbType.Decimal)
                    {
                        listDouble.Add(string.IsNullOrEmpty(str) ? 0 : Convert.ToDecimal(str));
                    }
                    else
                    {
                        listValue.Add(str);
                    }

                    string strPk = dr[primaryCol].ToString();
                    switch (dbTypePk)
                    {
                        case OracleDbType.Date:
                            {
                                listDatePk.Add(string.IsNullOrEmpty(strPk) ? DateTime.Now : Convert.ToDateTime(strPk));
                                break;
                            }
                        case OracleDbType.Decimal:
                            {
                                listDoublePk.Add(string.IsNullOrEmpty(strPk) ? 0 : Convert.ToDecimal(strPk));
                                break;
                            }
                        default:
                            {
                                listValuePk.Add(strPk);
                                break;
                            }
                    }
                }

                //添加更新列参数
                switch (dbType)
                {
                    case OracleDbType.Date:
                        {
                            listParameter.Add(BuildOracleParameter(columnName, dbType, ParameterDirection.Input, 0, listDate.ToArray()));
                            break;
                        }
                    case OracleDbType.Decimal:
                        {
                            listParameter.Add(BuildOracleParameter(columnName, dbType, ParameterDirection.Input, 0, listDouble.ToArray()));
                            break;
                        }
                    default:
                        {
                            listParameter.Add(BuildOracleParameter(columnName, dbType, ParameterDirection.Input, 0, listValue.ToArray()));
                            break;
                        }
                }


                //添加主键参数
                switch (dbTypePk)
                {
                    case OracleDbType.Date:
                        {
                            listParameter.Add(BuildOracleParameter(primaryCol, dbTypePk, ParameterDirection.Input, 0, listDatePk.ToArray()));
                            break;
                        }
                    case OracleDbType.Decimal:
                        {
                            listParameter.Add(BuildOracleParameter(primaryCol, dbTypePk, ParameterDirection.Input, 0, listDoublePk.ToArray()));
                            break;
                        }
                    default:
                        {
                            listParameter.Add(BuildOracleParameter(primaryCol, dbTypePk, ParameterDirection.Input, 0, listValuePk.ToArray()));
                            break;
                        }
                }
            }
            OracleParameter[] param = listParameter.ToArray();

            param = listParameter.ToArray();

            if (BatchImport(sql, dataTable.Rows.Count, param))
            {
                result = "TRUE";
            }
            else
            {
                result = "FALSE:批量更新失败!";
            }

            return result;
        }
        #endregion

        #region 手动开启事务
        /// <summary>
        /// 开启事务
        /// </summary>
        public void BeginTrans(string connStr = "")
        {
            init(connStr);
            transaction = conn.BeginTransaction();
        }

        /// <summary>
        /// 提交事务
        /// </summary>
        public void Commit()
        {
            try
            {
                if (transaction != null)
                {
                    transaction.Commit();
                }
            }
            catch
            {

            }
            finally
            {
                if (conn != null && conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
            }
        }

        /// <summary>
        /// 回滚
        /// </summary>
        public void RollBack()
        {
            try
            {
                if (transaction != null)
                {
                    transaction.Rollback();
                }
            }
            catch
            {

            }
            finally
            {
                if (conn != null && conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
            }
        }

        /*
        /// <summary>
        /// 
        /// </summary>
        /// <param name="cmdText"></param>
        /// <param name="connStr"></param>
        /// <returns></returns>
        public int ExecuteNonQueryTrans(string cmdText, string connStr)
        {
            int count;
            try
            {
                cmd = new OracleCommand(cmdText, conn);
                count = cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message.ToString());
            }
            return count;
        }

        /// <summary>
        ///  执行带参数sql语句或存储过程,返回所影响的行数
        /// </summary>
        /// <param name="cmdText">带参数的sql语句和存储过程名</param>
        /// <param name="cmdType">命令类型</param>
        /// <param name="cmdParms">参数集合</param>
        /// <returns>返回所影响的行数</returns>
        public int ExecuteNonQueryTrans(string cmdText, string connStr, CommandType cmdType, OracleParameter[] cmdParms)
        {
            int count;
            try
            {
                cmd = new OracleCommand();
                SetCommand(cmd, cmdText, cmdType, cmdParms);
                count = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message.ToString());
            }
            return count;
        }
        */
        #endregion


        public string ExecuteNonQueryTrans(OracleConnection orclConn, string commondText, OracleTransaction trans)
        {
            string sMsg = string.Empty;
            using (OracleCommand command = new OracleCommand())
            {
                command.CommandType = CommandType.Text;
                command.CommandText = commondText;
                command.CommandTimeout = 600;
                command.Connection = orclConn;
                command.Transaction = trans;
                try
                {
                    if (command.ExecuteNonQuery() > 0)
                    {
                        sMsg = "TRUE";
                    }
                }
                catch (Exception exception)
                {
                    sMsg = "FALSE:" + exception.Message;
                }
                return sMsg;

            }

        }


        #region
        /// <summary>
        /// 调用存储过程查询指定页码记录条数的数据
        /// </summary>
        /// <param name="q_Sql">基本的数据查询</param>
        /// <param name="rowsCountPage">每页显示的记录数</param>
        /// <param name="indexNowPage">页码</param>
        /// <param name="totalRows">查询总记录数</param>
        /// <param name="totalPages">总页数</param>
        public DataTable ProcedureSelectData(string q_Sql, string connStr, int rowsCountPage, int indexNowPage, ref int totalRows, ref int totalPages)
        {
            string data = string.Empty;
            DataTable OutDataTable = new DataTable();
            // OutDataTable = new DataTable();
            DataRow dataRow;
            OutDataTable.TableName = "nowPageData";

            OracleDataReader reader;
            try
            {
                init(connStr);
                cmd = new OracleCommand();
                cmd.Connection = conn;

                cmd.CommandText = "P_G_GetPagingData";
                cmd.CommandType = CommandType.StoredProcedure;

                OracleParameter op0 = new OracleParameter("q_Sql", OracleDbType.Varchar2, 5000);
                OracleParameter op1 = new OracleParameter("rowCountPage", OracleDbType.Int32, 10);
                OracleParameter op2 = new OracleParameter("indexNowPage", OracleDbType.Int32, 10);
                OracleParameter op3 = new OracleParameter("totalRows", OracleDbType.Int32, 10);
                OracleParameter op4 = new OracleParameter("totalPages", OracleDbType.Int32, 10);
                OracleParameter op5 = new OracleParameter("p_corsor", OracleDbType.RefCursor);

                op0.Direction = ParameterDirection.Input;
                op1.Direction = ParameterDirection.Input;
                op2.Direction = ParameterDirection.Input;
                op3.Direction = ParameterDirection.Output;
                op4.Direction = ParameterDirection.Output;
                op5.Direction = ParameterDirection.Output;

                op0.Value = q_Sql.Trim();
                op1.Value = rowsCountPage;
                op2.Value = indexNowPage;

                cmd.Parameters.Add(op0);
                cmd.Parameters.Add(op1);
                cmd.Parameters.Add(op2);
                cmd.Parameters.Add(op3);
                cmd.Parameters.Add(op4);
                cmd.Parameters.Add(op5);

                reader = cmd.ExecuteReader();
                totalRows = Int32.Parse(op3.Value.ToString());
                totalPages = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(op4.Value.ToString())));//(op4.Value.ToString());

                for (int j = 0; j < reader.FieldCount; j++)
                {
                    //获取列名
                    OutDataTable.Columns.Add(reader.GetName(j));
                }

                //循环取数据集合中的数据,存到DataTable中
                do
                {
                    while (reader.Read())
                    {
                        dataRow = OutDataTable.NewRow();
                        for (int j = 0; j < reader.FieldCount; j++)
                        {
                            data = reader[j].ToString();
                            dataRow[j] = data;
                        }
                        OutDataTable.Rows.Add(dataRow);
                    }
                } while (reader.NextResult());

                // dtTemp = OutDataTable;



            }
            catch (Exception ex)
            {
                //conn.Close();
                throw new Exception(ex.Message.ToString());
            }
            finally
            {
                if (transaction == null)
                { }

                conn.Close();
                conn.Dispose();
            }
            return OutDataTable;
        }


        #endregion


    }
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM