自己编写的数据访问类(C#)--补充代码
作者/天才 时间/2006-1-10 17:35:00 类别/开发技术 查看/
 发表评论 以论坛方式查看
标签:.Net联盟
作者:黄润成



自己编写的数据访问类(C#)--补充代码


不好意思,忘记贴代码了。。。


using System;
using System.Data;
using System.Collections;
using System.Threading;

namespace it.com.cn.DbServices
{
/// <summary>
/// 定义 数据服务接口,通过 DbService 类访问的数据服务对象必须实现该接口。主要定义各种访问数据库的方法签名。
/// </summary>
public interface IDbService
{
/// <summary>
/// 获取或设置 数据服务对象使用的数据库连接串。
/// </summary>
string ConnectionString{get;set;}

/// <summary>
/// 获取 执行错误信息。
/// </summary>
string ErrorMessage{get;}

/// <summary>
/// 获取 数据库连接状态。
/// </summary>
ConnectionState State{get;}

/// <summary>
/// 获取 数据库打开连接到当前时间的时间计数值。
/// </summary>
long TickCount{get;}

/// <summary>
/// 创建参数对象。
/// </summary>
/// <param name="ParamName">参数名称。</param>
/// <param name="ParamType">参数类型。</param>
/// <returns>返加 创建的参数对象。</returns>
IDbDataParameter CreateParameter(string ParamName, DbType ParamType);
/// <summary>
/// 创建参数对象。
/// </summary>
/// <param name="ParamName">参数名称。</param>
/// <param name="ParamType">参数类型。</param>
/// <param name="ParamValue">参数值。</param>
/// <returns>返加 创建的参数对象。</returns>
IDbDataParameter CreateParameter(string ParamName, DbType ParamType, object ParamValue);
/// <summary>
/// 创建参数对象。
/// </summary>
/// <param name="ParamName">参数名称。</param>
/// <param name="ParamType">参数类型。</param>
/// <param name="ParamValue">参数值。</param>
/// <param name="ParamDirection">参数的传递方向(Input; Output; InputOutput; ReturnValue)</param>
/// <returns>返加 创建的参数对象。</returns>
IDbDataParameter CreateParameter(string ParamName, DbType ParamType, object ParamValue, ParameterDirection ParamDirection);

/// <summary>
/// 创建 DbParams 对象,根据传入的参数名称数组、参数类型数组返回一个包含 0 个或多个参数对象(IDbDataParameter)的 DbParams 对象。
/// DbParams 对象用于设置执行 SQL 语句所需要的参数。
/// </summary>
/// <param name="ParamNames">字符串类型的数组,表示多个参数名称,例如:new string[]{"@Param1", "@Param2",..."@ParamN"}</param>
/// <param name="ParamTypes">DbType 类型的数组,指定对应前面的各个参数的类型。</param>
/// <returns>返回 一个包含 0 个或多个参数对象(IDbDataParameter)的 DbParams 对象。</returns>
DbParams CreateDbParams(string[] ParamNames, DbType[] ParamTypes);
/// <summary>
/// 创建 DbParams 对象,根据传入的参数名称数组、参数类型数组、参数值数组返回一个包含 0 个或多个参数对象(IDbDataParameter)的 DbParams 对象。
/// DbParams 对象用于设置执行 SQL 语句所需要的参数。
/// </summary>
/// <param name="ParamNames">字符串类型的数组,表示多个参数名称,例如:new string[]{"@Param1", "@Param2",..."@ParamN"}</param>
/// <param name="ParamTypes">DbType 类型的数组,指定对应前面的各个参数的类型。</param>
/// <param name="ParamValues">object 类型的数组,指定对应前面的各个参数的值。</param>
/// <returns>返回 一个包含 0 个或多个参数对象(IDbDataParameter)的 DbParams 对象。</returns>
DbParams CreateDbParams(string[] ParamNames, DbType[] ParamTypes, object[] ParamValues);
/// <summary>
/// 创建 DbParams 对象,根据传入的参数名称数组、参数类型数组、参数值数组、参数传递方向数组返回一个包含 0 个或多个参数对象(IDbDataParameter)的 DbParams 对象。
/// DbParams 对象用于设置执行 SQL 语句所需要的参数。
/// </summary>
/// <param name="ParamNames">字符串类型的数组,表示多个参数名称,例如:new string[]{"@Param1", "@Param2",..."@ParamN"}</param>
/// <param name="ParamTypes">DbType 类型的数组,指定对应前面的各个参数的类型。</param>
/// <param name="ParamValues">object 类型的数组,指定对应前面的各个参数的值。</param>
/// <param name="ParamDirections">ParameterDirection 类型的数组,指定对应前面各个参数的传递方向。</param>
/// <returns>返回 一个包含 0 个或多个参数对象(IDbDataParameter)的 DbParams 对象。</returns>
DbParams CreateDbParams(string[] ParamNames, DbType[] ParamTypes, object[] ParamValues, ParameterDirection[] ParamDirections);

/// <summary>
/// 创建 DbParams 对象,根据传入的参数名称、参数类型返回一个包含 1 个参数对象(IDbDataParameter)的 DbParams 对象。
/// DbParams 对象用于设置执行 SQL 语句所需要的参数。
/// </summary>
/// <param name="ParamName">参数名称。</param>
/// <param name="ParamType">参数类型。</param>
/// <returns>返回 一个包含 1 个参数对象(IDbDataParameter)的 DbParams 对象。</returns>
DbParams CreateDbParams(string ParamName, DbType ParamType);
/// <summary>
/// 创建 DbParams 对象,根据传入的参数名称、参数类型返回一个包含 1 个参数对象(IDbDataParameter)的 DbParams 对象。
/// DbParams 对象用于设置执行 SQL 语句所需要的参数。
/// </summary>
/// <param name="ParamName">参数名称。</param>
/// <param name="ParamType">参数类型。</param>
/// <param name="ParamValue">参数值。</param>
/// <returns>返回 一个包含 1 个参数对象(IDbDataParameter)的 DbParams 对象。</returns>
DbParams CreateDbParams(string ParamName, DbType ParamType, object ParamValue);
/// <summary>
/// 创建 DbParams 对象,根据传入的参数名称、参数类型返回一个包含 1 个参数对象(IDbDataParameter)的 DbParams 对象。
/// DbParams 对象用于设置执行 SQL 语句所需要的参数。
/// </summary>
/// <param name="ParamName">参数名称。</param>
/// <param name="ParamType">参数类型。</param>
/// <param name="ParamValue">参数值。</param>
/// <param name="ParamDirection">参数传递方向。</param>
/// <returns>返回 一个包含 1 个参数对象(IDbDataParameter)的 DbParams 对象。</returns>
DbParams CreateDbParams(string ParamName, DbType ParamType, object ParamValue, ParameterDirection ParamDirection);


/// <summary>
/// 执行 无返回结果的存储过程,或执行结果通过传出(Output、InputOutput)类型的参数获取。
/// </summary>
/// <param name="ProcedureName">存储过程名称。</param>
/// <param name="Params">存储过程参数对象:DbParams。</param>
void ExecuteProcedure( string ProcedureName, DbParams Params );
/// <summary>
/// 执行 返回包含查询结果的 IDataReaderWrapper 对象的存储过程。
/// </summary>
/// <param name="ProcedureName">存储过程名称。</param>
/// <param name="Params">存储过程参数对象:DbParams。</param>
/// <returns>返回 包含查询结果的 IDataReaderWrapper 对象。</returns>
IDataReaderWrapper ExecuteProcedureReader( string ProcedureName, DbParams Params );
/// <summary>
/// 执行 返回包含查询结果的 DataSet 对象的存储过程。
/// </summary>
/// <param name="ProcedureName">存储过程名称。</param>
/// <param name="Params">存储过程参数对象:DbParams。</param>
/// <returns>返回 包含查询结果的 DataSet 对象。</returns>
DataSet ExecuteProcedureDataSet( string ProcedureName, DbParams Params );
/// <summary>
/// 执行 返回包含查询结果的 DataTable 对象的存储过程。
/// </summary>
/// <param name="ProcedureName">存储过程名称。</param>
/// <param name="Params">存储过程参数对象:DbParams。</param>
/// <returns>返回 包含查询结果的 DataTable 对象。</returns>
DataTable ExecuteProcedureTable( string ProcedureName, DbParams Params );
/// <summary>
/// 执行 返回仅包含传出(Output、InputOutput)类型的参数对象(DbParams)的存储过程。
/// </summary>
/// <param name="ProcedureName">存储过程名称。</param>
/// <param name="Params">存储过程参数对象:DbParams,需要指定传出的参数。</param>
/// <returns>返回 仅包含传出(Output、InputOutput)类型的参数对象(DbParams)的存储过程。</returns>
DbParams ExecuteProcedureResults( string ProcedureName, DbParams Params );

/// <summary>
/// 执行 无参数和返回值的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
void ExecuteNone( string SqlString );
/// <summary>
/// 执行 无参数的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
void ExecuteNone( string SqlString, DbParams Params );

/// <summary>
/// 执行 返回 IDataReaderWrapper 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <returns>返回 IDataReaderWrapper 对象。</returns>
IDataReaderWrapper ExecuteReader( string SqlString );
/// <summary>
/// 执行 返回 IDataReaderWrapper 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <returns>返回 IDataReaderWrapper 对象。</returns>
IDataReaderWrapper ExecuteReader( string SqlString, DbParams Params );

/// <summary>
/// 执行 返回 DataSet 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <returns>返回 DataSet 对象。</returns>
DataSet ExecuteDataSet( string SqlString );
/// <summary>
/// 执行 从指定的行号开始,返回包含指定记录行数的 DataSet 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <returns>从指定的行号开始,返回包含指定记录行数的 DataSet 对象。</returns>
DataSet ExecuteDataSet( string SqlString, int StartRowNo, int MaxRowCount );
/// <summary>
/// 执行 返回 DataSet 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <returns>返回 DataSet 对象。</returns>
DataSet ExecuteDataSet( string SqlString, DbParams Params );
/// <summary>
/// 执行 从指定的行号开始,返回包含指定记录行数的 DataSet 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <returns>从指定的行号开始,返回包含指定记录行数的 DataSet 对象。</returns>
DataSet ExecuteDataSet( string SqlString, DbParams Params, int StartRowNo, int MaxRowCount );

/// <summary>
/// 执行 返回指定结果数据集表名称的 DataSet 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 指定结果数据集表名称的 DataSet 对象。</returns>
DataSet ExecuteDataSet( string SqlString, string TableName );
/// <summary>
/// 执行 从指定的行号开始,返回包含指定记录行数的 DataSet 对象的 SQL 语句,并指定映射表名称。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 指定结果数据集表名称的 DataSet 对象。</returns>
DataSet ExecuteDataSet( string SqlString, int StartRowNo, int MaxRowCount, string TableName );
/// <summary>
/// 执行 返回 DataSet 对象的 SQL 语句,并指定映射表名称。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 指定结果数据集表名称的 DataSet 对象。</returns>
DataSet ExecuteDataSet( string SqlString, DbParams Params, string TableName );
/// <summary>
/// 执行 返回 DataSet 对象的 SQL 语句,并指定映射表名称。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 指定结果数据集表名称的 DataSet 对象。</returns>
DataSet ExecuteDataSet( string SqlString, DbParams Params, int StartRowNo, int MaxRowCount, string TableName );

/// <summary>
/// 执行 返回 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <returns>返回 DataTable 对象。</returns>
DataTable ExecuteDataTable( string SqlString );
/// <summary>
/// 执行 从指定的行号开始,返回包含指定记录行数的 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <returns>从指定的行号开始,返回包含指定记录行数的 DataTable 对象。</returns>
DataTable ExecuteDataTable( string SqlString, int StartRowNo, int MaxRowCount );
/// <summary>
/// 执行 返回 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <returns>返回 DataTable 对象。</returns>
DataTable ExecuteDataTable( string SqlString, DbParams Params );
/// <summary>
/// 执行 从指定的行号开始,返回包含指定记录行数的 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <returns>从指定的行号开始,返回包含指定记录行数的 DataTable 对象。</returns>
DataTable ExecuteDataTable( string SqlString, DbParams Params, int StartRowNo, int MaxRowCount );

/// <summary>
/// 执行 返回指定映射表名称 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 DataTable 对象。</returns>
DataTable ExecuteDataTable( string SqlString, string TableName );
/// <summary>
/// 执行 从指定的行号开始,返回包含指定记录行数并指定映射表名称的 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 从指定的行号开始,包含指定记录行数并指定映射表名称的 DataTable 对象。</returns>
DataTable ExecuteDataTable( string SqlString, int StartRowNo, int MaxRowCount, string TableName );
/// <summary>
/// 执行 返回指定映射表名称的 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 指定映射表名称的 DataTable 对象。</returns>
DataTable ExecuteDataTable( string SqlString, DbParams Params, string TableName );
/// <summary>
/// 执行 从指定的行号开始,返回包含指定记录行数并指定映射表名称的 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 从指定的行号开始,包含指定记录行数并指定映射表名称的 DataTable 对象。</returns>
DataTable ExecuteDataTable( string SqlString, DbParams Params, int StartRowNo, int MaxRowCount, string TableName );

/// <summary>
/// 执行 返回单行单字段查询结果的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <returns>返回 单行单字段查询结果。</returns>
object ExecuteScalar( string SqlString );
/// <summary>
/// 执行 返回单行单字段查询结果的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <returns>返回 单行单字段查询结果。</returns>
object ExecuteScalar( string SqlString, DbParams Params );

/// <summary>
/// 更新 DataSet 对象中的数据。
/// </summary>
/// <param name="ADataSet">包含更新数据的 DataSet 对象。</param>
/// <param name="SqlString">对应要更新的表的查询语句。</param>
/// <returns>返回成功更新的记录条数。</returns>
int UpdateDataSet( DataSet ADataSet, string SqlString );
/// <summary>
/// 更新 DataSet 对象中的数据。
/// </summary>
/// <param name="ADataSet">包含更新数据的 DataSet 对象。</param>
/// <param name="SqlString">对应要更新的表的查询语句。</param>
/// <param name="ATableName">指定 DataSet 对象中要更新数据的表。</param>
/// <returns>返回成功更新的记录条数。</returns>
int UpdateDataSet( DataSet ADataSet, string SqlString, string ATableName );

/// <summary>
/// 更新 DataTable 对象中的数据。
/// </summary>
/// <param name="ADataTable">包含更新数据的 DataTable 对象。</param>
/// <param name="SqlString">对应要更新的表的查询语句。</param>
/// <returns>返回成功更新的记录条数。</returns>
int UpdateDataTable( DataTable ADataTable, string SqlString );

/// <summary>
/// 更新 DataRow 数组中的数据。
/// </summary>
/// <param name="ADataTable">包含更新数据的 DataRow 数组。</param>
/// <param name="SqlString">对应要更新的表的查询语句。</param>
/// <returns>返回成功更新的记录条数。</returns>
int UpdateDataRows( DataRow[] ADataTable, string SqlString );

/// <summary>
/// 开始数据库事务。
/// </summary>
void BeginTransaction();
/// <summary>
/// 提交数据库事务。
/// </summary>
void CommitTransaction();
/// <summary>
/// 回滚数据库事务。
/// </summary>
void RollbackTransaction();

/// <summary>
/// 打开数据库连接。
/// </summary>
void Open();
/// <summary>
/// 关闭数据库连接。
/// </summary>
void Close();

/// <summary>
/// 检查 SQL 语句是否有查询结果记录。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <returns>如果查询结果有记录,返回 true,否则返回 false。</returns>
bool IsExists(string SqlString);
/// <summary>
/// 检查 SQL 语句是否有查询结果记录。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <returns>如果查询结果有记录,返回 true,否则返回 false。</returns>
bool IsExists(string SqlString, DbParams Params);
}


/// <summary>
/// 参数组织类,用于组织所需要的参数。
/// </summary>
[Serializable]
public class DbParams: IEnumerable
{
private ArrayList _params = new ArrayList();

/// <summary>
/// 获取参数个数。
/// </summary>
public int Count
{
get
{
return _params.Count;
}
}

/// <summary>
/// 获取 或 设置 指定索引位置的参数对象。
/// </summary>
public IDbDataParameter this[int Index]
{
get
{
if (Index < 0 || Index > _params.Count-1)
throw new Exception("参数索引值超出范围!");
else
return (IDbDataParameter) _params[Index];
}
set
{
if (Index < 0 || Index > _params.Count-1)
throw new Exception("参数索引值超出范围!");
else
_params[Index] = value;
}
}

/// <summary>
/// 获取 或 设置 指定名称的参数对象。
/// </summary>
public IDbDataParameter this[string paramName]
{
get
{
int index = GetParamIndex(paramName);
if (index > -1)
return (IDbDataParameter) this[index];
else
throw new Exception("指定名称的参数不存在!");
}
set
{
int index = GetParamIndex(paramName);
if (index > -1)
this[index] = value;
else
throw new Exception("指定名称的参数不存在!");
}
}

/// <summary>
/// 获取 指定名称的参数对象的索引值。
/// </summary>
/// <param name="paramName"></param>
/// <returns></returns>
public int GetParamIndex(string paramName)
{
for (int index=0; index<_params.Count; index++)
{
if ((_params[index] as IDbDataParameter).ParameterName == paramName)
{
return index;
}
}
return -1;
}

/// <summary>
/// 获取 参数对象数组。
/// </summary>
/// <returns>返回 ArrayList 类型的参数对象数组。</returns>
public ArrayList GetParamsArray()
{
return _params;
}

/// <summary>
/// 增加参数对象。
/// </summary>
/// <param name="dbParam">参数对象。</param>
public void AddParam(IDbDataParameter dbParam)
{
_params.Add(dbParam);
}

/// <summary>
/// 删除指定的参数对象。
/// </summary>
/// <param name="paramName">指定要删除的参数对象。</param>
public void DeleteParam(string paramName)
{
int index = GetParamIndex(paramName);
if (index > -1)
_params.RemoveAt(index);
}

/// <summary>
/// 设置 指定名称的参数对象的参数值。
/// </summary>
/// <param name="paramName">参数名称。</param>
/// <param name="Value">新的参数值。</param>
public void SetParamValue(string paramName, object Value)
{
int index = GetParamIndex(paramName);
if (index > -1)
(_params[index] as IDbDataParameter).Value = Value;
}

/// <summary>
/// 设置 指定名称的参数对象的传递方向。
/// </summary>
/// <param name="paramName">参数名称。</param>
/// <param name="Direction">参数传递方向。</param>
public void SetParamDirection(string paramName, ParameterDirection Direction)
{
int index = GetParamIndex(paramName);
if (index > -1)
(_params[index] as IDbDataParameter).Direction = Direction;
}

/// <summary>
/// 设置 指定名称的参数对象的大小(Size)。
/// </summary>
/// <param name="paramName">参数名称。</param>
/// <param name="Size">参数大小(Size)</param>
public void SetParamSize(string paramName, int Size)
{
int index = GetParamIndex(paramName);
if (index > -1)
(_params[index] as IDbDataParameter).Size = Size;
}

/// <summary>
/// 设置 指定名称的参数对象的类型。
/// </summary>
/// <param name="paramName">参数名称。</param>
/// <param name="dbType">参数类型。</param>
public void SetParamType(string paramName, DbType dbType)
{
int index = GetParamIndex(paramName);
if (index > -1)
(_params[index] as IDbDataParameter).DbType = dbType;
}

/// <summary>
/// 设置 指定名称的参数对象的关联字段。
/// </summary>
/// <param name="paramName">参数名称。</param>
/// <param name="SourceColumn">关联字段名称。</param>
public void SetParamSourceColumn(string paramName, string SourceColumn)
{
int index = GetParamIndex(paramName);
if (index > -1)
(_params[index] as IDbDataParameter).SourceColumn = SourceColumn;
}

/// <summary>
/// 清空参数数组。
/// </summary>
public void Clear()
{
_params.Clear();
}

#region IEnumerable 成员

/// <summary>
/// 实现 IEnumerable 接口。
/// </summary>
/// <returns></returns>
public IEnumerator GetEnumerator()
{
// TODO:  添加 DbParams.GetEnumerator 实现
return _params.GetEnumerator();
}

#endregion
}


/// <summary>
/// 数据服务类,提供有关数据库操作的表态方法,并根据配置信息自动适配不同的数据库类型,同时提供数据库连接对象池,以提高系统性能。
/// </summary>
public class DbService
{
private static Stack DbServicePool = new Stack();
private static string EntityType = System.Configuration.ConfigurationSettings.AppSettings["EntityType"];
private static string ConnString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
//用于多线程同步
//private static object _class_lock = typeof(DbService);
//后台线程,定时断开数据服务对象的数据库连接,防止数据库连接超时异常,同时减少对数据服务器的资源的占用。
private static Thread Back_Thread;

//定义私有构造函数,防止创建本类型的实例。
private DbService()
{
}

/// <summary>
/// 静态构造器,创建一个后台线程,该线程负责将数据库连接时间超过指定的时间的数据服务对象关闭数据库连接。
/// </summary>
static DbService()
{
Back_Thread = new Thread(new ThreadStart(Back_Proc));
Back_Thread.IsBackground = true;
Back_Thread.Priority = ThreadPriority.AboveNormal;
Back_Thread.Start();
}

/// <summary>
/// 后台线程执行的函数。
/// </summary>
private static void Back_Proc()
{
while (true)
{
Thread.Sleep(int.Parse(System.Configuration.ConfigurationSettings.AppSettings["DbTimeOut"]));
lock (DbServicePool)
{
foreach (object dbService in DbServicePool)
{
long tickCount = System.DateTime.Now.Ticks;
if ((tickCount - ((IDbService) dbService).TickCount) >= long.Parse(System.Configuration.ConfigurationSettings.AppSettings["DbTimeOut"]))
((IDbService) dbService).Close();
}
}
}
}

/// <summary>
/// 获取数据库连接对象池中当前可用的数据库连接对象个数。
/// </summary>
public static int DbServiceCount
{
get
{
return DbServicePool.Count;
}
}

/// <summary>
/// 从数据库连接对象池中获取数据库连接对象,如果池中没有可用的对象则创建一个。
/// </summary>
/// <returns>实现了 IDbService 接口的数据库连接对象。</returns>
public static IDbService GetDbService()
{
lock (DbServicePool) //用于进程同步,当多个进程同一时间Pop()池中最后一个对象时,则只有最快的一个线程能Pop(),而阻塞其他线程,然后其他进程新建或Pop()出其他线程放回池中的对象。
{
IDbService ADbService;
try
{
if (DbServicePool.Count == 0)
{
Type theType = Type.GetType(EntityType);
ADbService = (IDbService) Activator.CreateInstance(theType);
}
else
{
ADbService = (IDbService) DbServicePool.Pop();
}
if ((ADbService.State & (ConnectionState.Open)) == 0)
ADbService.Open();
return ADbService;
}
catch (Exception e)
{
throw new Exception("创建数据访问对象出错!\n错误信息:" + e.Message);
}
}
}


/// <summary>
/// 创建 数据服务对象,并指定数据服务对象使用的数据库连接串。
/// </summary>
/// <param name="ConnString">数据库连接串。</param>
/// <returns>返回 创建的数据服务对象。</returns>
public static IDbService GetDbService(string ConnString)
{
try
{
Type theType = Type.GetType(EntityType);
return (IDbService) Activator.CreateInstance(theType, new object[1]{ConnString});
}
catch (Exception e)
{
throw new Exception("创建数据访问对象出错!\n错误信息:" + e.Message);
}
}

/// <summary>
/// 释放数据服务对象引用,并将其放回对象池中以备其他用户引用。 同时,作为 DataReaderWrapper 类的 OnClose 事件委托,
/// 在 DataReaderWrapper 类实例调用 Close() 方法时将引用的数据库连接对象释放并放回池中。
/// </summary>
/// <param name="ADbService">指定要释放的数据服务对象。</param>
public static void ReleaseDbService(IDbService ADbService)
{
if (ADbService != null)
DbServicePool.Push(ADbService);
}


/// <summary>
/// 清除数据服务对象池中的所有对象。当程序需要释放池占用的资源时调用。
/// </summary>
public static void ReleaseDbPool()
{
DbServicePool.Clear();
GC.Collect();
}


/// <summary>
/// 创建参数对象。
/// </summary>
/// <param name="ParamName">参数名称。</param>
/// <param name="ParamType">参数类型。</param>
/// <returns>返加 创建的参数对象。</returns>
public static IDbDataParameter CreateParameter(string ParamName, DbType ParamType)
{
IDbService ADbService = GetDbService();
try
{
return ADbService.CreateParameter(ParamName, ParamType);
}
catch (Exception e)
{
throw new Exception("创建参数出错!\n出错信息:" + e.Message);
}
finally
{
ReleaseDbService(ADbService);
}
}

/// <summary>
/// 创建参数对象。
/// </summary>
/// <param name="ParamName">参数名称。</param>
/// <param name="ParamType">参数类型。</param>
/// <param name="ParamValue">参数值。</param>
/// <returns>返加 创建的参数对象。</returns>
public static IDbDataParameter CreateParameter(string ParamName, DbType ParamType, object ParamValue)
{
IDbService ADbService = GetDbService();
try
{
return ADbService.CreateParameter(ParamName, ParamType, ParamValue);
}
catch (Exception e)
{
throw new Exception("创建参数出错!\n出错信息:" + e.Message);
}
finally
{
ReleaseDbService(ADbService);
}
}

/// <summary>
/// 创建参数对象。
/// </summary>
/// <param name="ParamName">参数名称。</param>
/// <param name="ParamType">参数类型。</param>
/// <param name="ParamValue">参数值。</param>
/// <param name="ParamDirection">参数的传递方向(Input; Output; InputOutput; ReturnValue)</param>
/// <returns>返加 创建的参数对象。</returns>
public static IDbDataParameter CreateParameter(string ParamName, DbType ParamType, object ParamValue, ParameterDirection ParamDirection)
{
IDbService ADbService = GetDbService();
try
{
return ADbService.CreateParameter(ParamName, ParamType, ParamValue, ParamDirection);
}
catch (Exception e)
{
throw new Exception("创建参数出错!\n出错信息:" + e.Message);
}
finally
{
ReleaseDbService(ADbService);
}
}


/// <summary>
/// 创建 DbParams 对象,根据传入的参数名称数组、参数类型数组返回一个包含 0 个或多个参数对象(IDbDataParameter)的 DbParams 对象。
/// DbParams 对象用于设置执行 SQL 语句所需要的参数。
/// </summary>
/// <param name="ParamNames">字符串类型的数组,表示多个参数名称,例如:new string[]{"@Param1", "@Param2",..."@ParamN"}</param>
/// <param name="ParamTypes">DbType 类型的数组,指定对应前面的各个参数的类型。</param>
/// <returns>返回 一个包含 0 个或多个参数对象(IDbDataParameter)的 DbParams 对象。</returns>
public static DbParams CreateDbParams(string[] ParamNames, DbType[] ParamTypes)
{
IDbService ADbService = GetDbService();
try
{
return ADbService.CreateDbParams(ParamNames, ParamTypes);
}
catch (Exception e)
{
throw new Exception("创建参数出错!\n出错信息:" + e.Message);
}
finally
{
ReleaseDbService(ADbService);
}
}

/// <summary>
/// 创建 DbParams 对象,根据传入的参数名称数组、参数类型数组、参数值数组返回一个包含 0 个或多个参数对象(IDbDataParameter)的 DbParams 对象。
/// DbParams 对象用于设置执行 SQL 语句所需要的参数。
/// </summary>
/// <param name="ParamNames">字符串类型的数组,表示多个参数名称,例如:new string[]{"@Param1", "@Param2",..."@ParamN"}</param>
/// <param name="ParamTypes">DbType 类型的数组,指定对应前面的各个参数的类型。</param>
/// <param name="ParamValues">object 类型的数组,指定对应前面的各个参数的值。</param>
/// <returns>返回 一个包含 0 个或多个参数对象(IDbDataParameter)的 DbParams 对象。</returns>
public static DbParams CreateDbParams(string[] ParamNames, System.Data.DbType[] ParamTypes, object[] ParamValues)
{
IDbService ADbService = GetDbService();
try
{
return ADbService.CreateDbParams(ParamNames, ParamTypes, ParamValues);
}
catch (Exception e)
{
throw new Exception("创建参数出错!\n出错信息:" + e.Message);
}
finally
{
ReleaseDbService(ADbService);
}
}

/// <summary>
/// 创建 DbParams 对象,根据传入的参数名称数组、参数类型数组、参数值数组、参数传递方向数组返回一个包含 0 个或多个参数对象(IDbDataParameter)的 DbParams 对象。
/// DbParams 对象用于设置执行 SQL 语句所需要的参数。
/// </summary>
/// <param name="ParamNames">字符串类型的数组,表示多个参数名称,例如:new string[]{"@Param1", "@Param2",..."@ParamN"}</param>
/// <param name="ParamTypes">DbType 类型的数组,指定对应前面的各个参数的类型。</param>
/// <param name="ParamValues">object 类型的数组,指定对应前面的各个参数的值。</param>
/// <param name="ParamDirections">ParameterDirection 类型的数组,指定对应前面各个参数的传递方向。</param>
/// <returns>返回 一个包含 0 个或多个参数对象(IDbDataParameter)的 DbParams 对象。</returns>
public static DbParams CreateDbParams( string[] ParamNames, DbType[] ParamTypes, object[] ParamValues, ParameterDirection[] ParamDirections )
{
IDbService ADbService = GetDbService();
try
{
return ADbService.CreateDbParams(ParamNames, ParamTypes, ParamValues, ParamDirections);
}
catch (Exception e)
{
throw new Exception("创建参数出错!\n出错信息:" + e.Message);
}
finally
{
ReleaseDbService(ADbService);
}
}


/// <summary>
/// 创建 DbParams 对象,根据传入的参数名称、参数类型返回一个包含 1 个参数对象(IDbDataParameter)的 DbParams 对象。
/// DbParams 对象用于设置执行 SQL 语句所需要的参数。
/// </summary>
/// <param name="ParamName">参数名称。</param>
/// <param name="ParamType">参数类型。</param>
/// <returns>返回 一个包含 1 个参数对象(IDbDataParameter)的 DbParams 对象。</returns>
public static DbParams CreateDbParams(string ParamName, DbType ParamType)
{
IDbService ADbService = GetDbService();
try
{
return ADbService.CreateDbParams(ParamName, ParamType);
}
catch (Exception e)
{
throw new Exception("创建参数出错!\n出错信息:" + e.Message);
}
finally
{
ReleaseDbService(ADbService);
}
}

/// <summary>
/// 创建 DbParams 对象,根据传入的参数名称、参数类型返回一个包含 1 个参数对象(IDbDataParameter)的 DbParams 对象。
/// DbParams 对象用于设置执行 SQL 语句所需要的参数。
/// </summary>
/// <param name="ParamName">参数名称。</param>
/// <param name="ParamType">参数类型。</param>
/// <param name="ParamValue">参数值。</param>
/// <returns>返回 一个包含 1 个参数对象(IDbDataParameter)的 DbParams 对象。</returns>
public static DbParams CreateDbParams(string ParamName, DbType ParamType, object ParamValue)
{
IDbService ADbService = GetDbService();
try
{
return ADbService.CreateDbParams(ParamName, ParamType, ParamValue);
}
catch (Exception e)
{
throw new Exception("创建参数出错!\n出错信息:" + e.Message);
}
finally
{
ReleaseDbService(ADbService);
}
}

/// <summary>
/// 创建 DbParams 对象,根据传入的参数名称、参数类型返回一个包含 1 个参数对象(IDbDataParameter)的 DbParams 对象。
/// DbParams 对象用于设置执行 SQL 语句所需要的参数。
/// </summary>
/// <param name="ParamName">参数名称。</param>
/// <param name="ParamType">参数类型。</param>
/// <param name="ParamValue">参数值。</param>
/// <param name="ParamDirection">参数传递方向。</param>
/// <returns>返回 一个包含 1 个参数对象(IDbDataParameter)的 DbParams 对象。</returns>
public static DbParams CreateDbParams(string ParamName, DbType ParamType, object ParamValue, ParameterDirection ParamDirection)
{
IDbService ADbService = GetDbService();
try
{
return ADbService.CreateDbParams(ParamName, ParamType, ParamValue, ParamDirection);
}
catch (Exception e)
{
throw new Exception("创建参数出错!\n出错信息:" + e.Message);
}
finally
{
ReleaseDbService(ADbService);
}
}


#region 数据服务静态方法集,对应 IDbService 接口,可直接提供数据操作服务。

/// <summary>
/// 执行 无返回结果的存储过程,或执行结果通过传出(Output、InputOutput)类型的参数获取。
/// </summary>
/// <param name="ProcedureName">存储过程名称。</param>
/// <param name="Params">存储过程参数对象:DbParams。</param>
public static void ExecuteProcedure( string ProcedureName, DbParams Params )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
ADbService.ExecuteProcedure(ProcedureName, Params);
}
finally
{
ReleaseDbService(ADbService);
}
}
}

/// <summary>
/// 执行 返回包含查询结果的 IDataReaderWrapper 对象的存储过程。
/// </summary>
/// <param name="ProcedureName">存储过程名称。</param>
/// <param name="Params">存储过程参数对象:DbParams。</param>
/// <returns>返回 包含查询结果的 IDataReaderWrapper 对象。</returns>
public static IDataReaderWrapper ExecuteProcedureReader( string ProcedureName, DbParams Params )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
IDataReaderWrapper reader = ADbService.ExecuteProcedureReader(ProcedureName, Params);
reader.OnClose += new ReaderCloseHandler(ReleaseDbService);
return reader;
}
else
return null;
}

