namespace HW.Utility.Data { using System; using System.Configuration; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Globalization; using System.Runtime.CompilerServices; using System.Transactions; public class Database { [CompilerGenerated] private System.Configuration.ConnectionStringSettings k__BackingField; private DbProviderFactory dbProviderFactory; private static ParameterCache parameterCache = new ParameterCache(); internal Database(System.Configuration.ConnectionStringSettings connectionStringSettings) { this.ConnectionStringSettings = connectionStringSettings; } public void AddInParameter(DbCommand command, string name, DbType dbType) { this.AddParameter(command, name, dbType, ParameterDirection.Input, string.Empty, DataRowVersion.Default, null); } public void AddInParameter(DbCommand command, string name, DbType dbType, object value) { this.AddParameter(command, name, dbType, ParameterDirection.Input, string.Empty, DataRowVersion.Default, value); } public void AddInParameter(DbCommand command, string name, DbType dbType, string sourceColumn, DataRowVersion sourceVersion) { this.AddParameter(command, name, dbType, 0, ParameterDirection.Input, true, 0, 0, sourceColumn, sourceVersion, null); } public void AddOutParameter(DbCommand command, string name, DbType dbType, int size) { this.AddParameter(command, name, dbType, size, ParameterDirection.Output, true, 0, 0, string.Empty, DataRowVersion.Default, DBNull.Value); } public void AddParameter(DbCommand command, string name, DbType dbType, ParameterDirection direction, string sourceColumn, DataRowVersion sourceVersion, object value) { this.AddParameter(command, name, dbType, 0, direction, false, 0, 0, sourceColumn, sourceVersion, value); } public virtual void AddParameter(DbCommand command, string name, DbType dbType, int size, ParameterDirection direction, bool nullable, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, object value) { DbParameter parameter = this.CreateParameter(name, dbType, size, direction, nullable, precision, scale, sourceColumn, sourceVersion, value); command.Parameters.Add(parameter); } private void AssignParameterValues(DbCommand command, object[] values) { int num = this.UserParametersStartIndex(); for (int i = 0; i < values.Length; i++) { IDataParameter parameter = command.Parameters[i + num]; this.SetParameterValue(command, parameter.ParameterName, values[i]); } } private DbTransaction BeginTransaction(DbConnection connection) { return connection.BeginTransaction(); } public virtual string BuildParameterName(string name) { return name; } public static void ClearParameterCache() { parameterCache.Clear(); } private void CommitTransaction(DbTransaction tran) { tran.Commit(); } protected virtual void ConfigureParameter(DbParameter param, string name, DbType dbType, int size, ParameterDirection direction, bool nullable, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, object value) { param.DbType = dbType; param.Size = size; param.Value = (value == null) ? DBNull.Value : value; param.Direction = direction; param.IsNullable = nullable; param.SourceColumn = sourceColumn; param.SourceVersion = sourceVersion; } private DbCommand CreateCommandByCommandType(CommandType commandType, string commandText) { DbCommand command = this.Factory.CreateCommand(); command.CommandType = commandType; command.CommandText = commandText; return command; } public virtual DbConnection CreateConnection() { DbConnection connection = this.Factory.CreateConnection(); connection.ConnectionString = this.ConnectionStringSettings.ConnectionString; return connection; } protected DbParameter CreateParameter(string name) { DbParameter parameter = this.Factory.CreateParameter(); parameter.ParameterName = this.BuildParameterName(name); return parameter; } protected DbParameter CreateParameter(string name, DbType dbType, int size, ParameterDirection direction, bool nullable, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, object value) { DbParameter param = this.CreateParameter(name); this.ConfigureParameter(param, name, dbType, size, direction, nullable, precision, scale, sourceColumn, sourceVersion, value); return param; } protected virtual void DeriveParameters(DbCommand discoveryCommand) { SqlCommandBuilder.DeriveParameters((SqlCommand) discoveryCommand); } public void DiscoverParameters(DbCommand command) { using (ConnectionWrapper wrapper = this.GetOpenConnection()) { using (DbCommand command2 = this.CreateCommandByCommandType(command.CommandType, command.CommandText)) { command2.Connection = wrapper.Connection; this.DeriveParameters(command2); command2.Parameters.RemoveAt(0); foreach (IDataParameter parameter in command2.Parameters) { IDataParameter parameter2 = (IDataParameter) ((ICloneable) parameter).Clone(); command.Parameters.Add(parameter2); } } } } protected int DoExecuteNonQuery(DbCommand command) { int num2; try { DateTime now = DateTime.Now; num2 = command.ExecuteNonQuery(); } catch (Exception exception) { throw exception; } return num2; } private IDataReader DoExecuteReader(DbCommand command, CommandBehavior cmdBehavior) { IDataReader reader2; try { DateTime now = DateTime.Now; reader2 = command.ExecuteReader(cmdBehavior); } catch (Exception exception) { throw exception; } return reader2; } private object DoExecuteScalar(DbCommand command) { object obj3; try { DateTime now = DateTime.Now; obj3 = command.ExecuteScalar(); } catch (Exception exception) { throw exception; } return obj3; } public virtual DataSet ExecuteDataSet(DbCommand command) { DataSet dataSet = new DataSet(); dataSet.Locale = CultureInfo.InvariantCulture; using (DbConnection connection = this.CreateConnection()) { command.Connection = connection; DbDataAdapter adapter = this.Factory.CreateDataAdapter(); adapter.SelectCommand = command; adapter.Fill(dataSet, "Table"); } return dataSet; } public virtual DataSet ExecuteDataSet(CommandType commandType, string commandText) { using (DbCommand command = this.CreateCommandByCommandType(commandType, commandText)) { return this.ExecuteDataSet(command); } } public virtual DataSet ExecuteDataSet(DbCommand command, DbTransaction transaction) { DataSet dataSet = new DataSet(); dataSet.Locale = CultureInfo.InvariantCulture; using (DbConnection connection = this.CreateConnection()) { command.Connection = connection; DbDataAdapter adapter = this.Factory.CreateDataAdapter(); adapter.SelectCommand = command; adapter.Fill(dataSet, "Table"); } return dataSet; } public virtual DataSet ExecuteDataSet(string storedProcedureName, params object[] parameterValues) { using (DbCommand command = this.GetStoredProcCommand(storedProcedureName, parameterValues)) { return this.ExecuteDataSet(command); } } public virtual DataSet ExecuteDataSet(DbTransaction transaction, CommandType commandType, string commandText) { using (DbCommand command = this.CreateCommandByCommandType(commandType, commandText)) { return this.ExecuteDataSet(command, transaction); } } public virtual DataSet ExecuteDataSet(DbTransaction transaction, string storedProcedureName, params object[] parameterValues) { using (DbCommand command = this.GetStoredProcCommand(storedProcedureName, parameterValues)) { return this.ExecuteDataSet(command, transaction); } } public virtual int ExecuteNonQuery(DbCommand command) { using (ConnectionWrapper wrapper = this.GetOpenConnection()) { PrepareCommand(command, wrapper.Connection); return this.DoExecuteNonQuery(command); } } public virtual int ExecuteNonQuery(CommandType commandType, string commandText) { using (DbCommand command = this.CreateCommandByCommandType(commandType, commandText)) { return this.ExecuteNonQuery(command); } } public virtual int ExecuteNonQuery(DbCommand command, DbTransaction transaction) { PrepareCommand(command, transaction); return this.DoExecuteNonQuery(command); } public virtual int ExecuteNonQuery(string storedProcedureName, params object[] parameterValues) { using (DbCommand command = this.GetStoredProcCommand(storedProcedureName, parameterValues)) { return this.ExecuteNonQuery(command); } } public virtual int ExecuteNonQuery(DbTransaction transaction, CommandType commandType, string commandText) { using (DbCommand command = this.CreateCommandByCommandType(commandType, commandText)) { return this.ExecuteNonQuery(command, transaction); } } public virtual int ExecuteNonQuery(DbTransaction transaction, string storedProcedureName, params object[] parameterValues) { using (DbCommand command = this.GetStoredProcCommand(storedProcedureName, parameterValues)) { return this.ExecuteNonQuery(command, transaction); } } public virtual IDataReader ExecuteReader(DbCommand command) { IDataReader reader; ConnectionWrapper openConnection = this.GetOpenConnection(false); try { PrepareCommand(command, openConnection.Connection); if (Transaction.Current != null) { return this.DoExecuteReader(command, CommandBehavior.Default); } reader = this.DoExecuteReader(command, CommandBehavior.CloseConnection); } catch { openConnection.Connection.Close(); throw; } return reader; } public IDataReader ExecuteReader(CommandType commandType, string commandText) { using (DbCommand command = this.CreateCommandByCommandType(commandType, commandText)) { return this.ExecuteReader(command); } } public virtual IDataReader ExecuteReader(DbCommand command, DbTransaction transaction) { PrepareCommand(command, transaction); return this.DoExecuteReader(command, CommandBehavior.Default); } public IDataReader ExecuteReader(string storedProcedureName, params object[] parameterValues) { using (DbCommand command = this.GetStoredProcCommand(storedProcedureName, parameterValues)) { return this.ExecuteReader(command); } } public IDataReader ExecuteReader(DbTransaction transaction, CommandType commandType, string commandText) { using (DbCommand command = this.CreateCommandByCommandType(commandType, commandText)) { return this.ExecuteReader(command, transaction); } } public IDataReader ExecuteReader(DbTransaction transaction, string storedProcedureName, params object[] parameterValues) { using (DbCommand command = this.GetStoredProcCommand(storedProcedureName, parameterValues)) { return this.ExecuteReader(command, transaction); } } public virtual object ExecuteScalar(DbCommand command) { if (command == null) { throw new ArgumentNullException("command"); } using (ConnectionWrapper wrapper = this.GetOpenConnection()) { PrepareCommand(command, wrapper.Connection); return this.DoExecuteScalar(command); } } public virtual object ExecuteScalar(CommandType commandType, string commandText) { using (DbCommand command = this.CreateCommandByCommandType(commandType, commandText)) { return this.ExecuteScalar(command); } } public virtual object ExecuteScalar(DbCommand command, DbTransaction transaction) { PrepareCommand(command, transaction); return this.DoExecuteScalar(command); } public virtual object ExecuteScalar(string storedProcedureName, params object[] parameterValues) { using (DbCommand command = this.GetStoredProcCommand(storedProcedureName, parameterValues)) { return this.ExecuteScalar(command); } } public virtual object ExecuteScalar(DbTransaction transaction, CommandType commandType, string commandText) { using (DbCommand command = this.CreateCommandByCommandType(commandType, commandText)) { return this.ExecuteScalar(command, transaction); } } public virtual object ExecuteScalar(DbTransaction transaction, string storedProcedureName, params object[] parameterValues) { using (DbCommand command = this.GetStoredProcCommand(storedProcedureName, parameterValues)) { return this.ExecuteScalar(command, transaction); } } internal DbConnection GetNewOpenConnection() { DbConnection connection = null; try { try { connection = this.CreateConnection(); connection.Open(); } catch (Exception exception) { throw exception; } } catch { if (connection != null) { connection.Close(); } throw; } return connection; } protected ConnectionWrapper GetOpenConnection() { return this.GetOpenConnection(true); } protected ConnectionWrapper GetOpenConnection(bool disposeInnerConnection) { DbConnection connection = TransactionScopeConnections.GetConnection(this); if (connection != null) { return new ConnectionWrapper(connection, false); } return new ConnectionWrapper(this.GetNewOpenConnection(), disposeInnerConnection); } public virtual object GetParameterValue(DbCommand command, string name) { return command.Parameters[this.BuildParameterName(name)].Value; } public DbCommand GetSqlStringCommand(string query) { if (string.IsNullOrEmpty(query)) { throw new ArgumentException("不能为空", "query"); } return this.CreateCommandByCommandType(CommandType.Text, query); } public virtual DbCommand GetStoredProcCommand(string storedProcedureName) { if (string.IsNullOrEmpty(storedProcedureName)) { throw new ArgumentException("不能为空", "storedProcedureName"); } return this.CreateCommandByCommandType(CommandType.StoredProcedure, storedProcedureName); } public virtual DbCommand GetStoredProcCommand(string storedProcedureName, params object[] parameterValues) { if (string.IsNullOrEmpty(storedProcedureName)) { throw new ArgumentException("不能为空", "storedProcedureName"); } DbCommand command = this.CreateCommandByCommandType(CommandType.StoredProcedure, storedProcedureName); parameterCache.SetParameters(command, this); if (!this.SameNumberOfParametersAndValues(command, parameterValues)) { throw new InvalidOperationException("参数对应错误"); } this.AssignParameterValues(command, parameterValues); return command; } [Obsolete("Use GetOpenConnection instead.")] protected DbConnection OpenConnection() { return this.GetNewOpenConnection(); } protected static void PrepareCommand(DbCommand command, DbConnection connection) { if (command == null) { throw new ArgumentNullException("command"); } if (connection == null) { throw new ArgumentNullException("connection"); } command.Connection = connection; } protected static void PrepareCommand(DbCommand command, DbTransaction transaction) { if (command == null) { throw new ArgumentNullException("command"); } if (transaction == null) { throw new ArgumentNullException("transaction"); } PrepareCommand(command, transaction.Connection); command.Transaction = transaction; } private void RollbackTransaction(DbTransaction tran) { tran.Rollback(); } protected virtual bool SameNumberOfParametersAndValues(DbCommand command, object[] values) { int count = command.Parameters.Count; int length = values.Length; return (count == length); } public virtual void SetParameterValue(DbCommand command, string parameterName, object value) { command.Parameters[this.BuildParameterName(parameterName)].Value = (value == null) ? DBNull.Value : value; } protected virtual int UserParametersStartIndex() { return 0; } public string ConnectionString { get { return this.ConnectionStringSettings.ConnectionString; } } public System.Configuration.ConnectionStringSettings ConnectionStringSettings { [CompilerGenerated] get { return this.k__BackingField; } [CompilerGenerated] private set { this.k__BackingField = value; } } public DbProviderFactory Factory { get { if (this.dbProviderFactory == null) { this.dbProviderFactory = DbProviderFactories.GetFactory(this.ConnectionStringSettings.ProviderName); } return this.dbProviderFactory; } } protected class ConnectionWrapper : IDisposable { private DbConnection connection; private bool disposeConnection; public ConnectionWrapper(DbConnection connection, bool disposeConnection) { this.connection = connection; this.disposeConnection = disposeConnection; } public void Dispose() { if (this.disposeConnection) { this.connection.Dispose(); } } public DbConnection Connection { get { return this.connection; } } } } }