///////////////////////////////////////////////////////////////////////////// // File Description : 为外部创建DataAccess的实例,并提供常用的数据访问方法。 // Copyright : joyin // ------------------------------------------------------------------------- // Date Created : Mar 26, 2010 // Author : jiangxinjun // ///////////////////////////////////////////////////////////////////////////// using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using HanHe.Utility; using HanHe.Utility.Data; using HH.WMS.Entitys.Common; using HH.WMS.Common; using HH.WMS.Entitys; namespace HH.WMS.DAL { /// /// 为外部创建DataAccess的实例,并提供常用的数据访问方法。 /// public static class DAOManager { #region Create /// /// 创建DataAccessObject对象 /// /// DataAccessObject对象类型 /// 返回DataAccessObject实例 public static T Create() where T : BaseDAL, new() { return ObjectCreator.Create(); } #endregion #region RollbackTransaction /// /// 对事物执行Rollback回滚 /// /// 事务对象 /// 多次对同一个事务对象,直接调用Rollback方法的时候,会产生异常。DbTransaction.Rollback回滚事务对象,可以避免多次调用而产生的异常。 public static void RollbackTransaction(DbTransaction trans) { if (trans != null && trans.Connection != null && ComDbName.MySQL != ConstantBase.APP_DATA_TYPE.ToUpper()) { //trans.Commit(); trans.Rollback(); } } #endregion #region ExecuteTransaction /// /// 对某一个动作,执行事务 /// /// 执行事务的动作 /// 如果参数trans不为null的话:调用此方法的过程中,trans是不会做Commit,必须方法外部做Commit;但如果出现异常,trans会执行Rollback。 public static SqlExecuteResult ExecuteTransaction(Func actionTransaction) { return ExecuteTransaction(BaseDAL.CreateDataAccess(BaseDAL.DATABASE_NAME) , actionTransaction); } /// /// 对某一个动作,执行事务 /// /// 数据库工具类 /// 执行事务的动作 /// 如果参数trans不为null的话:调用此方法的过程中,trans是不会做Commit,必须方法外部做Commit;但如果出现异常,trans会执行Rollback。 public static SqlExecuteResult ExecuteTransaction(Database db, Func actionTransaction) { SqlExecuteResult result = null; if (actionTransaction != null) { using (DbConnection conn = db.CreateConnection()) { conn.Open(); DbTransaction trans = conn.BeginTransaction(); try { result = actionTransaction(trans); if (result == null || !result.Success) { DAOManager.RollbackTransaction(trans); } else { trans.Commit(); } } catch (Exception ex) { DAOManager.RollbackTransaction(trans); //捕捉了异常,并把异常封装在SqlExecuteResult中 result = new SqlExecuteResult() { Success = false, Exception = ex }; } finally { conn.Close(); } } } return result; } #endregion #region LoadTableSchema private static object lockObjLoadTableSchema = new object(); /// /// 缓存表结构 /// /// /// Key为字段名称(大写);Value为字段信息 /// private static Dictionary> tableSchemasCache = new Dictionary>(); /// /// 读取表结构 /// /// 表名称 /// 数据库访问工具类 /// 字段信息列表 public static Dictionary LoadTableSchema(string tableName, Database db) { tableName = tableName.ToUpper(); if (!tableSchemasCache.ContainsKey(tableName)) { lock (lockObjLoadTableSchema) { Dictionary cols = new Dictionary(); //读取表结构,并加载到缓存中 DataTable schemaInfos = new DataTable(); string sql = string.Format("SELECT TOP 0 * FROM {0} ", tableName); using (IDataReader dr = db.ExecuteReader(db.GetSqlStringCommand(sql))) { schemaInfos = dr.GetSchemaTable(); } foreach (DataRow schemaInfo in schemaInfos.Rows) { cols.Add(schemaInfo["ColumnName"].ToString().ToUpper() //字段名称为Key , new DatabaseColumnStruct() { ColumnIndex = Convert.ToInt32(schemaInfo["ColumnOrdinal"]), DbType = (Type)schemaInfo["DataType"], DbTypeName = schemaInfo["DataTypeName"].ToString(), AllowDBNull = (bool)schemaInfo["AllowDBNull"], IsIdentity = (bool)schemaInfo["IsIdentity"], Name = schemaInfo["ColumnName"].ToString(), Size = (int)schemaInfo["ColumnSize"] }); } tableSchemasCache.Add(tableName, cols); } } return tableSchemasCache[tableName]; } #endregion } }