/// <summary>
/// 执行 返回包含查询结果的 DataSet 对象的存储过程。
/// </summary>
/// <param name="ProcedureName">存储过程名称。</param>
/// <param name="Params">存储过程参数对象:DbParams。</param>
/// <returns>返回 包含查询结果的 DataSet 对象。</returns>
public static DataSet ExecuteProcedureDataSet( string ProcedureName, DbParams Params )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
return ADbService.ExecuteProcedureDataSet(ProcedureName, Params);
}
finally
{
ReleaseDbService(ADbService);
}
}
else
return null;
}

/// <summary>
/// 执行 返回包含查询结果的 DataTable 对象的存储过程。
/// </summary>
/// <param name="ProcedureName">存储过程名称。</param>
/// <param name="Params">存储过程参数对象:DbParams。</param>
/// <returns>返回 包含查询结果的 DataTable 对象。</returns>
public static DataTable ExecuteProcedureTable( string ProcedureName, DbParams Params )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
return ADbService.ExecuteProcedureTable(ProcedureName, Params);
}
finally
{
ReleaseDbService(ADbService);
}
}
else
return null;
}

/// <summary>
/// 执行 返回仅包含传出(Output、InputOutput)类型的参数对象(DbParams)的存储过程。
/// </summary>
/// <param name="ProcedureName">存储过程名称。</param>
/// <param name="Params">存储过程参数对象:DbParams,需要指定传出的参数。</param>
/// <returns>返回 仅包含传出(Output、InputOutput)类型的参数对象(DbParams)的存储过程。</returns>
public static DbParams ExecuteProcedureResults( string ProcedureName, DbParams Params )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
return ADbService.ExecuteProcedureResults(ProcedureName, Params);
}
finally
{
ReleaseDbService(ADbService);
}
}
else
return null;
}


