using System;
using System.Configuration;
using System.Data;
using System.Collections;
using System.Data.OracleClient;
namespace CallCenterApi.DB
{
///
///Oracle数据库操作帮助类
///
public abstract class OracleHelper
{
//从配置文件中读取配置好的连接字符串
public static readonly string connectionString = ConfigurationManager.ConnectionStrings["oracleconn"].ConnectionString;
//为缓存的参数创建一个hashtable
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
///
/// 增删改操作使用此方法
///
/// 连接字符串
/// 命令类型(sql语句或者存储过程)
/// 要执行的sql语句或者存储过程名称
/// 执行所需的一些参数
/// 返回受影响的行数
public static int ExecuteNonQuery(CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
// 创建一个OracleCommand
OracleCommand cmd = new OracleCommand();
//创建一个OracleConnection
using (OracleConnection connection = new OracleConnection(connectionString))
{
//调用静态方法PrepareCommand完成赋值操作
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
//执行命令返回
int val = cmd.ExecuteNonQuery();
//清空参数
cmd.Parameters.Clear();
return val;
}
}
///
/// 增删改操作使用此方法(需要一个存在的事务参数)
///
/// 一个存在的事务
/// 命令类型(sql或者存储过程)
/// sql语句或者存储过程名称
/// 命令所需参数数组
/// 返回受影响的行数
public static int ExecuteNonQuery(OracleTransaction trans, CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
// 创建一个OracleCommand
OracleCommand cmd = new OracleCommand();
//调用静态方法PrepareCommand完成赋值操作
PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
//执行命令返回
int val = cmd.ExecuteNonQuery();
//清空参数
cmd.Parameters.Clear();
return val;
}
///
/// 增删改操作使用此方法(需要一个存在的连接)
///
/// 一个存在的OracleConnection参数
/// 命令类型(sql或者存储过程)
/// sql语句或者存储过程名称
/// 命令所需参数数组
/// 返回受影响的行数
public static int ExecuteNonQuery(OracleConnection connection, CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
// 创建一个OracleCommand
OracleCommand cmd = new OracleCommand();
//调用静态方法PrepareCommand完成赋值操作
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
//执行命令返回
int val = cmd.ExecuteNonQuery();
//清空参数
cmd.Parameters.Clear();
return val;
}
///
/// 查询返回一个结果集
///
/// 连接字符串
//// 命令类型(sql或者存储过程)
/// sql语句或者存储过程名称
/// 命令所需参数数组
///
public static OracleDataReader ExecuteReader(CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
// 创建一个OracleCommand
OracleCommand cmd = new OracleCommand();
// 创建一个OracleConnection
OracleConnection conn = new OracleConnection(connectionString);
try
{
//调用静态方法PrepareCommand完成赋值操作
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
//执行查询
OracleDataReader odr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
//清空参数
cmd.Parameters.Clear();
return odr;
}
catch
{
//如果发生异常,关闭连接,并且向上抛出异常
conn.Close();
throw;
}
}
///
/// 执行语句返回的是单行单列的结果
///
/// 连接字符串
/// 命令类型(sql或者存储过程)
/// sql语句或者存储过程名称
/// 命令所需参数数组
/// 返回是第一行第一列的结果(object类型)请使用Covert.to进行类型转换
public static object ExecuteScalar(CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
// 创建一个OracleCommand
OracleCommand cmd = new OracleCommand();
// 创建一个OracleConnection
using (OracleConnection conn = new OracleConnection(connectionString))
{
//调用静态方法PrepareCommand完成赋值操作
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
//执行查询
object val = cmd.ExecuteScalar();
//清空参数
cmd.Parameters.Clear();
return val;
}
}
///
/// 执行语句返回的是单行单列的结果(有指定的事务参数)
///
/// 一个存在的事务参数
/// 命令类型(sql或者存储过程)
/// sql语句或者存储过程名称
/// 命令所需参数数组
/// 返回是第一行第一列的结果(object类型)请使用Covert.to进行类型转换
public static object ExecuteScalar(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
{
//如果传入的事务是空值,抛出异常
if (transaction == null)
throw new ArgumentNullException("transaction");
//如果传入的事务无连接,抛出异常(无连接,说明传入的事务参数是已经提交过或者回滚了的事务)
if (transaction != null && transaction.Connection == null)
throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
// 创建一个OracleCommand
OracleCommand cmd = new OracleCommand();
//调用静态方法PrepareCommand完成赋值操作
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters);
//执行查询
object retval = cmd.ExecuteScalar();
//清空参数
cmd.Parameters.Clear();
return retval;
}
///
/// 执行语句返回的是单行单列的结果(有指定的连接参数)
///
/// 一个存在的连接参数
/// 命令类型(sql或者存储过程)
/// sql语句或者存储过程名称
/// 命令所需参数数组
/// 返回是第一行第一列的结果(object类型)请使用Covert.to进行类型转换
public static object ExecuteScalar(OracleConnection conn, CommandType cmdType, string cmdText, params OracleParameter[] commandParameters)
{
// 创建一个OracleCommand
OracleCommand cmd = new OracleCommand();
//调用静态方法PrepareCommand完成赋值操作
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
//执行查询
object val = cmd.ExecuteScalar();
//清空参数
cmd.Parameters.Clear();
return val;
}
///
/// Add a set of parameters to the cached
///
/// Key value to look up the parameters
/// Actual parameters to cached
public static void CacheParameters(string cacheKey, params OracleParameter[] commandParameters)
{
parmCache[cacheKey] = commandParameters;
}
///
/// 从缓存中获取参数
///
/// look up 中的cachekey
///
public static OracleParameter[] GetCachedParameters(string cacheKey)
{
OracleParameter[] cachedParms = (OracleParameter[])parmCache[cacheKey];
if (cachedParms == null)
return null;
// 如果缓存中有此参数
OracleParameter[] clonedParms = new OracleParameter[cachedParms.Length];
// 返回参数的copy
for (int i = 0, j = cachedParms.Length; i < j; i++)
clonedParms[i] = (OracleParameter)((ICloneable)cachedParms[i]).Clone();
return clonedParms;
}
///
/// 一个静态的预处理函数
///
/// 存在的OracleCommand对象
/// 存在的OracleConnection对象
/// 存在的OracleTransaction对象
/// 命令类型(sql或者存在过程)
/// sql语句或者存储过程名称
/// Parameters for the command
private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, CommandType cmdType, string cmdText, OracleParameter[] commandParameters)
{
//如果连接未打开,先打开连接
if (conn.State != ConnectionState.Open)
conn.Open();
//未要执行的命令设置参数
cmd.Connection = conn;
cmd.CommandText = cmdText;
cmd.CommandType = cmdType;
//如果传入了事务,需要将命令绑定到指定的事务上去
if (trans != null)
cmd.Transaction = trans;
//将传入的参数信息赋值给命令参数
if (commandParameters != null)
{
cmd.Parameters.AddRange(commandParameters);
}
}
}
}