using System; using System.Collections.Generic; using System.Text; using System.Data.SqlClient; using System.Data; using System.Data.Common; using System.Xml; using System.Configuration; using Ant.Common; namespace Ant.Data { public sealed class MSSqlDataAccess : BaseDataAccess { private SqlConnection DbConnection; private SqlTransaction trans; private DataAccess da; /// /// 构造函数 /// /// 数据库连接字符串 public MSSqlDataAccess(string connString) { this.DbConnection = new SqlConnection(connString); } #region 数据库连接 /// /// 数据库连接 /// public override string ConnectionString { get { if (this.DbConnection.IsNull()) return ""; else return this.DbConnection.ConnectionString; } set { this.DbConnection.ConnectionString = value; } } public override DatabaseType DatabaseType { get { return DatabaseType.MSSQLServer; } } /// /// 获取事务 /// public override DbTransaction Trans { get { if (this.trans != null) return trans; else return null; } } /// /// 数据库连接是否不可用 /// public override bool IsUnEnable { get { if (this.DbConnection == null) { return true; } else { if (this.DbConnection.ConnectionString.IsEmpty()) { return true; } else { return false; } } } } /// /// 数据库是否关闭 /// public override bool IsClosed { get { if (this.DbConnection.IsNull()) { return true; } if (this.DbConnection.State == ConnectionState.Closed) { return true; } else { return false; } } } /// /// 打开数据库 /// public override void Open() { if (string.IsNullOrEmpty(DbConnection.ConnectionString)) { da = DataAccessFactory.GetWriteDataDefault; this.DbConnection = new SqlConnection(da.ConnectionString); } if (this.DbConnection.State != ConnectionState.Open) { this.DbConnection.Open(); } } /// /// 关闭数据库 /// public override void Close() { if (this.DbConnection != null && this.DbConnection.State != ConnectionState.Closed && trans == null) { this.DbConnection.Close(); //this.DbConnection.Dispose(); //this.DbConnection = null; } } /// /// 释放资源 /// public override void Dispose() { if (this.DbConnection != null) { this.DbConnection.Dispose(); this.DbConnection = null; } if (this.trans != null) { this.trans.Dispose(); this.trans = null; } } /// /// 开户数据库事务 /// public override void BeginTransaction() { this.Open(); if (trans == null) trans = this.DbConnection.BeginTransaction(IsolationLevel.ReadCommitted); } /// /// 提交数据库事务 /// public override void Commit() { try { if (null != this.trans) { this.trans.Commit(); this.trans.Dispose(); this.trans = null; } } finally { this.Close(); } } /// /// 回滚数据库事务 /// public override void RollBack() { try { if (trans != null) { this.trans.Rollback(); this.trans.Dispose(); this.trans = null; } } finally { this.Close(); } } #endregion #region 执行SQL语句和存储过程 #region int ExecuteNonQuery /// /// 执行SQL命令,并返回受影响的行数 /// /// SQL命令 /// SQL命令类型 /// 命令参数集合 /// 返回受影响的行数 public override int ExecuteNonQuery(string commandText, System.Data.CommandType commandType, QueryParameterCollection Parameters) { try { SqlCommand cmd = new SqlCommand(); cmd.CommandText = commandText; cmd.CommandType = commandType; cmd.Connection = this.DbConnection; cmd.CommandTimeout = 60; if (trans != null) { cmd.Transaction = trans; } Open(); if (Parameters != null) { foreach (QueryParameter q in Parameters) { cmd.Parameters.Add(ToSqlParameter(q)); } } int tmpValue = cmd.ExecuteNonQuery(); //Parameters.Clear(); //foreach (SqlParameter p in cmd.Parameters) //{ // Parameters[p.ParameterName] = ToQueryParameter(p); //} return tmpValue; } finally { Close(); } } #endregion /// /// 执行SQL命令,并返回受影响的行数 /// /// SQL命令 /// SQL命令类型 /// 命令参数集合 /// 返回受影响的行数 public override int ExecuteNonQuery(string commandText, DbParam[] parameters, System.Data.CommandType commandType) { //try //{ // SqlCommand cmd = this.DbConnection.CreateCommand(); // if (trans != null) // { // cmd.Transaction = trans; // } // Open(); // this.PrepareCommand(cmd, commandText, parameters, commandType); // cmd.CommandTimeout = 60; // int tmpValue = cmd.ExecuteNonQuery(); // return tmpValue; //} //finally //{ // Close(); //} //return 1; try { SqlCommand cmd = this.DbConnection.CreateCommand(); if (trans != null) { cmd.Transaction = trans; } Open(); this.PrepareCommand(cmd, commandText, parameters, commandType); cmd.CommandTimeout = 60; int tmpValue = cmd.ExecuteNonQuery(); return tmpValue; } finally { Close(); } } /// /// 执行查询,并返回查询所返回的结果集中第一行的第一列 /// /// /// /// /// public override object ExecuteScalar(string commandText, DbParam[] parameters, CommandType commandType) { try { SqlCommand cmd = this.DbConnection.CreateCommand(); if (trans != null) { cmd.Transaction = trans; } Open(); this.PrepareCommand(cmd, commandText, parameters, commandType); cmd.CommandTimeout = 60; return cmd.ExecuteScalar(); } finally { Close(); } } public override DbDataReader ExecuteReader(string cmdText, DbParam[] parameters, CommandType cmdType) { try { Open(); SqlCommand cmd = this.DbConnection.CreateCommand(); if (trans != null) { cmd.Transaction = trans; } this.PrepareCommand(cmd, cmdText, parameters, cmdType); cmd.CommandTimeout = 60; SqlDataReader reader = cmd.ExecuteReader(); return reader; } finally { } } #region ExecuteDataReader /// /// /// /// /// /// /// public override DbDataReader ExecuteDataReader(string commandText, CommandType commandType, QueryParameterCollection Parameters) { try { Open(); SqlCommand cmd = this.DbConnection.CreateCommand(); cmd.CommandText = commandText; cmd.CommandType = commandType; cmd.CommandTimeout = 60; if (trans != null) { cmd.Transaction = trans; } if (Parameters != null) { foreach (QueryParameter p in Parameters) { cmd.Parameters.Add(ToSqlParameter(p)); } } SqlDataReader reader = cmd.ExecuteReader(); //foreach (SqlParameter p in cmd.Parameters) //{ // Parameters[p.ParameterName] = ToQueryParameter(p); //} return reader; } finally { //Close(); } } #endregion #region ExecuteDataTable /// /// 返回DataTable /// /// /// /// /// /// /// /// public override DataTable ExecuteDataTable(string commandText, CommandType commandType, QueryParameterCollection Parameters, string tableName, int startRecord, int maxRecords) { try { DataTable dt = new DataTable(tableName); SqlDataAdapter sda = new SqlDataAdapter(); Open(); SqlCommand cmd = this.DbConnection.CreateCommand(); cmd.CommandText = commandText; cmd.CommandType = commandType; cmd.CommandTimeout = 60; if (trans != null) { cmd.Transaction = trans; } if (Parameters != null) { foreach (QueryParameter q in Parameters) { cmd.Parameters.Add(ToSqlParameter(q)); } } sda.SelectCommand = cmd; //sda.Fill(startRecord, maxRecords, dt); sda.Fill(dt); //foreach (SqlParameter p in sda.SelectCommand.Parameters) //{ // Parameters[p.ParameterName] = ToQueryParameter(p); //} return dt; } finally { Close(); } } #endregion #region ExecuteDataSet /// /// 返回DataSet数据集 /// /// /// /// /// /// /// /// public override DataSet ExecuteDataSet(string commandText, CommandType commandType, QueryParameterCollection Parameters, string tableName, int startRecord, int maxRecords) { try { DataSet ds = new DataSet(); SqlDataAdapter sda = new SqlDataAdapter(); Open(); SqlCommand cmd = this.DbConnection.CreateCommand(); cmd.CommandText = commandText; cmd.CommandType = commandType; cmd.CommandTimeout = 60; if (trans != null) { cmd.Transaction = trans; } if (Parameters != null) { foreach (QueryParameter q in Parameters) { cmd.Parameters.Add(ToSqlParameter(q)); } } sda.SelectCommand = cmd; if (maxRecords > 0) { sda.Fill(ds, startRecord, maxRecords, tableName); } else { if (!string.IsNullOrEmpty(tableName)) sda.Fill(ds, tableName); else sda.Fill(ds); } //foreach (SqlParameter p in sda.SelectCommand.Parameters) //{ // Parameters[p.ParameterName] = ToQueryParameter(p); //} return ds; } finally { Close(); } } /// /// 获取视图 /// /// /// /// /// /// /// /// public override DataView ExecuteDataView(string commandText, CommandType commandType, QueryParameterCollection Parameters, string tableName, int startRecord, int maxRecords) { try { DataSet ds = new DataSet(); SqlDataAdapter sda = new SqlDataAdapter(); Open(); SqlCommand cmd = this.DbConnection.CreateCommand(); cmd.CommandText = commandText; cmd.CommandType = commandType; cmd.CommandTimeout = 60; if (trans != null) { cmd.Transaction = trans; } if (Parameters != null) { foreach (QueryParameter q in Parameters) { cmd.Parameters.Add(ToSqlParameter(q)); } } sda.SelectCommand = cmd; if (maxRecords > 0) { sda.Fill(ds, startRecord, maxRecords, tableName); } else { if (!string.IsNullOrEmpty(tableName)) sda.Fill(ds, tableName); else sda.Fill(ds); } //foreach (SqlParameter p in sda.SelectCommand.Parameters) //{ // Parameters[p.ParameterName] = ToQueryParameter(p); //} return ds.Tables[0].DefaultView; } finally { Close(); } } #endregion #region object ExecuteScalar /// /// 执行查询,并返回查询所返回的结果集中第一行的第一列 /// /// /// /// /// public override object ExecuteScalar(string commandText, CommandType commandType, QueryParameterCollection parameters) { try { Open(); SqlCommand cmd = this.DbConnection.CreateCommand(); cmd.CommandText = commandText; cmd.CommandType = commandType; cmd.CommandTimeout = 60; if (trans != null) { cmd.Transaction = trans; } if (!object.Equals(parameters, null)) { foreach (QueryParameter p in parameters) { cmd.Parameters.Add(ToSqlParameter(p)); } } return cmd.ExecuteScalar(); } catch (Exception ex) { throw (ex); } finally { Close(); } } #endregion /// /// C#代码验证sql语句是否正确(只验证不执行sql)的方法 /// /// /// public override bool ValidateSQL(string sql) { bool bResult; SqlCommand cmd = this.DbConnection.CreateCommand(); cmd.CommandText = "SET PARSEONLY ON"; cmd.ExecuteNonQuery(); try { cmd.CommandText = sql; cmd.ExecuteNonQuery(); bResult = true; } catch (Exception ex) { bResult = false; } finally { cmd.CommandText = "SET PARSEONLY OFF"; cmd.ExecuteNonQuery(); } return bResult; } #endregion #region 参数类转换 /// /// 获取参数 /// /// /// /// /// void PrepareCommand(IDbCommand cmd, string cmdText, DbParam[] parameters, CommandType cmdType) { cmd.CommandText = cmdText; cmd.CommandType = cmdType; if (parameters != null) { for (int i = 0; i < parameters.Length; i++) { var param = parameters[i]; if (param == null) continue; var parameter = cmd.CreateParameter(); parameter.ParameterName = param.Name; Type parameterType; if (param.Value == null || param.Value == DBNull.Value) { parameter.Value = DBNull.Value; parameterType = param.Type; } else { parameter.Value = param.Value; parameterType = param.Value.GetType(); } if (param.Precision != null) parameter.Precision = param.Precision.Value; if (param.Scale != null) parameter.Scale = param.Scale.Value; if (param.Size != null) parameter.Size = param.Size.Value; DbType? dbType = AntUtils.TryGetDbType(parameterType); if (dbType != null) parameter.DbType = dbType.Value; cmd.Parameters.Add(parameter); } } } /// /// 参数类转换 /// /// /// private SqlParameter ToSqlParameter(QueryParameter parameter) { SqlParameter sqlParameter = new SqlParameter(); sqlParameter.DbType = parameter.DbType; sqlParameter.Direction = parameter.Direction; sqlParameter.IsNullable = parameter.IsNullable; sqlParameter.ParameterName = parameter.ParameterName; sqlParameter.Precision = parameter.Precision; sqlParameter.Scale = parameter.Scale; sqlParameter.Size = parameter.Size; sqlParameter.SourceColumn = parameter.SourceColumn; sqlParameter.SourceVersion = parameter.SourceVersion; sqlParameter.Value = parameter.Value; return sqlParameter; } /// /// 将SqlParameter转化为QueryParameter /// /// /// private QueryParameter ToQueryParameter(SqlParameter parameter) { QueryParameter queryParameter = new QueryParameter(); queryParameter.DbType = parameter.DbType; queryParameter.Direction = parameter.Direction; queryParameter.IsNullable = parameter.IsNullable; queryParameter.ParameterName = parameter.ParameterName; queryParameter.Precision = parameter.Precision; queryParameter.Scale = parameter.Scale; queryParameter.Size = parameter.Size; queryParameter.SourceColumn = parameter.SourceColumn; queryParameter.SourceVersion = parameter.SourceVersion; queryParameter.Value = parameter.Value; return queryParameter; } #endregion } }