using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.ComponentModel;
namespace SQLHelper
{
public class SQLHelper
{
//连接数据源
private static SqlConnection myConnection;
private static string RETURNVALUE="RETURNVALUE";
//数据库连接字符串
public static readonly string connectionString = ConfigurationSettings.AppSettings["OracledataConnectionString"].ToString();
// public static readonly string sqlstylestring = ConfigurationSettings.AppSettings["sqlstylestring"].ToString();
// public static readonly string HelpdeskConnectionString = ConfigurationSettings.AppSettings["HelpdeskConnectionString"].ToString();
//哈希表用来存储缓存的参数信息,哈希表可以存储任意类型的参数。
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
/// <summary>
/// 打开数据库
/// </summary>
public void Open()
{
if (myConnection == null)
{
myConnection = new SqlConnection(connectionString);
}
if (myConnection.State == ConnectionState.Closed)
{
try
{
//打开数据库连接
myConnection.Open();
}
catch (Exception ex)
{
SystemError.SystemLog(ex.Message);
}
}
}
/// <summary>
/// 关闭数据库
/// </summary>
public void Close()
{
//判断连接是否已经创建
if (myConnection != null)
{
//判断连接的状态是否打开
if (myConnection.State == ConnectionState.Open)
{
myConnection.Close();
}
}
}
/// <summary>
/// 释放资源
/// </summary>
public void Dispose()
{
//确认连接是否已经关闭
if (myConnection != null)
{
myConnection.Dispose();
myConnection = null;
}
}
/// <summary>
/// 创建查询语句命令
/// </summary>
/// <param name="txtSQL"></param>
/// <returns></returns>
private SqlCommand CreateSQLCommand(string txtSQL)
{
Open();
///设置Command
SqlCommand cmd = new SqlCommand(txtSQL, myConnection);
cmd.CommandType = CommandType.Text;
return cmd;
}
/// <summary>
/// 执行查询语句
/// </summary>
/// <param name="SQL">SQL查询语句</param>
/// <param name="dataReader">返回查询语句数据</param>
/// <returns></returns>
public void RunSQL(string SQL, out SqlDataReader dataReader)
{
SqlCommand cmd = CreateSQLCommand(SQL); ///创建Command
dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection); ///读取数据
}
#region 执行存储过程
/// <summary>
/// 执行存储过程1
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <returns>返回存储过程返回值</returns>
public int RunProc(string procName)
{
SqlCommand cmd = CreateCommand(procName, null);
try
{
///执行存储过程
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
///记录错误日志
SystemError.SystemLog(ex.Message);
}
///关闭数据库的连接
Close();
///返回存储过程的参数值
return (int)cmd.Parameters[RETURNVALUE].Value;
}
/// <summary>
/// 执行存储过程2
/// </summary>
/// <param name="procName">存储过程名称</param>
/// <param name="prams">存储过程所需参数</param>
/// <returns>返回存储过程返回值</returns>
public int RunProc(string procName, SqlParameter[] prams)
{
SqlCommand cmd = CreateCommand(procName, prams);
try
{
///执行存储过程
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
///记录错误日志
SystemError.SystemLog(ex.Message);
}
///关闭数据库的连接
Close();
///返回存储过程的参数值
return (int)cmd.Parameters[RETURNVALUE].Value;
}
/// <summary>
/// 执行存储过程3(DataReader)
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <param name="dataReader">返回存储过程返回值</param>
public void RunProc(string procName, out SqlDataReader dataReader)
{
///创建Command
SqlCommand cmd = CreateCommand(procName, null);
///读取数据
dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
/// <summary>
/// 执行存储过程4(一个参数,DataReader)
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <param name="prams">存储过程所需参数</param>
/// <param name="dataReader">存储过程所需参数</param>
public void RunProc(string procName, SqlParameter[] prams, out SqlDataReader dataReader)
{
///创建Command
SqlCommand cmd = CreateCommand(procName, prams);
///读取数据
dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
/// <summary>
/// 通过存储过程,得到DataSet:1
/// </summary>
/// <param name="procName"></param>
/// <param name="tableName"></param>
/// <param name="dataSet"></param>
public void RunProc(string procName, string tableName, out DataSet dataSet)
{
SqlDataAdapter adapter = new SqlDataAdapter(this.CreateCommand(procName, null));
DataSet set = new DataSet();
adapter.Fill(set, tableName);
dataSet = set;
}
/// <summary>
/// 通过存储过程,得到DataSet:2
/// </summary>
/// <param name="procName"></param>
/// <param name="prams"></param>
/// <param name="dataSet"></param>
public void RunProc(string procName, SqlParameter[] prams, out DataSet dataSet)
{
SqlDataAdapter adapter = new SqlDataAdapter(this.CreateCommand(procName, prams));
DataSet set = new DataSet();
adapter.Fill(set);
dataSet = set;
}
/// <summary>
/// 通过存储过程,得到DataSet:3
/// </summary>
/// <param name="procName"></param>
/// <param name="prams"></param>
/// <param name="tableName"></param>
/// <param name="dataSet"></param>
public void RunProc(string procName, SqlParameter[] prams, string tableName, out DataSet dataSet)
{
SqlDataAdapter adapter = new SqlDataAdapter(this.CreateCommand(procName, prams));
DataSet set = new DataSet();
adapter.Fill(set, tableName);
dataSet = set;
}
#endregion
/// <summary>
/// 创建一个SqlCommand对象以此来执行存储过程
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <param name="prams">存储过程所需参数</param>
/// <returns>返回SqlCommand对象</returns>
private SqlCommand CreateCommand(string procName, SqlParameter[] prams)
{
///打开数据库连接
Open();
///设置Command
SqlCommand cmd = new SqlCommand(procName, myConnection);
cmd.CommandType = CommandType.StoredProcedure;
///添加存储过程的参数
if (prams != null)
{
foreach (SqlParameter parameter in prams)
{
cmd.Parameters.Add(parameter);
}
}
///添加返回参数ReturnValue
cmd.Parameters.Add(
new SqlParameter(RETURNVALUE, SqlDbType.Int, 4, ParameterDirection.ReturnValue,
false, 0, 0, string.Empty, DataRowVersion.Default, null));
///返回创建的SqlCommand对象
return cmd;
}
private void PrepareCommand(SqlCommand cmd, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
{
//打开数据库连接
Open();
//设置Command
cmd.Connection = myConnection;
cmd.CommandType = cmdType;
cmd.CommandTimeout = 720;
cmd.CommandText = cmdText;
//判断是否需要事务处理
if (trans != null)
cmd.Transaction = trans;
if (cmdParms != null)
{
foreach (SqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
//添加返回值参数ReturnValue
cmd.Parameters.Add(new SqlParameter(RETURNVALUE, SqlDbType.Int, 4, ParameterDirection.ReturnValue, false, 0, 0, string.Empty, DataRowVersion.Default, null));
//cmd = mycmd;
}
#region 参数
/// <summary>
/// 缓存参数数组
/// </summary>
/// <param name="cacheKey">参数缓存的键值</param>
/// <param name="cmdParms">被缓存的参数列表</param>
public void CacheParameters(string cacheKey, params SqlParameter[] cmdParms)
{
parmCache[cacheKey] = cmdParms;
}
/// <summary>
/// 获取被缓存的参数
/// </summary>
/// <param name="cacheKey">用于查找参数的KEY值</param>
/// <returns>返回缓存的参数数组</returns>
public SqlParameter[] GetCacheParameters(string cacheKey)
{
SqlParameter[] cachedParms = (SqlParameter[])SQLHelper.parmCache[cacheKey];
if (cachedParms == null) { return null; }
//新建一个参数克隆列表
SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];
//通过循环为克隆参数列表赋值
for (int i = 0, j = cachedParms.Length; i < j; i++)
{
clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();
}
return clonedParms;
}
/// <summary>
/// 创建SqlCommand命令的参数:1
/// </summary>
/// <param name="paramName">参数名称</param>
/// <param name="DbType">参数数据类型</param>
/// <param name="Size">参数大小</param>
/// <param name="Direction">参数方向</param>
/// <param name="Value">参数值</param>
/// <returns>返回参数对象</returns>
public SqlParameter CreateParam(string paramName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value)
{
SqlParameter param;
if (Size > 0)
{
param = new SqlParameter(paramName, DbType,Size);
}
else
{
//当参数大小为0时,不使用该参数大小值
param = new SqlParameter(paramName, DbType);
}
param.Direction = Direction;
//创建输出类型的参数
if(!(Direction==ParameterDirection.Output && Value==null))
{
param.Value=Value;
}
////创建返回类型参数
//if(!(Direction==ParameterDirection.ReturnValue && Value==null))
//{
// param.Value=Value;
//}
return param;
}
/// <summary>
/// 创建输入类型参数:2
/// </summary>
/// <param name="paramName">参数名称</param>
/// <param name="DbType">参数数据类型</param>
/// <param name="Size">参数大小</param>
/// <param name="Value">参数值</param>
/// <returns>返回参数对象</returns>
public SqlParameter CreateInParam(string paramName, SqlDbType DbType, int Size, object Value)
{
//创建参数
return CreateParam(paramName, DbType, Size, ParameterDirection.Input, Value);
}
/// <summary>
/// 创建输出类型参数:3
/// </summary>
/// <param name="paramName">参数名称</param>
/// <param name="DbType">参数数据类型</param>
/// <param name="Size">参数大小</param>
/// <returns>返回参数对象</returns>
public SqlParameter CreateOutParam(string paramName,SqlDbType DbType,int Size)
{
//创建参数
return CreateParam(paramName,DbType,Size,ParameterDirection.Output,null);
}
/// <summary>
/// 创建返回类型参数:4
/// </summary>
/// <param name="paramName">参数名称</param>
/// <param name="DbType">参数数据类型</param>
/// <param name="Size">参数大小</param>
/// <returns>返回参数对象</returns>
public SqlParameter CreateReturnParam(string paramName,SqlDbType DbType,int Size)
{
//创建参数
return CreateParam(paramName,DbType,Size,ParameterDirection.ReturnValue,null);
}
#endregion
#region SqlCommand命令
/// <summary>
/// 执行一个不需要返回数据的SqlCommand命令,只获取影响的行数
/// </summary>
/// <param name="cmdType">SqlCommand命令类型</param>
/// <param name="cmdText">SqlCommand命令</param>
/// <param name="cmdParams">参数列表</param>
/// <returns>返回一个数值表示SqlCommand命令执行后所影响的行数</returns>
public int ExecuteNonQuery(CommandType cmdType,string cmdText, params SqlParameter[] cmdParams)
{
SqlCommand cmd = new SqlCommand();
int val = 0;
try
{
PrepareCommand(cmd, null, cmdType, cmdText, cmdParams);
val = cmd.ExecuteNonQuery();
//清空SqlCommand中的参数列表
cmd.Parameters.Clear();
}
catch (Exception ex)
{
SystemError.SystemLog(ex.Message);
cmd.Dispose();
//Close();
throw;
}
finally
{
//关闭数据库连接
cmd.Dispose();
//Close();
}
return (val);
}
/// <summary>
/// 执行一条返回数据集的SqlCommand命令
/// </summary>
/// <param name="cmdType">SqlCommand命令类型</param>
/// <param name="cmdText">SqlCommand命令</param>
/// <param name="cmdParams">参数列表</param>
/// <returns>返回一个包含数据集的SqlDataReader</returns>
public SqlDataReader ExecuteReader(CommandType cmdType, string cmdText, params SqlParameter[] cmdParams)
{
SqlCommand cmd = new SqlCommand();
try
{
PrepareCommand(cmd, null, cmdType, cmdText, cmdParams);
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return (rdr);
}
catch (Exception ex)
{
SystemError.SystemLog(ex.Message);
Close();
throw;
}
finally
{
//关闭数据库连接
//Close();
}
}
/// <summary>
/// 执行一条返回数据集的SqlCommand命令
/// </summary>
/// <param name="cmdType">SqlCommand命令类型</param>
/// <param name="cmdText">SqlCommand命令</param>
/// <param name="cmdParams">参数列表</param>
/// <returns>返回一个包含数据集的SqlDataAdapter</returns>
public SqlDataAdapter ExecuteAdapter(CommandType cmdType, string cmdText, params SqlParameter[] cmdParams)
{
SqlCommand cmd = new SqlCommand();
try
{
PrepareCommand(cmd, null, cmdType, cmdText, cmdParams);
SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
//SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return (dataAdapter);
}
catch (Exception ex)
{
SystemError.SystemLog(ex.Message);
Close();
throw;
}
finally
{
//关闭数据库连接
//Close();
}
}
/// <summary>
/// 执行一个返回第一条记录第一列的SqlCommand命令
/// </summary>
/// <param name="cmdType">SqlCommand命令类型</param>
/// <param name="cmdText">SqlCommand命令</param>
/// <param name="cmdParams">参数列表</param>
/// <returns>返回一个object类型的数据,可以通过Convert.To{Type}方法转换类型</returns>
public object ExecuteScalar(CommandType cmdType, string cmdText, params SqlParameter[] cmdParams)
{
SqlCommand cmd = new SqlCommand();
try
{
PrepareCommand(cmd, null, cmdType, cmdText, cmdParams);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return (val);
}
catch (Exception ex)
{
SystemError.SystemLog(ex.Message);
Close();
throw;
}
finally
{
//关闭数据库连接
//Close();
}
}
#endregion
}
}