/// <summary>
/// 执行 无参数和返回值的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
public static void ExecuteNone( string SqlString )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
ADbService.ExecuteNone(SqlString);
}
finally
{
ReleaseDbService(ADbService);
}
}
}

/// <summary>
/// 执行 无参数的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
public static void ExecuteNone( string SqlString, DbParams Params )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
ADbService.ExecuteNone(SqlString, Params);
}
finally
{
ReleaseDbService(ADbService);
}
}
}


/// <summary>
/// 执行 返回 IDataReaderWrapper 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <returns>返回 IDataReaderWrapper 对象。</returns>
public static IDataReaderWrapper ExecuteReader( string SqlString )
{
return ExecuteReader(SqlString, new DbParams());
}

/// <summary>
/// 执行 返回 IDataReaderWrapper 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <returns>返回 IDataReaderWrapper 对象。</returns>
public static IDataReaderWrapper ExecuteReader( string SqlString, DbParams Params )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
IDataReaderWrapper reader = ADbService.ExecuteReader(SqlString, Params);
reader.OnClose += new ReaderCloseHandler(ReleaseDbService);
return reader;
}
else
return null;
}


/// <summary>
/// 执行 返回 DataSet 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <returns>返回 DataSet 对象。</returns>
public static DataSet ExecuteDataSet( string SqlString )
{
return ExecuteDataSet(SqlString, new DbParams());
}

