using System.Data; using System; using System.Data.Common; namespace Mesnac.Codd.Session { /// /// 数据库操作类 /// public class DbHelper { public DbHelper(DbSession dbSession) { this.dbSession = dbSession; } #region 私有变量 private bool closeByHandle = false; private DbSession dbSession = null; private DbTransaction transaction = null; #endregion #region 属性 public DbSession DbSession { get { return this.dbSession; } } public CommandType CommandType { get { return this.dbSession.Command.CommandType; } set { this.dbSession.Command.CommandType = value; } } public string CommandText { get { return this.dbSession.Command.CommandText; } set { this.dbSession.Command.CommandText = value; } } #endregion #region 方法 private DbType ToDbType(object o) { Type t = o.GetType(); DbType dbt = DbType.Object; try { dbt = (DbType)Enum.Parse(typeof(DbType), t.Name); } catch { } return dbt; } public void ClearParameter() { this.dbSession.Command.Parameters.Clear(); } public DbParameter CreateParameter(string key, object value) { DbParameter Result = this.dbSession.ProviderFactory.CreateParameter(); Result.ParameterName = key; if (value == null || value == System.DBNull.Value) { Result.Value = System.DBNull.Value; } else { Result.DbType = ToDbType(value); Result.Value = value; } return Result; } public DbParameter CreateParameter(string key) { DbParameter Result = this.dbSession.ProviderFactory.CreateParameter(); Result.ParameterName = key; return Result; } public void AddParameter(string key, object value) { this.dbSession.Command.Parameters.Add(CreateParameter(key, value)); } public void AddParameter(DbParameter para) { this.dbSession.Command.Parameters.Add(para); } public void OpenConnection(bool closeByHandle) { this.closeByHandle = closeByHandle; try { if (this.dbSession.Connection.State != ConnectionState.Open) { this.dbSession.Connection.Open(); } } catch (Exception ex) { //ICSharpCode.Core.LoggingService.Error("打开数据连接失败!"); ICSharpCode.Core.LoggingService.Error(ex.Message); //ICSharpCode.Core.LoggingService.Error(ex.StackTrace); } } public void OpenConnection() { this.OpenConnection(false); } public void CloseConnection() { try { this.dbSession.Connection.Close(); this.dbSession.Connection.Dispose(); this.dbSession.Command.Dispose(); this.dbSession.Close(); } catch { } } private void AutoCloseConnection() { ClearParameter(); if (this.closeByHandle) { return; } if (this.transaction != null) { return; } if (this.dbSession.Command.Transaction != null) { return; } CloseConnection(); } public void ExecuteNonQuery() { try { this.OpenConnection(); this.dbSession.Command.ExecuteNonQuery(); } finally { this.AutoCloseConnection(); } } public object ToDataSet() { try { this.OpenConnection(); DataSet Result = new DataSet(); DbDataAdapter dataAdapter = this.dbSession.ProviderFactory.CreateDataAdapter(); dataAdapter.SelectCommand = this.dbSession.Command; dataAdapter.Fill(Result); return Result; } finally { this.AutoCloseConnection(); } } public DataTable ToDataTable() { try { this.OpenConnection(); DataTable Result = new DataTable(); DbDataReader myReader = this.ToDbDataReader(); if (myReader == null) { return new DataTable(); } Result.Load(myReader, LoadOption.Upsert); return Result; } finally { this.AutoCloseConnection(); } } public object ToScalar() { try { this.OpenConnection(); return this.dbSession.Command.ExecuteScalar(); } finally { this.AutoCloseConnection(); } } public DbDataReader ToDbDataReader() { try { this.OpenConnection(); return this.dbSession.Command.ExecuteReader(); } catch (Exception ex) { ICSharpCode.Core.LoggingService.Error("获取DataReader失败!"); ICSharpCode.Core.LoggingService.Error(ex.Message); //ICSharpCode.Core.LoggingService.Error(ex.StackTrace); this.AutoCloseConnection(); return null; } finally { this.ClearParameter(); } } public DbTransaction BeginTransaction() { try { this.OpenConnection(); if (this.transaction == null) { this.transaction = this.dbSession.Connection.BeginTransaction(); } this.dbSession.Command.Transaction = this.transaction; return this.transaction; } finally { this.AutoCloseConnection(); } } public void RollbackTransaction() { try { if (this.transaction != null) { this.transaction.Rollback(); } } finally { this.transaction = null; this.AutoCloseConnection(); } } public void CommitTransaction() { try { if (this.transaction != null) { this.transaction.Commit(); } } finally { this.transaction = null; this.AutoCloseConnection(); } } #endregion } }