server使用abp中调用存储过程 sql_ABP中连接已有数据库执行Sql或存储过程

本文介绍了如何在ABP框架的EntityFramework项目中调用存储过程和执行SQL。首先创建ZSWDbContext类,然后在DataModule.cs中设置DbContext不检查数据库一致性。接着定义ISqlExecuter接口并在EntityFramework项目中实现,用于执行SQL和存储过程。最后展示了如何在服务中注入并使用ISqlExecuter来调用存储过程。注意ABP默认开启事务,多个数据库操作可能引发MSDTC错误,可通过设置 `[UnitOfWork(isTransactional: false)]` 来关闭事务。
摘要由CSDN通过智能技术生成

一:在EntityFramework项目中创建类如:ZSWDbContext。

public classZSWDbContext : AbpDbContext

{public ZSWDbContext() : base("ZSWConnectionString")

{//这里设置不会执行//Database.SetInitializer(null);

}}

二:在DataModule.cs类中设置DbContext在项目启动时不检测数据库的一致性。

否则会报The model backing the 'ApplicationDbContext' context has changed since the database was created. Consider using Code First Migrations to update错误。

[DependsOn(typeof(AbpZeroEntityFrameworkModule), typeof(AmoiCoreModule))]public classAmoiDataModule : AbpModule

{public override voidPreInitialize()

{

Database.SetInitializer(new CreateDatabaseIfNotExists());

Database.SetInitializer(null);

Configuration.DefaultNameOrConnectionString= "Default";

}public override voidInitialize()

{

IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());

}

}

三:在Core项目中定义执行Sql的接口:

public interfaceISqlExecuter

{///

///执行给定的命令///

/// 命令字符串

/// 要应用于命令字符串的参数

/// 执行命令后由数据库返回的结果

int Execute(string sql, params object[] parameters);///

///创建一个原始 SQL 查询,该查询将返回给定泛型类型的元素。///

/// 查询所返回对象的类型

/// SQL 查询字符串

/// 要应用于 SQL 查询字符串的参数

///

IQueryable SqlQuery(string sql, params object[] parameters);

}

然后在EntityFramework中实现该接口:

public classSqlExecuter : ISqlExecuter, ITransientDependency

{private readonly IDbContextProvider_dbContextProvider;public SqlExecuter(IDbContextProviderdbContextProvider)

{

_dbContextProvider=dbContextProvider;

}///

///执行给定的命令///

/// 命令字符串

/// 要应用于命令字符串的参数

/// 执行命令后由数据库返回的结果

public int Execute(string sql, params object[] parameters)

{return_dbContextProvider.GetDbContext().Database.ExecuteSqlCommand(sql, parameters);

}///

///创建一个原始 SQL 查询,该查询将返回给定泛型类型的元素。///

/// 查询所返回对象的类型

/// SQL 查询字符串

/// 要应用于 SQL 查询字符串的参数

///

public IQueryable SqlQuery(string sql, params object[] parameters)

{return _dbContextProvider.GetDbContext().Database.SqlQuery(sql, parameters).AsQueryable();

}

}

四:在构造函数中注入:

private readonlyISqlExecuter _sqlExecuter;publicAppService(ISqlExecuter sqlExecuter)

{

_sqlExecuter=sqlExecuter;

}

然后调用存储过程:

const string sql = "dbo.ResourceDataSync @STATION";var list = _sqlExecuter.SqlQuery(sql, new SqlParameter("@STATION", "石家庄站")).ToList();

注意的地方:

ABP默认是开启事务的,如果在Service中同时调用不同的数据库,会出现

服务器×××上的MSDTC不可用解决办法 错误,关闭事务即可解决:

[UnitOfWork(isTransactional: false)]

参考博客:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值