/******************************************************************************* * Copyright(c) 2014 dongke All rights reserved. / Confidential * 类的信息: * 1.程序名称:OracleHelper.cs * 2.功能描述:C#访问Oracle数据库共通类 * 编辑履历: * 作者 日期 版本 修改内容 * 欧阳涛 2010-10-13 1.00 新建 * 陈冰 2014-07-22 1.00 修改 *******************************************************************************/ using System; using System.Collections; using System.Collections.Generic; using System.Data; //using System.Data.OracleClient; using Oracle.ManagedDataAccess.Client; namespace Dongke.IBOSS.PRD.Basics.DataAccess { /// /// C#访问Oracle数据库共通类 /// internal sealed class OracleHelper { // 装载参数缓存的哈希表 private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); /// /// 执行查询语句,返回DataSet /// /// Oracle数据库连接串 /// 查询SQL语句 /// 查询结果集:DataSet public static DataSet Query(string connectionString, string SQLString) { using (OracleConnection oracleConnection = new OracleConnection(connectionString)) { DataSet dataSet = new DataSet(); try { oracleConnection.Open(); OracleDataAdapter command = new OracleDataAdapter(SQLString, oracleConnection); command.Fill(dataSet, "dataSet"); } catch (OracleException ex) { throw new Exception(ex.Message); } finally { if (oracleConnection.State != ConnectionState.Closed) { oracleConnection.Close(); } } return dataSet; } } /// /// 执行带参数的查询语句,返回DataSet /// /// Oracle数据库连接串 /// 查询SQL语句 /// 查询参数 /// 查询结果集:DataSet public static DataSet Query(string connectionString, string SQLString, params OracleParameter[] cmdParms) { using (OracleConnection oracleConnection = new OracleConnection(connectionString)) { OracleCommand oracleCommand = new OracleCommand(); // 对SQL语句执行对象进行赋值 PrepareCommand(oracleCommand, oracleConnection, null, SQLString, cmdParms); using (OracleDataAdapter oracleDataAdapter = new OracleDataAdapter(oracleCommand)) { DataSet dataSet = new DataSet(); try { // 填充dataset oracleDataAdapter.Fill(dataSet, "dataSet"); oracleCommand.Parameters.Clear(); } catch (OracleException ex) { throw new Exception(ex.Message); } finally { if (oracleConnection.State != ConnectionState.Closed) { oracleConnection.Close(); } } return dataSet; } } } /// /// 对执行SQL语句或者存储过程的对象进行赋值 /// /// 执行SQL语句或者存储过程的对象 /// Oracle数据库连接 /// Oracle事务 /// SQL语句或者存储过程 /// SQL语句的参数 private static void PrepareCommand(OracleCommand oracleCommand, OracleConnection oracleConnection, OracleTransaction oracleTransaction, string oracleCommandText, OracleParameter[] oracleCommandParms) { // 验证数据库连接是否打开,如果未打开则打开数据库连接 if (oracleConnection.State != ConnectionState.Open) { oracleConnection.Open(); } // 对执行对象进行的各个属性赋值 oracleCommand.Connection = oracleConnection; oracleCommand.CommandText = oracleCommandText; if (oracleTransaction != null) { oracleCommand.Transaction = oracleTransaction; } oracleCommand.CommandType = CommandType.Text; // 对执行对象的参数进行赋值 if (oracleCommandParms != null) { foreach (OracleParameter parameter in oracleCommandParms) { if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && (parameter.Value == null)) { parameter.Value = DBNull.Value; } oracleCommand.Parameters.Add(parameter); } } } /// /// 执行一条计算查询结果语句,返回查询结果(object)。 /// /// Oracle数据库连接串 /// 计算查询结果语句 /// 查询结果(object) private static object GetSingle(string connectionString, string SQLString) { using (OracleConnection oracleConnection = new OracleConnection(connectionString)) { using (OracleCommand oracleCommand = new OracleCommand(SQLString, oracleConnection)) { try { // 打开Oracle数据库连接 oracleConnection.Open(); object obj = oracleCommand.ExecuteScalar(); // 结果为空返回NULL,否则返回obj if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { return null; } else { return obj; } } catch (OracleException ex) { throw new Exception(ex.Message); } finally { if (oracleConnection.State != ConnectionState.Closed) { oracleConnection.Close(); } } } } } /// /// 判断某一SQL查询语句是否存在记录 /// /// Oracle数据库连接串 /// 查询SQL语句 /// False:不存在查询记录 True:存在查询记录 private static bool Exists(string connectionString, string strOracle) { object obj = OracleHelper.GetSingle(connectionString, strOracle); if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { return false; } else { return true; } } /// /// 执行一条带有参数的数据库操作语句(不包括SELECT) /// /// Oracle数据库连接串 /// 执行操作的方式 /// SQL语句文本 /// SQL语句的参数 /// public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) { // 创建一个执行SQL语句对象 OracleCommand oracleCommand = new OracleCommand(); OracleConnection oracleConnection = null; try { // 创建一个Oracle数据库连接 using (oracleConnection = new OracleConnection(connectionString)) { // 对SQL语句执行对象进行赋值 PrepareCommand(oracleCommand, oracleConnection, null, commandType, commandText, commandParameters); // 执行一个SQL语句对象 int intReturnVal = oracleCommand.ExecuteNonQuery(); // 关闭数据库连接 oracleConnection.Close(); // 清除执行SQL语句对象的参数 oracleCommand.Parameters.Clear(); return intReturnVal; } } catch (Exception ex) { oracleConnection.Close(); throw ex; } finally { if (oracleConnection != null && oracleConnection.State != ConnectionState.Closed) { oracleConnection.Close(); } } } /// /// 执行一个带有事务处理的SQL语句执行对象或者存储过程,带有参数 /// 例如:int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, /// "PublishOrders", new OracleParameter(":prodid", 24)); /// /// 一个存在的数据库事务 /// 执行命令类型(存储过程、SQL语句等) /// 存储过程名称或者SQL语句 /// 参数数组 /// 执行命令对数据库影响的行数 public static int ExecuteNonQuery(OracleTransaction oracleTransaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) { try { if (oracleTransaction == null) { throw new ArgumentNullException("事务处理"); } if (oracleTransaction != null && oracleTransaction.Connection == null) { throw new ArgumentException( "事务已经回滚或者提交,请提供一个打开的事务。", "事务处理"); } OracleCommand oracleCommand = new OracleCommand(); // 给SQL执行对象赋值 PrepareCommand(oracleCommand, oracleTransaction.Connection, oracleTransaction, commandType, commandText, commandParameters); // 执行SQL语句并返回受影响的行数 int intReturnVal = oracleCommand.ExecuteNonQuery(); // 清除SQL执行对象的属性值 oracleCommand.Parameters.Clear(); return intReturnVal; } catch (Exception ex) { throw ex; } } /// /// 用一个已经存在的数据库连接执行一个SQL命令 /// 例如:int result = ExecuteNonQuery(oracleConnection, /// CommandType.StoredProcedure, /// "PublishOrders", /// new OracleParameter(":prodid", 24)); /// /// 一个存在的数据库连接 /// 执行命令类型(存储过程、SQL语句等) /// 存储过程名称或者SQL语句 /// 参数数组 /// 执行命令对数据库影响的行数 private static int ExecuteNonQuery(OracleConnection oracleConnection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) { try { OracleCommand oracleCommand = new OracleCommand(); // 给SQL执行对象赋值 PrepareCommand(oracleCommand, oracleConnection, null, commandType, commandText, commandParameters); // 执行SQL语句并返回受影响的行数 int intReturnVal = oracleCommand.ExecuteNonQuery(); // 清除SQL执行对象的属性值 oracleCommand.Parameters.Clear(); return intReturnVal; } catch (Exception ex) { throw ex; } } /// /// 用一个数据库连接串执行一个SQL语句 /// 例如:int result = ExecuteNonQuery(connectionString, "PublishOrders"); /// /// 数据库连接串 /// SQL语句 /// 执行命令对数据库影响的行数 private static int ExecuteNonQuery(string connectionString, string commandText) { // 创建一个新的数据库连接 OracleCommand oracleCommand = new OracleCommand(); OracleConnection oracleConnection = new OracleConnection(connectionString); try { // 给SQL执行对象赋值 PrepareCommand(oracleCommand, oracleConnection, null, CommandType.Text, commandText, null); // 执行SQL语句并返回受影响的行数 int intReturnVal = oracleCommand.ExecuteNonQuery(); // 关闭数据库连接 oracleConnection.Close(); // 清除SQL执行对象的属性值 oracleCommand.Parameters.Clear(); return intReturnVal; } catch (Exception ex) { oracleConnection.Close(); throw ex; } finally { if (oracleConnection != null && oracleConnection.State != ConnectionState.Closed) { oracleConnection.Close(); } } } /// /// 执行一个查询语句,返回一个结果集--调用后一定要关闭OracleDataReader /// /// 数据库连接串 /// 执行命令类型(存储过程、SQL语句等) /// 存储过程名称或者SQL语句 /// 参数数组 /// 结果集 public static OracleDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) { OracleCommand oracleCommand = new OracleCommand(); OracleConnection oracleConnection = new OracleConnection(connectionString); OracleDataReader oracleDataReader = null; try { // 给SQL执行对象赋值 PrepareCommand(oracleCommand, oracleConnection, null, commandType, commandText, commandParameters); oracleDataReader = oracleCommand.ExecuteReader(CommandBehavior.CloseConnection); // 清除SQL执行对象的属性值 oracleCommand.Parameters.Clear(); return oracleDataReader; } catch (Exception ex) { oracleConnection.Close(); throw ex; } } /// /// 执行一个查询语句,返回一个结果集--调用后一定要关闭OracleDataReader /// /// 一个存在的数据库事务 /// 执行命令类型(存储过程、SQL语句等) /// 存储过程名称或者SQL语句 /// 参数数组 /// 结果集 public static OracleDataReader ExecuteReader(OracleTransaction oracleTransaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) { OracleDataReader oracleDataReader = null; try { if (oracleTransaction == null) { throw new ArgumentNullException("事务处理"); } if (oracleTransaction != null && oracleTransaction.Connection == null) { throw new ArgumentException( "事务已经回滚或者提交,请提供一个打开的事务。", "事务处理"); } OracleCommand oracleCommand = new OracleCommand(); // 给SQL执行对象赋值 PrepareCommand(oracleCommand, oracleTransaction.Connection, oracleTransaction, commandType, commandText, commandParameters); oracleDataReader = oracleCommand.ExecuteReader(CommandBehavior.CloseConnection); // 清除SQL执行对象的属性值 oracleCommand.Parameters.Clear(); return oracleDataReader; } catch (Exception ex) { throw ex; } } /// /// 用一个数据库连接串执行一个带有参数的SQL语句或者存储过程等, /// 返回结果集的第一行第一列数据对象 /// 例如:Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, /// "PublishOrders", new OracleParameter(":prodid", 24)); /// /// 一个有效的连接字符串 /// 执行命令类型(存储过程、SQL语句等) /// 存储过程名称或者SQL语句 /// 参数数组 /// 一个能转换为预期的类型的对象 private static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters) { OracleCommand oracleCommand = new OracleCommand(); OracleConnection oracleConnection = null; try { // 创建一个Oracle数据库连接 using (oracleConnection = new OracleConnection(connectionString)) { // 对SQL语句执行对象进行赋值 PrepareCommand(oracleCommand, oracleConnection, null, commandType, commandText, commandParameters); // 执行查询 object objReturnVal = oracleCommand.ExecuteScalar(); // 关闭数据库连接 oracleConnection.Close(); // 清除执行SQL语句对象的参数 oracleCommand.Parameters.Clear(); return objReturnVal; } } catch (Exception ex) { oracleConnection.Close(); throw ex; } finally { if (oracleConnection != null && oracleConnection.State != ConnectionState.Closed) { oracleConnection.Close(); } } } /// /// 用一个事务执行一个带有参数的SQL语句或者存储过程等, /// 返回结果集的第一行第一列数据对象 /// 例如:Object obj = ExecuteScalar(oracleTransaction, CommandType.StoredProcedure, /// "PublishOrders", new OracleParameter(":prodid", 24)); /// /// 一个存在的事务 /// 执行命令类型(存储过程、SQL语句等) /// 存储过程名称或者SQL语句 /// 参数数组 /// 一个能转换为预期的类型的对象 private static object ExecuteScalar(OracleTransaction oracleTransaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters) { try { if (oracleTransaction == null) { throw new ArgumentNullException("事务处理"); } if (oracleTransaction != null && oracleTransaction.Connection == null) { throw new ArgumentException( "事务已经回滚或者提交,请提供一个打开的事务。", "事务处理"); } // 创建一个SQL执行命令对象 OracleCommand oracleCommand = new OracleCommand(); // 给SQL执行命令对象赋值 PrepareCommand(oracleCommand, oracleTransaction.Connection, oracleTransaction, commandType, commandText, commandParameters); // 执行查询 object objReturnVal = oracleCommand.ExecuteScalar(); // 清除SQL执行命令对象的参数 oracleCommand.Parameters.Clear(); return objReturnVal; } catch (Exception ex) { throw ex; } } /// /// 用一个数据库连接串执行一个带有参数的SQL语句或者存储过程等, /// 返回结果集的第一行第一列数据对象 /// 例如:Object obj = ExecuteScalar(connectionString, CommandType.StoredProcedure, /// "PublishOrders", new OracleParameter(":prodid", 24)); /// /// 一个存在的数据库连接 /// 执行命令类型(存储过程、SQL语句等) /// 存储过程名称或者SQL语句< /// 参数数组 /// 一个能转换为预期的类型的对象 private static object ExecuteScalar(OracleConnection oracleConnection, CommandType commandType, string commandText, params OracleParameter[] commandParameters) { try { // 创建一个SQL执行命令对象 OracleCommand oracleCommand = new OracleCommand(); // 给SQL执行命令对象赋值 PrepareCommand(oracleCommand, oracleConnection, null, commandType, commandText, commandParameters); object objReturnVal = oracleCommand.ExecuteScalar(); oracleCommand.Parameters.Clear(); return objReturnVal; } catch (Exception ex) { throw ex; } } /// /// 添加一个参数数组到缓存 /// /// 参数的关键字 /// 输送到缓存的参数 private static void CacheParameters(string cacheKey, params OracleParameter[] commandParameters) { parmCache[cacheKey] = commandParameters; } /// /// 从缓存中取得参数 /// /// 参数的关键字 /// SQL执行命令对象参数 private static OracleParameter[] GetCachedParameters(string cacheKey) { OracleParameter[] cachedParms = (OracleParameter[])parmCache[cacheKey]; if (cachedParms == null) { return null; } // 缓存中有参数 OracleParameter[] clonedParms = new OracleParameter[cachedParms.Length]; // 返回一个参数的拷贝 for (int i = 0, j = cachedParms.Length; i < j; i++) clonedParms[i] = (OracleParameter)((ICloneable)cachedParms[i]).Clone(); return clonedParms; } /// /// 为数据库执行准备一个执行对象(内部方法) /// /// 执行命令对象 /// 一个存在的数据库连接 /// 事务 /// 执行命令类型(存储过程、SQL语句等) /// 存储过程名称或者SQL语句 /// 参数数组 private static void PrepareCommand(OracleCommand oracleCommand, OracleConnection oracleConnection, OracleTransaction oracleTransaction, CommandType commandType, string commandText, OracleParameter[] commandParameters) { try { // 打开连接 if (oracleConnection.State != ConnectionState.Open) { oracleConnection.Open(); } // 设置执行命令对象的属性值 oracleCommand.Connection = oracleConnection; oracleCommand.CommandText = commandText; oracleCommand.CommandType = commandType; // 如果事务存在,则将事务绑定到执行命令对象上 if (oracleTransaction != null) { oracleCommand.Transaction = oracleTransaction; } // 将参数绑定到执行命令对象上 if (commandParameters != null) { foreach (OracleParameter parm in commandParameters) { oracleCommand.Parameters.Add(parm); } } } catch (Exception ex) { throw ex; } } /// /// 转换成Oracle的布尔数据类型 /// /// 转换值 /// private static string OraBit(bool value) { if (value) { return "Y"; } else { return "N"; } } /// /// 转换成Oracle的布尔数据类型 /// /// 转换值 /// private static bool OraBool(string value) { if (value.Equals("Y")) { return true; } else { return false; } } /// /// 执行多条SQL语句,实现数据库事务。 /// /// 数据库连接字符串 /// 多条SQL语句 private static bool ExecuteSqlTran(string connectionString, List commandInfoList) { using (OracleConnection oracleConnection = new OracleConnection(connectionString)) { // 打开连接 oracleConnection.Open(); // 给执行命令对象赋值 OracleCommand oracleCommand = new OracleCommand(); oracleCommand.Connection = oracleConnection; OracleTransaction oracleTransaction = oracleConnection.BeginTransaction(); oracleCommand.Transaction = oracleTransaction; try { foreach (CommandInfo commandInfo in commandInfoList) { if (!string.IsNullOrEmpty(commandInfo.CommandText)) { // 为执行命令对象赋值 PrepareCommand(oracleCommand, oracleConnection, oracleTransaction, CommandType.Text, commandInfo.CommandText, (OracleParameter[])commandInfo.Parameters); // 检查SQL语句是否符合要求,不符合则回滚事务,抛出异常 if (commandInfo.EffentNextType == EffentNextType.WhenHaveContine || commandInfo.EffentNextType == EffentNextType.WhenNoHaveContine) { if (commandInfo.CommandText.ToLower().IndexOf("count(") == -1) { oracleTransaction.Rollback(); throw new Exception("Oracle:违背要求" + commandInfo.CommandText + "必须符合select count(..的格式"); } // 检查影响行是否大于0,否则回滚事务并抛出异常 object obj = oracleCommand.ExecuteScalar(); bool isHave = false; if (obj == null && obj == DBNull.Value) { isHave = false; } isHave = Convert.ToInt32(obj) > 0; if (commandInfo.EffentNextType == EffentNextType.WhenHaveContine && !isHave) { oracleTransaction.Rollback(); throw new Exception("Oracle:违背要求" + commandInfo.CommandText + "返回值必须大于0"); } if (commandInfo.EffentNextType == EffentNextType.WhenNoHaveContine && isHave) { oracleTransaction.Rollback(); throw new Exception("Oracle:违背要求" + commandInfo.CommandText + "返回值必须等于0"); } continue; } // 检查是否符合影响行数不为0的规则,否则回滚事务并抛出异常 int res = oracleCommand.ExecuteNonQuery(); if (commandInfo.EffentNextType == EffentNextType.ExcuteEffectRows && res == 0) { oracleTransaction.Rollback(); throw new Exception("Oracle:违背要求" + commandInfo.CommandText + "必须有影像行"); } } } oracleTransaction.Commit(); return true; } catch (OracleException ex) { oracleTransaction.Rollback(); throw ex; } finally { // 关闭数据库连接 if (oracleConnection.State != ConnectionState.Closed) { oracleConnection.Close(); } } } } /// /// 执行多条SQL语句,实现数据库事务。 /// /// 数据库连接字符串 /// 多条SQL语句 public static void ExecuteSqlTranByStrs(string connectionString, List SQLStringList) { using (OracleConnection oracleConnection = new OracleConnection(connectionString)) { // 打开数据库连接 oracleConnection.Open(); // 为执行命令对象赋值 OracleCommand oracleCommand = new OracleCommand(); oracleCommand.Connection = oracleConnection; OracleTransaction oracleTransaction = oracleConnection.BeginTransaction(); oracleCommand.Transaction = oracleTransaction; try { foreach (string sql in SQLStringList) { if (!string.IsNullOrEmpty(sql)) { oracleCommand.CommandText = sql; oracleCommand.ExecuteNonQuery(); } } oracleTransaction.Commit(); } catch (OracleException ex) { oracleTransaction.Rollback(); throw new Exception(ex.Message); } finally { if (oracleConnection.State != ConnectionState.Closed) { oracleConnection.Close(); } } } } /// /// 获得该SQL查询返回DataTable,如果没有查询到则返回NULL /// /// 连接字符串 /// 查询语句 /// SQL语句参数 /// DataTable public static DataTable GetDataTable(string connectionString, string SQLString, params OracleParameter[] cmdParms) { try { DataTable dataTable = new DataTable(); DataSet dataSet = Query(connectionString, SQLString, cmdParms); if (dataSet != null) { dataTable = dataSet.Tables["dataSet"]; } return dataTable; } catch (Exception ex) { throw ex; } } } }