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

  1. public class ZSWDbContext : AbpDbContext
  2. {
  3. public ZSWDbContext() : base("ZSWConnectionString")
  4. {
  5. //这里设置不会执行
  6. //Database.SetInitializer<ZSWDbContext>(null);
  7. }
  8. }

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

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

  1. [DependsOn(typeof(AbpZeroEntityFrameworkModule), typeof(AmoiCoreModule))]
  2. public class AmoiDataModule : AbpModule
  3. {
  4. public override void PreInitialize()
  5. {
  6. Database.SetInitializer(new CreateDatabaseIfNotExists<AmoiDbContext>());
  7. Database.SetInitializer<ZSWDbContext>(null);
  8. Configuration.DefaultNameOrConnectionString = "Default";
  9. }
  10.  
  11. public override void Initialize()
  12. {
  13. IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
  14. }
  15. }

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

  1. public interface ISqlExecuter
  2. {
  3. /// <summary>
  4. /// 执行给定的命令
  5. /// </summary>
  6. /// <param name="sql">命令字符串</param>
  7. /// <param name="parameters">要应用于命令字符串的参数</param>
  8. /// <returns>执行命令后由数据库返回的结果</returns>
  9. int Execute(string sql, params object[] parameters);
  10.  
  11. /// <summary>
  12. /// 创建一个原始 SQL 查询,该查询将返回给定泛型类型的元素。
  13. /// </summary>
  14. /// <typeparam name="T">查询所返回对象的类型</typeparam>
  15. /// <param name="sql">SQL 查询字符串</param>
  16. /// <param name="parameters">要应用于 SQL 查询字符串的参数</param>
  17. /// <returns></returns>
  18. IQueryable<T> SqlQuery<T>(string sql, params object[] parameters);
  19. }

然后在EntityFramework中实现该接口:

  1. public class SqlExecuter : ISqlExecuter, ITransientDependency
  2. {
  3. private readonly IDbContextProvider<ZSWDbContext> _dbContextProvider;
  4.  
  5. public SqlExecuter(IDbContextProvider<ZSWDbContext> dbContextProvider)
  6. {
  7. _dbContextProvider = dbContextProvider;
  8. }
  9.  
  10. /// <summary>
  11. /// 执行给定的命令
  12. /// </summary>
  13. /// <param name="sql">命令字符串</param>
  14. /// <param name="parameters">要应用于命令字符串的参数</param>
  15. /// <returns>执行命令后由数据库返回的结果</returns>
  16. public int Execute(string sql, params object[] parameters)
  17. {
  18. return _dbContextProvider.GetDbContext().Database.ExecuteSqlCommand(sql, parameters);
  19. }
  20.  
  21. /// <summary>
  22. /// 创建一个原始 SQL 查询,该查询将返回给定泛型类型的元素。
  23. /// </summary>
  24. /// <typeparam name="T">查询所返回对象的类型</typeparam>
  25. /// <param name="sql">SQL 查询字符串</param>
  26. /// <param name="parameters">要应用于 SQL 查询字符串的参数</param>
  27. /// <returns></returns>
  28. public IQueryable<T> SqlQuery<T>(string sql, params object[] parameters)
  29. {
  30. return _dbContextProvider.GetDbContext().Database.SqlQuery<T>(sql, parameters).AsQueryable();
  31. }
  32. }

四:在构造函数中注入:

  1. private readonly ISqlExecuter _sqlExecuter;
  2. public AppService(ISqlExecuter sqlExecuter)
  3. {
  4. _sqlExecuter = sqlExecuter;
  5. }

然后调用存储过程:

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

注意的地方:

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

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

  1. [UnitOfWork(isTransactional: false)]

参考博客:

https://www.cnblogs.com/farb/p/sqlqueryinef.html

https://www.cnblogs.com/chiakiyu/p/5590211.html

