在以前的开发中,看到过很多的代码工具,在数据结构不变的情况下,用来生成代码是很方便的,但是在我们实际的开发过程,经常修改数据库的结构,这就造成了对代码的多个地方的更新操作,这样就给更新带来很的麻烦。我下面要说的就是通用数据访问层,最大的好处就是,在开发的过程中对数据库结构的变化时,我们只需要更新实体类,就可以做到,另外实体模型的生成使用了部份类的特性,如果对实体的修改也可以不变,同时也生成了视图实体,这样也补充了大部份查询操作要用多个表来连接查询的要求。
我们首先来对实体层作一个抽象,如下:






















































































































































































































































































































































































































































































































































































































































通用数据访问层的代码如下:






































































































































































































































public abstract class DABase : IDABase
{
#region 连接属性
/// <summary>
/// 当前的事务级别
/// </summary>
protected IsolationLevel IsolationLevel = IsolationLevel.ReadCommitted;
/// <summary>
/// 事务对象
/// </summary>
protected DbTransaction sqlTran;
/// <summary>
/// 当前连接
/// </summary>
protected DbConnection conn;
/// <summary>
/// 当前是否启用事务
/// </summary>
protected bool _IsTransaction;
#endregion
#region ctor
/// <summary>
/// 在自定义了连接字符串的取用方式后,请修改之
/// 默认启用事务
/// </summary>
protected DABase()
{
_IsTransaction = false;
InitFunctionEx(IsolationLevel.ReadCommitted, null);
}
/// <summary>
/// 在自定义了连接字符串的取用方式后,请修改之
/// </summary>
protected DABase(bool IsTransaction)
{
_IsTransaction = IsTransaction;
InitFunctionEx(IsolationLevel.ReadCommitted, null);
}
/// <summary>
/// 在自定义了连接字符串的取用方式后,请修改之
/// </summary>
protected DABase(bool IsTransaction, string ConnectionName)
{
_IsTransaction = IsTransaction;
InitFunctionEx(IsolationLevel.ReadCommitted, ConnectionName);
}
/// <summary>
/// 在自定义了连接字符串的取用方式后,请修改之
/// </summary>
protected DABase(IsolationLevel TranIsolationLevel)
{
_IsTransaction = true;
InitFunctionEx(TranIsolationLevel, null);
}
/// <summary>
/// 在自定义了连接字符串的取用方式后,请修改之
/// </summary>
protected DABase(IsolationLevel TranIsolationLevel, string ConnectionName)
{
_IsTransaction = true;
InitFunctionEx(TranIsolationLevel, ConnectionName);
}
/// <summary>
/// 初始化数据连接或事务
/// </summary>
/// <param name="IsolationLevel">事务级别</param>
/// <param name="ConnectionName">连接字符串</param>
private void InitFunctionEx(IsolationLevel IsolationLevel, string ConnectionName)
{
this.IsolationLevel = IsolationLevel;
InitFunction(IsolationLevel, ConnectionName);
}
/// <summary>
/// 初始化数据连接或事务
/// </summary>
/// <param name="IsolationLevel">事务级别</param>
/// <param name="ConnectionName">连接字符串</param>
protected abstract void InitFunction(IsolationLevel IsolationLevel, string ConnectionName);
#endregion
#region 测试设置
protected bool _IsUnitTest;
/// <summary>
/// 测试设置
/// </summary>
public bool IsUnitTest
{
set
{
_IsUnitTest = value;
}
get
{
return _IsUnitTest;
}
}
#endregion
#region 事务相关
/// <summary>
/// 提交事务
/// 如果设置为单元测试模式,就是回滚事务
/// </summary>
public void Commit()
{
if (!_IsTransaction)
throw new NoDbTransactionException("提交事务。");
if (sqlTran == null) return;
if (IsUnitTest)
sqlTran.Rollback();
else
sqlTran.Commit();
}
/// <summary>
/// 回滚事务
/// </summary>
public void Rollback()
{
if (!_IsTransaction)
throw new NoDbTransactionException("回滚事务。");
if (sqlTran != null)
sqlTran.Rollback();
}
#endregion
#region 数据库连接
/// <summary>
/// 关闭链接或事务
/// </summary>
public void Close()
{
if (_IsTransaction)
{
if (sqlTran != null)
{
DbConnection connection = sqlTran.Connection;
if (connection != null)
connection.Close();
}
}
else
if (conn != null)
conn.Close();
}
#endregion
#region IDisposable 成员
/// <summary>
/// 释放资源
/// </summary>
public void Dispose()
{
this.Close();
}
#endregion
#region IDABase 成员
/// <summary>
/// 检查唯一性约束,所有关键字是与的关系
/// 只要有一个相同就认为不唯一
/// </summary>
/// <param name="e">实体</param>
/// <returns></returns>
public abstract bool CheckUnique(EntityBase e);
/// <summary>
/// 根据条件删除实体
/// </summary>
/// <param name="e">实体</param>
/// <param name="WhereCondition">条件</param>
/// <returns>返回删除记录的条数</returns>
public abstract int Delete(EntityBase e, string WhereCondition);
/// <summary>
/// 根据主键删除实体
/// </summary>
/// <param name="e">实体</param>
/// <returns>返回删除记录的条数</returns>
public abstract int Delete(EntityBase e);
/// <summary>
/// 根据主键列表删除实体
/// </summary>
/// <param name="e">实体</param>
/// <returns>返回删除记录的条数</returns>
public abstract int Deletes(EntityBase e);
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="StoreName">存储过程名</param>
/// <param name="Parame">参数列表</param>
/// <returns>返回对应的输出和返回参数</returns>
public abstract IDictionary<string, object> ExceStore(string StoreName, IList<Parameter> Parame);
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="StoreName">存储过程名</param>
/// <param name="Parame">参数列表</param>
/// <returns>返回数据集</returns>
public abstract DataSet ExceStoreGetDataSet(string StoreName, IList<Parameter> Parame);
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="StoreName">存储过程名</param>
/// <param name="Parame">参数列表</param>
/// <returns>返回单个对象</returns>
public abstract object ExceStoreGetObject(string StoreName, IList<Parameter> Parame);
/// <summary>
/// 根据实体外键查询外键实体
/// </summary>
/// <param name="e">实体</param>
/// <param name="ForeignKeyName">外键名</param>
/// <returns>返回实体</returns>
public abstract EntityBase GetEntityByForeignKey(EntityBase e, string ForeignKeyName);
/// <summary>
/// 分页查询
/// </summary>
/// <param name="TableName">表名或视图名</param>
/// <param name="FieldNames">字段列表</param>
/// <param name="OrderName">排序字段</param>
/// <param name="PageSize">每页大小</param>
/// <param name="PageIndex">页索引</param>
/// <param name="IsReCount">返回记录总数</param>
/// <param name="OrderType">排序类型,0表示升序 1 表示降序 其它程序自动控制,仅仅使用OrderName字段的值,作为排序条件</param>
/// <param name="strWhere">过滤条件</param>
/// <returns>返回数据集</returns>
public abstract DataSet GetRecordByPageOrder(string TableName, string FieldNames, string OrderName, int PageSize, int PageIndex, bool IsReCount, bool OrderType, string strWhere);
/// <summary>
/// 插入实体
/// </summary>
/// <param name="e">实体</param>
/// <returns></returns>
public abstract int Insert(EntityBase e);
/// <summary>
/// 插入实体
/// </summary>
/// <param name="e">实体</param>
/// <returns></returns>
public abstract object InsertReturnId(EntityBase e);
/// <summary>
/// 查询实体
/// </summary>
/// <param name="e">实体</param>
/// <returns></returns>
public abstract bool Select(EntityBase e);
/// <summary>
/// 查询外键数据集
/// </summary>
/// <param name="e">实体</param>
/// <param name="ForeignKeyName">外键名</param>
/// <returns>数据集</returns>
public abstract DataSet SelectByForeignKey(EntityBase e, string ForeignKeyName);
/// <summary>
///
/// </summary>
/// <param name="e">实体</param>
/// <param name="WhereCondition"></param>
/// <param name="OrderByExpression"></param>
/// <returns></returns>
public abstract DataSet SelectDynamic(EntityBase e, string WhereCondition, string OrderByExpression);
/// <summary>
/// 根据条件更新实体记录
/// </summary>
/// <param name="e">实体</param>
/// <param name="UpdateStatement">更新语句</param>
/// <param name="WhereCondition">条件语句</param>
/// <returns>返回更新记录数</returns>
public abstract int Update(EntityBase e, string UpdateStatement, string WhereCondition);
/// <summary>
/// 根据条件更新实体
/// </summary>
/// <param name="e">实体</param>
/// <param name="WhereCondition">条件语句</param>
/// <returns>条件语句</returns>
public abstract int Update(EntityBase e, string WhereCondition);
/// <summary>
/// 更新实体
/// </summary>
/// <param name="e">实体</param>
/// <returns>条件语句</returns>
public abstract int Update(EntityBase e);
protected DbType GetKeyDBType(object ob)
{
Type type = ob.GetType();
if (type == typeof(string))
return DbType.AnsiString;
if (type == typeof(int))
return DbType.Int32;
if (type == typeof(Guid))
return DbType.Guid;
return DbType.AnsiString;
}
//protected string CSharpType(ColumnSchema column)
//{
// if (column.Name.EndsWith("TypeCode")) return column.Name;
// switch (column.DataType)
// {
// case DbType.AnsiString: return "string";
// case DbType.AnsiStringFixedLength: return "string";
// case DbType.Binary: return "byte[]";
// case DbType.Boolean: return "bool";
// case DbType.Byte: return "byte";
// case DbType.Currency: return "decimal";
// case DbType.Date: return "DateTime";
// case DbType.DateTime: return "DateTime";
// case DbType.Decimal: return "decimal";
// case DbType.Double: return "double";
// case DbType.Guid: return "Guid";
// case DbType.Int16: return "short";
// case DbType.Int32: return "int";
// case DbType.Int64: return "long";
// case DbType.Object: return "object";
// case DbType.SByte: return "sbyte";
// case DbType.Single: return "float";
// case DbType.String: return "string";
// case DbType.StringFixedLength: return "string";
// case DbType.Time: return "TimeSpan";
// case DbType.UInt16: return "ushort";
// case DbType.UInt32: return "uint";
// case DbType.UInt64: return "ulong";
// case DbType.VarNumeric: return "decimal";
// default:
// {
// return "__UNKNOWN__" + column.NativeType;
// }
// }
//}
#endregion
#region IDABase Members
public abstract DataSet GetData(string Sql);
public abstract void ExcuteSql(string Sql);
public abstract object GetSingle(string Sql);
public abstract DataSet GetData(string Sql, IList<Parameter> Parame);
public abstract void ExcuteSql(string Sql, IList<Parameter> Parame);
public abstract object GetSingle(string Sql, IList<Parameter> Parame);
#endregion
}
/// <summary>
/// 基于企业库的数据访问层
/// </summary>
public sealed class EnterpriseLibraryDABase : KMTool.Common.Dal.DABase
{
#region ctor
/// <summary>
/// 数据库对象
/// </summary>
protected Database db;
/// <summary>
/// 在自定义了连接字符串的取用方式后,请修改之
/// 默认启用事务
/// </summary>
public EnterpriseLibraryDABase():base()
{
}
/// <summary>
/// 在自定义了连接字符串的取用方式后,请修改之
/// </summary>
public EnterpriseLibraryDABase(bool IsTransaction)
: base(IsTransaction)
{
}
/// <summary>
/// 在自定义了连接字符串的取用方式后,请修改之
/// </summary>
public EnterpriseLibraryDABase(bool IsTransaction, string ConnectionName)
: base(IsTransaction,ConnectionName)
{
}
/// <summary>
/// 在自定义了连接字符串的取用方式后,请修改之
/// </summary>
public EnterpriseLibraryDABase(IsolationLevel TranIsolationLevel)
: base(TranIsolationLevel)
{
}
/// <summary>
/// 在自定义了连接字符串的取用方式后,请修改之
/// </summary>
public EnterpriseLibraryDABase(IsolationLevel TranIsolationLevel, string ConnectionName)
: base(TranIsolationLevel,ConnectionName)
{
}
protected override void InitFunction(IsolationLevel TranIsolationLevel, string ConnectionName)
{
if (string.IsNullOrEmpty(ConnectionName))
db = DatabaseFactory.CreateDatabase();
else
db = DatabaseFactory.CreateDatabase(ConnectionName);
conn = db.CreateConnection();
conn.Open();
if (_IsTransaction)
sqlTran = conn.BeginTransaction(TranIsolationLevel);
}
#endregion
#region 数据库方法
protected void InitDbCommand(DbCommand cmd)
{
cmd.Connection = conn;
if (_IsTransaction)
cmd.Transaction = sqlTran;
//else
}
#region 基本方法
/// <summary>
/// 添加记录
/// </summary>
/// <param name="e">实体</param>
/// <returns>返回影响的行数</returns>
public override int Insert(EntityBase e)
{
DbCommand cmd = db.GetStoredProcCommand(GetProcName(e, "Insert", null));
IList<Parameter> list = e.BuildParams();
AddFillParameter(cmd,list);
return ExecuteNonQuery(cmd);
}
/// <summary>
/// 添加记录
/// </summary>
/// <param name="e">实体</param>
/// <returns>返回自增长ID</returns>
public override object InsertReturnId(EntityBase e)
{
DbCommand cmd = db.GetStoredProcCommand(GetProcName(e, "Insert", null));
IList<Parameter> list = e.BuildParams();
AddFillParameter(cmd,list);
ExecuteNonQuery(cmd);
return GetParamValue(cmd.Parameters, e.GetKeyName());
}
/// <summary>
/// 修改记录
/// </summary>
/// <param name="e">实体</param>
/// <returns>返回影响的行数</returns>
public override int Update(EntityBase e)
{
DbCommand cmd = db.GetStoredProcCommand(GetProcName(e, "Update", null));
IList<Parameter> list = e.BuildParamsEdit();
AddFillParameter(cmd,list);
return ExecuteNonQuery(cmd);
}
/// <summary>
/// 删除记录
/// </summary>
/// <param name="e">实体</param>
/// <returns>返回影响的行数</returns>
public override int Delete(EntityBase e)
{
DbCommand cmd = db.GetStoredProcCommand(GetProcName(e, "Delete", null));
db.AddInParameter(cmd, e.GetKeyName(), GetKeyDBType(e.GetKeyValue()), e.GetKeyValue());
InitDbCommand(cmd);
return ExecuteNonQuery(cmd);
}
/// <summary>
/// 删除多条记录
/// </summary>
/// <param name="e">实体</param>
/// <returns>返回影响的行数</returns>
public override int Deletes(EntityBase e)
{
DbCommand cmd = db.GetStoredProcCommand("pro_Comon_Delete");
db.AddInParameter(cmd, "TableName", DbType.String, e.GetTableName());
db.AddInParameter(cmd, "Ids", DbType.String, e.KeyValueString.Replace("'", "''"));
return ExecuteNonQuery(cmd);
}
/// <summary>
/// 读取记录
/// </summary>
/// <param name="e">实体</param>
/// <returns>返回是否成功</returns>
public override Boolean Select(EntityBase e)
{
DbCommand cmd = db.GetStoredProcCommand(GetProcName(e, "Select", null));
db.AddInParameter(cmd, e.GetKeyName(), GetKeyDBType(e.GetKeyValue()), e.GetKeyValue());
DataSet ds = ExecuteDataSet(cmd);
bool Result = (1 == ds.Tables[0].Rows.Count);
if (Result)
e.Assign(ds);
return Result;
}
/// <summary>
/// 检查惟一性
/// </summary>
/// <param name="e">实体</param>
/// <returns>返回是否惟一</returns>
public override bool CheckUnique(EntityBase e)
{
if (null == e.Uniques || e.Uniques.Count == 0)
return true;
DbCommand cmd = db.GetStoredProcCommand(string.Format("pro_Comon_CheckUnique{0}", e.Uniques.Count));
db.AddInParameter(cmd, "TableName", DbType.String, e.GetTableName());
int i = 0;
foreach (string Key in e.Uniques.Keys)
{
db.AddInParameter(cmd, "FieldName" + (i + 1), DbType.String, Key);
db.AddInParameter(cmd, "Value" + (i + 1), DbType.String, e.Uniques[Key].ToString().Replace("'", "''"));
i++;
}
db.AddInParameter(cmd, "ExcludeKeyName", DbType.String, e.GetKeyName());
db.AddInParameter(cmd, "ExcludeKeyValue", DbType.String, e.GetKeyValue().ToString());
db.AddOutParameter(cmd, "IsNew", DbType.Boolean, 1);
ExecuteNonQuery(cmd);
return bool.Parse(GetParamValue(cmd.Parameters, "IsNew").ToString());
}
#endregion
#region 外键相关
/// <summary>
/// 读取外键的列表
/// </summary>
/// <param name="e">实体</param>
/// <param name="ForeignKeyName">外键名</param>
/// <returns>返回是否成功</returns>
public override DataSet SelectByForeignKey(EntityBase e, string ForeignKeyName)
{
EntityBase eForeign = e.GetEntityByForeignKey(ForeignKeyName);
DbCommand cmd = db.GetStoredProcCommand(GetProcName(eForeign, "Select", "sAll"));
return ExecuteDataSet(cmd);
}
/// <summary>
/// 读取外键记录
/// </summary>
/// <param name="e">实体</param>
/// <param name="ForeignKeyName">外键名称</param>
/// <returns>成功返回外键实体,失败失败返回null</returns>
public override EntityBase GetEntityByForeignKey(EntityBase e, string ForeignKeyName)
{
EntityBase eForeign = e.GetEntityByForeignKey(ForeignKeyName);
DbCommand cmd = db.GetStoredProcCommand(GetProcName(eForeign, "Select", null));
db.AddInParameter(cmd, eForeign.GetKeyName(), GetKeyDBType(e.GetValueByName(ForeignKeyName)), e.GetValueByName(ForeignKeyName));
DataSet ds = ExecuteDataSet(cmd);
bool Result = (1 == ds.Tables[0].Rows.Count);
if (Result)
eForeign.Assign(ds);
else
eForeign = null;
return eForeign;
}
#endregion
#region 有注入的方法,此类方法要控制注入
/*
* 请使用公共方法中的:SafeStr函数替换
* zhoubin.Model.GlobalFunction
public static string SafeSql(string s)
* */
/// <summary>
/// 动态更新表
/// </summary>
/// <param name="e">实体</param>
/// <param name="WhereCondition">条件</param>
/// <returns>返回是否成功</returns>
public override int Update(EntityBase e, string WhereCondition)
{
return Update(e, e.UpdateStatement, WhereCondition);
}
/// <summary>
/// 动态更新表
/// 此方法有sql注入的可能,
/// 请在参数中加入对对注入的控制
/// </summary>
/// <param name="e">实体</param>
/// <param name="UpdateStatement">更新字段</param>
/// <param name="WhereCondition">条件</param>
/// <returns>返回是否成功</returns>
public override int Update(EntityBase e, string UpdateStatement, string WhereCondition)
{
DbCommand cmd = db.GetStoredProcCommand(GetProcName(e, "Update", "Dynamic"));
db.AddInParameter(cmd, "UpdateStatement", DbType.String, UpdateStatement);
db.AddInParameter(cmd, "WhereCondition", DbType.String, WhereCondition);
return ExecuteNonQuery(cmd);
}
/// <summary>
/// 删除记录多条记录
/// 此方法有sql注入的可能,
/// 请在参数中加入对对注入的控制
/// </summary>
/// <param name="e">实体</param>
/// <param name="WhereCondition">条件</param>
/// <returns>返回影响的行数</returns>
public override int Delete(EntityBase e, string WhereCondition)
{
DbCommand cmd = db.GetStoredProcCommand(GetProcName(e, "Delete", "sDynamic"));
db.AddInParameter(cmd, "WhereCondition", DbType.String, WhereCondition);
return ExecuteNonQuery(cmd);
}
/// <summary>
/// 读取记录集,
/// 此方法有sql注入的可能,
/// 请在参数中加入对对注入的控制
/// </summary>
/// <param name="e">实体</param>
/// <param name="WhereCondition">条件</param>
/// <param name="OrderByExpression">排序条件</param>
/// <returns>返回记录集</returns>
public override DataSet SelectDynamic(EntityBase e, string WhereCondition, string OrderByExpression)
{
DbCommand cmd = db.GetStoredProcCommand(GetProcName(e, "Select", "sDynamic"));
db.AddInParameter(cmd, "WhereCondition", DbType.String, WhereCondition);
db.AddInParameter(cmd, "OrderByExpression", DbType.String, OrderByExpression);
return ExecuteDataSet(cmd);
}
/// <summary>
/// 分页查询方法
/// </summary>
/// <param name="TableName">表名或视图名</param>
/// <param name="FieldNames">选择的字段</param>
/// <param name="OrderName">排序类型</param>
/// <param name="PageSize">每页长度</param>
/// <param name="PageIndex">获取页面编号</param>
/// <param name="IsReCount">是否返回总记录数</param>
/// <param name="OrderType">排序类型,1子降序,0升序</param>
/// <param name="strWhere">过滤条件,注意注入攻击防范</param>
/// <returns>Table 0 返回查询的数据集,Table 1 返回记录总数</returns>
public override DataSet GetRecordByPageOrder(string TableName, string FieldNames, string OrderName,
int PageSize, int PageIndex, bool IsReCount, bool OrderType, string strWhere)
{
DbCommand cmd = db.GetStoredProcCommand("pro_GetRecordByPageOrder");
db.AddInParameter(cmd, "@tblName", DbType.String, GlobalFunction.SafeSql(TableName));
db.AddInParameter(cmd, "@fldName", DbType.String, GlobalFunction.SafeSql(FieldNames));
db.AddInParameter(cmd, "@OrderfldName", DbType.String, GlobalFunction.SafeSql(OrderName));
db.AddInParameter(cmd, "@PageSize", DbType.Int32, PageSize);
db.AddInParameter(cmd, "@PageIndex", DbType.Int32, PageIndex);
db.AddInParameter(cmd, "@IsReCount", DbType.Boolean, IsReCount);
db.AddInParameter(cmd, "@OrderType", DbType.Boolean, OrderType);
db.AddInParameter(cmd, "@strWhere", DbType.String, strWhere);
return ExecuteDataSet(cmd);
}
#endregion
#region 辅助方法
/// <summary>
/// 获取指定的返回参数
/// </summary>
/// <param name="p">参数数组</param>
/// <param name="Name">返回参数的名称</param>
/// <returns>没有找到返回null</returns>
private static object GetParamValue(DbParameterCollection p, string Name)
{
if (p == null) throw new ArgumentNullException("p");
foreach (DbParameter sqlp in p)
{
if ((sqlp.Direction == ParameterDirection.Output || sqlp.Direction == ParameterDirection.InputOutput) && sqlp.ParameterName == Name)
{
return sqlp.Value;
}
}
return null;
}
///// <summary>
///// 获得存储过程名称前缀
///// </summary>
///// <param name="e">实体</param>
///// <returns>返回存储过程名称前缀</returns>
//private string GetProcNamePrefix(EntityBase e, string Operate)
//{
// return "pro_" + Operate + e.GetTableName();
//}
/// <summary>
/// 获得存储过程名称前缀
/// </summary>
/// <param name="e">实体</param>
/// <param name="Operate">操作名称</param>
/// <param name="Name">附加名称</param>
/// <returns>返回存储过程名称前缀</returns>
private static string GetProcName(EntityBase e, string Operate, string Name)
{
return string.IsNullOrEmpty(Name) ? string.Format("pro_{0}{1}", Operate, e.GetTableName()) : string.Format("pro_{0}{1}{2}", Operate, e.GetTableName(), Name);
// return "pro_" + Operate + e.GetTableName();
}
private void AddFillParameter(DbCommand cmd, IList<Parameter> list)
{
if (list == null)
return;
foreach (Parameter p in list)
{
db.AddParameter(cmd, p.Name, p.dbType, p.Direction, null,DataRowVersion.Default, p.Value);
//if (p.Direction)
// db.AddInParameter(cmd, p.Name, p.dbType, p.Value);
//else
// db.AddOutParameter(cmd, p.Name, p.dbType, 300);
}
}
private int ExecuteNonQuery(DbCommand cmd)
{
cmd.Connection = conn;
return _IsTransaction?db.ExecuteNonQuery(cmd, sqlTran):db.ExecuteNonQuery(cmd);
}
private DataSet ExecuteDataSet(DbCommand cmd)
{
cmd.Connection = conn;
return _IsTransaction ? db.ExecuteDataSet(cmd, sqlTran) : db.ExecuteDataSet(cmd);
}
private object ExecuteScalar(DbCommand cmd)
{
cmd.Connection = conn;
return _IsTransaction ? db.ExecuteScalar(cmd, sqlTran) : db.ExecuteScalar(cmd);
}
#endregion
#endregion
#region 通用存储过程执行方法,为子类准备
/// <summary>
/// 通用存储过程执行方法
/// </summary>
/// <param name="StroreName">存储过程名</param>
/// <param name="Parame">参数</param>
/// <returns>返回out参数</returns>
public override IDictionary<string, object> ExceStore(string StoreName, IList<Parameter> Parame)
{
IDictionary<string, object> dic = new Dictionary<string, object>();
DbCommand cmd = db.GetStoredProcCommand(StoreName);
AddFillParameter(cmd, Parame);
ExecuteNonQuery(cmd);
foreach (Parameter p in Parame)
{
if (p.Direction == ParameterDirection.Input)
continue;
dic.Add(p.Name, GetParamValue(cmd.Parameters, p.Name));
}
return dic;
}
/// <summary>
/// 通用执行方法,返回数据集
/// 不支持out参数
/// </summary>
/// <param name="StroreName"></param>
/// <param name="Parame"></param>
/// <returns></returns>
public override DataSet ExceStoreGetDataSet(string StoreName, IList<Parameter> Parame)
{
DbCommand cmd = db.GetStoredProcCommand(StoreName);
AddFillParameter(cmd, Parame);
return ExecuteDataSet(cmd);
}
public override object ExceStoreGetObject(string StoreName, IList<Parameter> Parame)
{
DbCommand cmd = db.GetStoredProcCommand(StoreName);
AddFillParameter(cmd, Parame);
return ExecuteScalar(cmd);
}
#endregion
#region Sql执行
public override DataSet GetData(string Sql)
{
return GetData(Sql,null);
}
public override void ExcuteSql(string Sql)
{
ExcuteSql(Sql, null);
}
public override object GetSingle(string Sql)
{
return GetSingle(Sql, null);
}
public override DataSet GetData(string Sql, IList<Parameter> Parame)
{
DbCommand cmd = db.GetSqlStringCommand(Sql);
AddFillParameter(cmd, Parame);
return ExecuteDataSet(cmd);
}
public override void ExcuteSql(string Sql, IList<Parameter> Parame)
{
DbCommand cmd = db.GetSqlStringCommand(Sql);
AddFillParameter(cmd, Parame);
ExecuteNonQuery(cmd);
}
public override object GetSingle(string Sql, IList<Parameter> Parame)
{
DbCommand cmd = db.GetSqlStringCommand(Sql);
AddFillParameter(cmd, Parame);
return ExecuteScalar(cmd);
}
#endregion
}
通过以上的定义,就可以在修改数据结构时仅仅生成一下实体模型就可以了。