using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
using System.Collections;
using System.Web;
using CY.WebService.Logging;
namespace CY.WebService
{
///
/// 数据库交换类
///
public class Database : IDisposable
{
#region 变量
private SqlConnection _Connection;
private SqlTransaction _Tran;
#endregion
#region 属性
///
/// 数据库连接驱动器
///
public SqlConnection Connection
{
get
{
if (ConnectionState.Open != _Connection.State)
_Connection.Open();
return _Connection;
}
set
{
_Connection = value;
}
}
///
/// 数据库事物
///
public SqlTransaction SqlTransaction
{
get
{
return this._Tran;
}
set
{
this._Tran = value;
}
}
///
/// 查询超时时间(毫秒,0为无限)
///
public static int QueryTimeOut
{
get
{
return int.Parse(ConfigurationManager.AppSettings["QueryTimeOut"].ToString());
}
}
#endregion
#region 方法
///
/// 创建一个新的默认数据库连接(不包含事务)
///
public Database()
{
this.Connection = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConnection"].ToString());
this.Open(false);
}
///
/// 创建一个新的默认数据库连接
///
/// 是否包含事务
public Database(bool isBeginTran)
{
this.Connection = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConnection"].ToString());
this.Open(isBeginTran);
}
///
/// 使用特定连接字符串
///
/// 连接字符串
public Database(string ConnectionString)
{
this.Connection = new SqlConnection(ConnectionString);
this.Open(false);
}
///
/// 数据库开连接
///
/// 是否开启事务
private void Open(bool isBeginTran)
{
if (this.Connection.State != System.Data.ConnectionState.Open)
{
this.Connection.Open();
}
if (isBeginTran)
{
this._Tran = this.Connection.BeginTransaction();
}
}
///
/// 数据库关连接
///
private void Close()
{
if (this._Tran != null)
{
this._Tran.Commit();
}
if (this.Connection.State != System.Data.ConnectionState.Closed)
{
this.Connection.Close();
}
}
///
/// 无返回查询分析
///
/// Transaction-SQL语句
/// 语句类型
/// SQL参数
public void Query(string cmdText, CommandType cmdType, params SqlParameter[] param)
{
SqlCommand command = new SqlCommand(cmdText, this.Connection);
command.CommandType = cmdType;
if (this._Tran != null)
{
command.Transaction = this._Tran;
}
command.CommandTimeout = Database.QueryTimeOut;
command.Parameters.Clear();
if (param != null)
{
//command.Parameters.AddRange(param);
foreach (SqlParameter p in param)
{
command.Parameters.Add(p);
}
}
try
{
command.ExecuteNonQuery();
}
catch (Exception ex)
{
SqlException sqlEx = ex as SqlException;
if (null != sqlEx)
{
new Log4NetAdapter().Log("SQL Linker Number" + sqlEx.LineNumber.ToString() + ":" + sqlEx.ToString() + "\r\n" + command.ToString());
}
throw ex;
}
finally
{
Close();
}
}
///
/// 返回DataTable
///
/// Transaction-SQL语句
/// 语句类型
/// SQL参数
/// DataTable数据集
public DataTable QueryDataTable(string cmdText, CommandType cmdType, params SqlParameter[] param)
{
SqlCommand command = new SqlCommand(cmdText, this.Connection);
command.CommandType = cmdType;
if (this._Tran != null)
{
command.Transaction = this._Tran;
}
command.CommandTimeout = Database.QueryTimeOut;
command.Parameters.Clear();
if (param != null)
{
foreach (SqlParameter sp in param)
{
command.Parameters.Add(sp);
}
}
SqlDataAdapter sda = new SqlDataAdapter(command);
DataTable dt = new DataTable();
try
{
sda.Fill(dt);
}
catch (Exception ex)
{
SqlException sqlEx = ex as SqlException;
if (null != sqlEx)
{
new Log4NetAdapter().Log("SQL Linker Number" + sqlEx.LineNumber.ToString() + ":" + sqlEx.ToString() + "\r\n" + command.ToString());
}
}
finally
{
Close();
}
return dt;
}
///
/// 返回DataSet
///
/// Transaction-SQL语句
/// 语句类型
/// SQL参数
/// DataSet数据集
public DataSet QueryDataSet(string cmdText, CommandType cmdType, params SqlParameter[] param)
{
SqlCommand command = new SqlCommand(cmdText, this.Connection);
command.CommandType = cmdType;
if (this._Tran != null)
{
command.Transaction = this._Tran;
}
command.CommandTimeout = Database.QueryTimeOut;
if (command.Parameters != null && command.Parameters.Count > 0)
command.Parameters.Clear();
if (param != null)
{
foreach (SqlParameter sp in param)
{
command.Parameters.Add(sp);
}
}
SqlDataAdapter sda = new SqlDataAdapter(command);
DataSet ds = new DataSet();
try
{
sda.Fill(ds);
}
catch (Exception ex)
{
SqlException sqlEx = ex as SqlException;
if (null != sqlEx)
{
new Log4NetAdapter().Log("SQL Linker Number" + sqlEx.LineNumber.ToString() + ":" + sqlEx.ToString() + "\r\n" + command.ToString());
}
}
finally
{
Close();
}
return ds;
}
///
/// 返回DataTable
///
/// Transaction-SQL语句
/// 语句类型
/// SQL参数
/// DataTable数据集
public IDataReader QueryDataReader(string cmdText, CommandType cmdType, params SqlParameter[] param)
{
SqlCommand command = new SqlCommand(cmdText, this.Connection);
command.CommandType = cmdType;
if (this._Tran != null)
{
command.Transaction = this._Tran;
}
command.CommandTimeout = Database.QueryTimeOut;
command.Parameters.Clear();
if (param != null)
{
command.Parameters.AddRange(param);
}
return command.ExecuteReader(CommandBehavior.CloseConnection);//释放Reader时关闭连接
}
///
/// 执行SQL语句,返回影响的记录数
///
/// SQL语句
/// 影响的记录数
public int ExecuteSql(string SQLString, params SqlParameter[] param)
{
using (SqlCommand cmd = new SqlCommand(SQLString, this.Connection))
{
try
{
if (this._Tran != null)
{
cmd.Transaction = this._Tran;
}
if (param != null)
{
cmd.Parameters.AddRange(param);
}
cmd.CommandTimeout = Database.QueryTimeOut;
int rows = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return rows;
}
catch (System.Data.SqlClient.SqlException e)
{
throw e;
}
finally
{
Close();
}
}
}
#region 泛型扩展方法
///
/// 暂用查询
///
/// 要查询的目标(Select后From前部分)
/// 数据源(Form后的部分)
/// 筛选条件
/// DataTable(传入参数有误时返回空)
public DataTable SelectModel(string selectTarget, string fromSouce, string condition = "")
{
SqlParameter[] parameters = GetModelGeterParams(selectTarget, fromSouce, condition);
if (null == parameters)
return null;
return QueryDataTable("sp_SelectModel", CommandType.StoredProcedure, parameters);
}
///
/// 获取实体查询参数
///
/// 要查询的目标(Select后From前部分)
/// 数据源(Form后的部分)
/// 排序字段
///
private SqlParameter[] GetModelGeterParams(string selectTarget, string fromSouce, string condition)
{
return string.IsNullOrEmpty(selectTarget) || string.IsNullOrEmpty(fromSouce) ? null :
new SqlParameter[] {
new SqlParameter(){ParameterName="@Columns", SqlDbType=SqlDbType.VarChar,Value=selectTarget},
new SqlParameter(){ParameterName="@TableName", SqlDbType=SqlDbType.VarChar,Value=fromSouce},
new SqlParameter(){ParameterName="@Condition", SqlDbType=SqlDbType.VarChar,Value=condition}
};
}
#endregion
#endregion
#region IDisposable接口方法
public void Dispose()
{
try
{
this.Close();
}
catch (Exception ex)
{
if (this._Tran != null)
{
this._Tran.Rollback();
}
throw ex;
}
}
#endregion
}
}