/// <summary>
/// 执行 从指定的行号开始,返回包含指定记录行数的 DataSet 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <returns>从指定的行号开始,返回包含指定记录行数的 DataSet 对象。</returns>
public static DataSet ExecuteDataSet( string SqlString, int StartRowNo, int MaxRowCount )
{
return ExecuteDataSet(SqlString, new DbParams(), StartRowNo, MaxRowCount);
}

/// <summary>
/// 执行 返回 DataSet 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <returns>返回 DataSet 对象。</returns>
public static DataSet ExecuteDataSet( string SqlString, DbParams Params )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
return ADbService.ExecuteDataSet(SqlString, Params);
}
finally
{
ReleaseDbService(ADbService);
}
}
else
return null;
}

/// <summary>
/// 执行 从指定的行号开始,返回包含指定记录行数的 DataSet 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <returns>从指定的行号开始,返回包含指定记录行数的 DataSet 对象。</returns>
public static DataSet ExecuteDataSet( string SqlString, DbParams Params, int StartRowNo, int MaxRowCount )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
return ADbService.ExecuteDataSet(SqlString, Params, StartRowNo, MaxRowCount);
}
finally
{
ReleaseDbService(ADbService);
}
}
else
return null;
}


/// <summary>
/// 执行 返回指定结果数据集表名称的 DataSet 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 指定结果数据集表名称的 DataSet 对象。</returns>
public static DataSet ExecuteDataSet( string SqlString, string TableName )
{
return ExecuteDataSet(SqlString, new DbParams(), TableName);
}