ABP中连接已有数据库执行Sql或存储过程的更多相关文章

  1. 使用Python批量修改数据库执行Sql文件

    由于上篇文章中批量修改了文件,有的时候数据库也需要批量修改一下,之前的做法是使用宝塔的phpMyAdmin导出一个已经修改好了的sql文件,然后依次去其他数据库里导入,效率不说极低,也算低了,且都是些 ...

  2. Linq to Entity中连接两个数据库时要注意的问题

    Linq to Entity中连接两个数据库时要注意的问题 今天大学同学问了我一个问题,Linq to Entity中连接两个数据库时,报错“指定的 LINQ 表达式包含对与不同上下文关联的查询的引用 ...

  3. hibernate4中oracle,sqlserver,mysql数据库的sql方言配置(SQL Dialects)

    hibernate4中oracle,mysql,sqlserver数据库的sql方言配置(SQL Dialects) 数据库类型 Hibernate sql方言 DB2 org.hibernate.d ...

  4. Python连接MySQL数据库执行sql语句时的参数问题

    由于工作需要,今天写了一个Python小脚本,其中需要连接MySQL数据库,在执行sql命令时需要传递参数,结果出问题了.在网上查了一下,发现有以下几种方式传递参数: 一.直接把sql查询语句完整写入 ...

  5. 数据库执行sql报错Got a packet bigger than 'max_allowed_packet' bytes及重启mysql

    准备在mysql上使用数据库A,但mysql5经过重装后,上面的数据库已丢失,只得通过之前备份的A.sql重新生成数据库A. 1.执行sql报错 在执行A.sql的过程中,出现如下错误:Got a p ...

  6. 如何用VS EF连接 Mysql,以及执行SQL语句 和存储过程?

    VS2013, MySQL5.7.18 , MySQL5.7.14 执行SQL语句: ztp_user z = new ztp_user(); object[] obj = new object[] ...

  7. django同一个项目中连接多个数据库

    一.场景与思路 同一个项目中需要连接多个数据库. 二.代码 代码中主要是三个部分,settings.models以及自己写的一个类. 1.自己写的文件:database_app_router.py  ...

  8. [Pyhton]连接MSSQL实例并执行SQL语句

    运行环境: 服务器端: MSSQL 2014 Server 2012 R2 程序端: Python 3.7.4 MacOS 10.14.6 CentOS Linux release 7.7.1908 ...

  9. 4.MySQL连接并选择数据库(SQL & C)

    在连接了MySQL数据库之后,可以通过SQL命令或者C.PHP.JAVA等程序来指定需要操作的数据库.这里主要介绍SQL命令和相应的C程序. 首先创建用户rick(赋予所有权限) mysql> ...

随机推荐

  1. Apache高级配置

    认证授权和访问控制 ip访问控制: 目录控制语句以开头:以结束. AllowOverride None:不允许覆盖,即不允许从根目录向子目录覆盖.即默认情况下拒绝从根目录下向子目录访 问,如果要看根目 ...

  2. JMeter 十五:函数以及变量

    参考:http://jmeter.apache.org/usermanual/functions.html 函数以及参数引用 JMeter 函数引用方式如下: ${__functionName(var ...

  3. xcode arc 下使用 block警告 Capturing [an object] strongly in this block is likely to lead to a retain cycle” in ARC-enabled code

    xcode arc 下使用 block警告 Capturing [an object] strongly in this block is likely to lead to a retain cyc ...

  4. 【转】spring MVC入门示例(hello world demo)

    部分内容来自网络:<第二章 Spring MVC入门 —— 跟开涛学SpringMVC > 1. Spring MVC介绍 Spring Web MVC是一种基于Java的实现了Web M ...

  5. 说说iDempiere = OSGi + ADempiere的OSGi

    怀揣着为中小企业量身定做一整套开源软件解决方案的梦想开始了一个网站的搭建.http://osssme.org/ 我对iDempiere还完全摸不着头脑,正好在学习之际,应erp100的@纵横四海 邀请 ...

  6. glassfish3操作命令

    glassfish3操作命令   启动:C:\Java\glassfish\bin>asadmin start-domain domain1 停止:C:\Java\glassfish\bin&g ...

  7. unity, access sprite of UGUI Image

    首先需要using UnityEngine.UI; 然后调用下面语句就不报错了: Image.GetComponent<Image>().sprite 参考:http://answers. ...

  8. unity prefab使用原则

    prefab可无限apply: 如果把一个模块做成了prefab,这个prefab可能在同一个scene中添加多个,甚至添加到了多个scene中.设所有这些实例为instance(1),instanc ...

  9. iOS开发多线程篇 08 —GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  10. jdk8 StreamApi

    List<User> userList=new ArrayList<>(); userList.add(User.builder().age().name()).build() ...