jt
2021-06-10 5d0d028456874576560552f5a5c4e8b801786f11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/////////////////////////////////////////////////////////////////////////////
//    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
{
    /// <summary>
    /// 为外部创建DataAccess的实例,并提供常用的数据访问方法。
    /// </summary>
    public static class DAOManager
    {
        #region Create
        /// <summary>
        /// 创建DataAccessObject对象
        /// </summary>
        /// <typeparam name="T">DataAccessObject对象类型</typeparam>
        /// <returns>返回DataAccessObject实例</returns>
        public static T Create<T>()
            where T : BaseDAL, new()
        {
            return ObjectCreator.Create<T>();
        }
        #endregion
 
        #region RollbackTransaction
        /// <summary>
        /// 对事物执行Rollback回滚
        /// </summary>
        /// <param name="trans">事务对象</param>
        /// <remarks>多次对同一个事务对象,直接调用Rollback方法的时候,会产生异常。DbTransaction.Rollback回滚事务对象,可以避免多次调用而产生的异常。</remarks>
        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
 
        /// <summary>
        /// 对某一个动作,执行事务
        /// </summary>
        /// <param name="actionTransaction">执行事务的动作</param>
        /// <remarks>如果参数trans不为null的话:调用此方法的过程中,trans是不会做Commit,必须方法外部做Commit;但如果出现异常,trans会执行Rollback。</remarks>
        public static SqlExecuteResult ExecuteTransaction(Func<DbTransaction, SqlExecuteResult> actionTransaction)
        {
            return ExecuteTransaction(BaseDAL.CreateDataAccess(BaseDAL.DATABASE_NAME)
                , actionTransaction);
        }
 
        /// <summary>
        /// 对某一个动作,执行事务
        /// </summary>
        /// <param name="db">数据库工具类</param>
        /// <param name="actionTransaction">执行事务的动作</param>
        /// <remarks>如果参数trans不为null的话:调用此方法的过程中,trans是不会做Commit,必须方法外部做Commit;但如果出现异常,trans会执行Rollback。</remarks>
        public static SqlExecuteResult ExecuteTransaction(Database db, Func<DbTransaction, SqlExecuteResult> 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();
        /// <summary>
        /// 缓存表结构
        /// </summary>
        /// <remarks>
        /// Key为字段名称(大写);Value为字段信息
        /// </remarks>
        private static Dictionary<string, Dictionary<string, DatabaseColumnStruct>> tableSchemasCache =
            new Dictionary<string, Dictionary<string, DatabaseColumnStruct>>();
 
        /// <summary>
        /// 读取表结构
        /// </summary>
        /// <param name="tableName">表名称</param>
        /// <param name="db">数据库访问工具类</param>
        /// <returns>字段信息列表</returns>
        public static Dictionary<string, DatabaseColumnStruct> LoadTableSchema(string tableName, Database db)
        {
            tableName = tableName.ToUpper();
 
            if (!tableSchemasCache.ContainsKey(tableName))
            {
                lock (lockObjLoadTableSchema)
                {
                    Dictionary<string, DatabaseColumnStruct> cols = new Dictionary<string, DatabaseColumnStruct>();
                    //读取表结构,并加载到缓存中
                    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
    }
}