/// <summary>
/// 执行 从指定的行号开始,返回包含指定记录行数的 DataSet 对象的 SQL 语句,并指定映射表名称。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 指定结果数据集表名称的 DataSet 对象。</returns>
public static DataSet ExecuteDataSet( string SqlString, int StartRowNo, int MaxRowCount, string TableName )
{
return ExecuteDataSet(SqlString, new DbParams(), StartRowNo, MaxRowCount, TableName);
}

/// <summary>
/// 执行 返回 DataSet 对象的 SQL 语句,并指定映射表名称。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 指定结果数据集表名称的 DataSet 对象。</returns>
public static DataSet ExecuteDataSet( string SqlString, DbParams Params, string TableName )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
return ADbService.ExecuteDataSet(SqlString, Params, TableName);
}
finally
{
ReleaseDbService(ADbService);
}
}
else
return null;
}

/// <summary>
/// 执行 返回 DataSet 对象的 SQL 语句,并指定映射表名称。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 指定结果数据集表名称的 DataSet 对象。</returns>
public static DataSet ExecuteDataSet( string SqlString, DbParams Params, int StartRowNo, int MaxRowCount, string TableName )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
return ADbService.ExecuteDataSet(SqlString, Params, StartRowNo, MaxRowCount, TableName);
}
finally
{
ReleaseDbService(ADbService);
}
}
else 
return null;
}


