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 } }