/////////////////////////////////////////////////////////////////////////////
// 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
}
}