/// <summary>
/// 执行 返回 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <returns>返回 DataTable 对象。</returns>
public static DataTable ExecuteDataTable( string SqlString )
{
return ExecuteDataTable(SqlString, new DbParams());
}

/// <summary>
/// 执行 从指定的行号开始,返回包含指定记录行数的 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <returns>从指定的行号开始,返回包含指定记录行数的 DataTable 对象。</returns>
public static DataTable ExecuteDataTable( string SqlString, int StartRowNo, int MaxRowCount )
{
return ExecuteDataTable(SqlString, new DbParams(), StartRowNo, MaxRowCount);
}

/// <summary>
/// 执行 返回 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <returns>返回 DataTable 对象。</returns>
public static DataTable ExecuteDataTable( string SqlString, DbParams Params )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
return ADbService.ExecuteDataTable(SqlString, Params);
}
finally
{
ReleaseDbService(ADbService);
}
}
else 
return null;
}

/// <summary>
/// 执行 从指定的行号开始,返回包含指定记录行数的 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <returns>从指定的行号开始,返回包含指定记录行数的 DataTable 对象。</returns>
public static DataTable ExecuteDataTable( string SqlString, DbParams Params, int StartRowNo, int MaxRowCount )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
return ADbService.ExecuteDataTable(SqlString, Params, StartRowNo, MaxRowCount);
}
finally
{
ReleaseDbService(ADbService);
}
}
else
return null;
}


/// <summary>
/// 执行 返回指定映射表名称 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 DataTable 对象。</returns>
public static DataTable ExecuteDataTable( string SqlString, string TableName )
{
return ExecuteDataTable(SqlString, new DbParams(), TableName);
}

/// <summary>
/// 执行 从指定的行号开始,返回包含指定记录行数并指定映射表名称的 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 从指定的行号开始,包含指定记录行数并指定映射表名称的 DataTable 对象。</returns>
public static DataTable ExecuteDataTable( string SqlString, int StartRowNo, int MaxRowCount, string TableName )
{
return ExecuteDataTable(SqlString, new DbParams(), StartRowNo, MaxRowCount, TableName);
}

/// <summary>
/// 执行 返回指定映射表名称的 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 指定映射表名称的 DataTable 对象。</returns>
public static DataTable ExecuteDataTable( string SqlString, DbParams Params, string TableName )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
return ADbService.ExecuteDataTable(SqlString, Params, TableName);
}
finally
{
ReleaseDbService(ADbService);
}
}
else 
return null;
}

/// <summary>
/// 执行 从指定的行号开始,返回包含指定记录行数并指定映射表名称的 DataTable 对象的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <param name="StartRowNo">开始行号。</param>
/// <param name="MaxRowCount">记录行数。</param>
/// <param name="TableName">映射表名称。</param>
/// <returns>返回 从指定的行号开始,包含指定记录行数并指定映射表名称的 DataTable 对象。</returns>
public static DataTable ExecuteDataTable( string SqlString, DbParams Params, int StartRowNo, int MaxRowCount, string TableName )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
return ADbService.ExecuteDataTable(SqlString, Params, StartRowNo, MaxRowCount, TableName);
}
finally
{
ReleaseDbService(ADbService);
}
}
else
return null;
}


/// <summary>
/// 执行 返回单行单字段查询结果的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <returns>返回 单行单字段查询结果。</returns>
public static object ExecuteScalar( string SqlString )
{
return ExecuteScalar(SqlString, new DbParams());
}

/// <summary>
/// 执行 返回单行单字段查询结果的 SQL 语句。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <returns>返回 单行单字段查询结果。</returns>
public static object ExecuteScalar( string SqlString, DbParams Params )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
return ADbService.ExecuteScalar(SqlString, Params);
}
finally
{
ReleaseDbService(ADbService);
}
}
else
return null;
}


/// <summary>
/// 更新 DataSet 对象中的数据。
/// </summary>
/// <param name="ADataSet">包含更新数据的 DataSet 对象。</param>
/// <param name="SqlString">对应要更新的表的查询语句。</param>
/// <returns>返回成功更新的记录条数。</returns>
public static int UpdateDataSet( DataSet ADataSet, string SqlString )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
ADbService.BeginTransaction();
int UpdateRows = ADbService.UpdateDataSet(ADataSet, SqlString);
ADbService.CommitTransaction();
return UpdateRows;
}
finally
{
ReleaseDbService(ADbService);
}
}
else
return -1;
}

/// <summary>
/// 更新 DataSet 对象中的数据。
/// </summary>
/// <param name="ADataSet">包含更新数据的 DataSet 对象。</param>
/// <param name="SqlString">对应要更新的表的查询语句。</param>
/// <param name="ATableName">指定 DataSet 对象中要更新数据的表。</param>
/// <returns>返回成功更新的记录条数。</returns>
public static int UpdateDataSet( DataSet ADataSet, string SqlString, string ATableName )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
ADbService.BeginTransaction();
int UpdateRows = ADbService.UpdateDataSet(ADataSet, SqlString, ATableName);
ADbService.CommitTransaction();
return UpdateRows;
}
finally
{
ReleaseDbService(ADbService);
}
}
else
return -1;
}



/// <summary>
/// 更新 DataTable 对象中的数据。
/// </summary>
/// <param name="ADataTable">包含更新数据的 DataTable 对象。</param>
/// <param name="SqlString">对应要更新的表的查询语句。</param>
/// <returns>返回成功更新的记录条数。</returns>
public static int UpdateDataTable( DataTable ADataTable, string SqlString )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
ADbService.BeginTransaction();
int UpdateRows = ADbService.UpdateDataTable(ADataTable, SqlString);
ADbService.CommitTransaction();
return UpdateRows;
}
finally
{
ReleaseDbService(ADbService);
}
}
else 
return -1;
}


/// <summary>
/// 更新 DataRow 数组中的数据。
/// </summary>
/// <param name="DataRows">包含更新数据的 DataRow 数组。</param>
/// <param name="SqlString">对应要更新的表的查询语句。</param>
/// <returns>返回成功更新的记录条数。</returns>
public static int UpdateDataRows( DataRow[] DataRows, string SqlString )
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
ADbService.BeginTransaction();
int UpdateRows = ADbService.UpdateDataRows(DataRows, SqlString);
ADbService.CommitTransaction();
return UpdateRows;
}
finally
{
ReleaseDbService(ADbService);
}
}
else
return -1;
}


/// <summary>
/// 检查 SQL 语句是否有查询结果记录。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <returns>如果查询结果有记录,返回 true,否则返回 false。</returns>
public static bool IsExists(string SqlString)
{
return IsExists(SqlString, new DbParams());
}

/// <summary>
/// 检查 SQL 语句是否有查询结果记录。
/// </summary>
/// <param name="SqlString">SQL 语句。</param>
/// <param name="Params">DbParams 参数对象。</param>
/// <returns>如果查询结果有记录,返回 true,否则返回 false。</returns>
public static bool IsExists(string SqlString, DbParams Params)
{
IDbService ADbService = GetDbService();
if (ADbService != null)
{
try
{
return ADbService.IsExists(SqlString, Params);
}
finally
{
ReleaseDbService(ADbService);
}
}
else
throw new Exception("返回的数据访问对象为 null !");
}


#endregion

}



/// <summary>
/// 定义 DataReader 对象的封装接口,添加 OnClose 事件,以便在 DataReader 对象执行 Close() 方法时回调用用户自定义的代码。
/// </summary>
public interface IDataReaderWrapper: IDataReader, IEnumerable
{
/// <summary>
/// 调用 Close() 时的事件委托。
/// </summary>
event ReaderCloseHandler OnClose;
/// <summary>
/// 指示对象是否包含结果数据。
/// </summary>
bool HasRows{get;}
}


/// <summary>
/// 定义 IDataReaderWrapper 中 OnClose 事件的委托原型。
/// </summary>
public delegate void ReaderCloseHandler(IDbService ADbService);

/// <summary>
/// DataReader对象的封装类,实现了IDataReaderWrapper接口。因为DataReader对象与Connection对象关联,所以未Close()之前不能被其他调用者使用。
/// 因此,提供此封装类以委托事件的形式在Close()时才将数据访问对象放回对象池中。
/// </summary>
class DataReaderWrapper: MarshalByRefObject, IDataReaderWrapper
{
//适配对象引用
private object FDataReader = null;
//保存从池中取得或新创建的 IDbService 实例对象。
private IDbService FDbService = null;

private bool FHasRows = false;

public event ReaderCloseHandler OnClose;

//传入已获得的 DataReader 对象,用作适配对象。
public DataReaderWrapper(object ADataReader, IDbService ADbService, bool AHasRows)
{
FDataReader = ADataReader;
FDbService = ADbService;
FHasRows = AHasRows;
}

/// <summary>
/// 布尔型属性值,指示 DataReaderWrapper 对象是否包含查询结果。
/// </summary>
public bool HasRows
{
get
{
return FHasRows;
}
}

#region 此处为 IDataReaderWrapper 定义的接口实现
//空实现,隐藏对 IDataReaderWrapper 中该方法的调用,必须使用 SafeClose()
public void Close()
{
((IDataReader) FDataReader).Close();
if (OnClose != null)
OnClose(FDbService);
}

public DataTable GetSchemaTable()
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetSchemaTable();
}
else
return null;
}

public bool NextResult()
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).NextResult();
}
else
return false;
}

public bool Read()
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).Read();
}
else
return false;
}

public int Depth
{
get
{
if (FDataReader != null)
return ((IDataReader) FDataReader).Depth;
else
return 0;
}
}

public bool IsClosed
{
get
{
if (FDataReader != null)
return ((IDataReader) FDataReader).IsClosed;
else
return false;
}
}

public int RecordsAffected
{
get
{
if (FDataReader != null)
return ((IDataReader) FDataReader).RecordsAffected;
else
return 0;
}
}
#endregion

#region 此处为 IDataReader 父接口 IDataRecord 的实现

public bool GetBoolean(int i)
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetBoolean(i);
}
else
return false;
}

public System.Byte GetByte ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetByte(i);
}
else
return 0;
}

public System.Int64 GetBytes ( System.Int32 i , System.Int64 fieldOffset , byte[] buffer , System.Int32 bufferoffset , System.Int32 length )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetBytes(i, fieldOffset, buffer, bufferoffset, length);
}
else
return 0;
}

public System.Char GetChar ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetChar(i);
}
else
return System.Char.MinValue;
}

public System.Int64 GetChars ( System.Int32 i , System.Int64 fieldoffset , char[] buffer , System.Int32 bufferoffset , System.Int32 length )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetChars(i, fieldoffset, buffer, bufferoffset, length);
}
else
return 0;
}

public System.Data.IDataReader GetData ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetData(i);
}
else
return null;
}

public System.String GetDataTypeName ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetDataTypeName(i);
}
else
return null;
}

public System.DateTime GetDateTime ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetDateTime(i);
}
else
return System.DateTime.MinValue;
}

public System.Decimal GetDecimal ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetDecimal(i);
}
else
return 0;
}

public System.Double GetDouble ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetDouble(i);
}
else
return 0;
}

public System.Type GetFieldType ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetFieldType(i);
}
else
return null;
}

public System.Single GetFloat ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetFloat(i);
}
else
return 0;
}

public System.Guid GetGuid ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetGuid(i);
}
else
return System.Guid.Empty;
}

public System.Int16 GetInt16 ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetInt16(i);
}
else
return 0;
}

public System.Int32 GetInt32 ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetInt32(i);
}
else
return 0;
}

public System.Int64 GetInt64 ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetInt64(i);
}
else
return 0;
}

public System.String GetName ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetName(i);
}
else
return null;
}

public System.Int32 GetOrdinal ( System.String name )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetOrdinal(name);
}
else
return 0;
}

public System.String GetString ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetString(i);
}
else
return null;
}

public System.Object GetValue ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetBoolean(i);
}
else
return null;
}

public System.Int32 GetValues ( object[] values )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).GetValues(values);
}
else
return 0;
}

public System.Boolean IsDBNull ( System.Int32 i )
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).IsDBNull(i);
}
else
return false;
}

public int FieldCount
{
get
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader).FieldCount;
}
else
return 0;
}
}

public object this [string name]
{
get
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader)[name];
}
else
return null;
}
}

public object this [int i]
{
get
{
if (FDataReader != null)
{
return ((IDataReader) FDataReader);
}
else
return null;
}
}

#endregion

#region 此处为 IDataReaderWrapper 父接口 IDisposable 的实现

public void Dispose()
{
if (FDataReader != null)
{
((IDataReader) FDataReader).Dispose();
}
}
#endregion

#region IEnumerable 成员

public IEnumerator GetEnumerator()
{
// TODO:  添加 DataReaderWrapper.GetEnumerator 实现
return ((IEnumerable) FDataReader).GetEnumerator();
}

#endregion
}

}
查看该用户更多文章>>