ABP中连接已有数据库执行Sql或存储过程

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

 public class ZSWDbContext : AbpDbContext
    {
        public ZSWDbContext() : base("ZSWConnectionString")
        {
            //这里设置不会执行
            //Database.SetInitializer<ZSWDbContext>(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 class AmoiDataModule : AbpModule
    {
        public override void PreInitialize()
        {
            Database.SetInitializer(new CreateDatabaseIfNotExists<AmoiDbContext>());
            Database.SetInitializer<ZSWDbContext>(null);
            Configuration.DefaultNameOrConnectionString = "Default";
        }

        public override void Initialize()
        {
            IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
        }
    }

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

 public interface ISqlExecuter
    {
        /// <summary>
        /// 执行给定的命令
        /// </summary>
        /// <param name="sql">命令字符串</param>
        /// <param name="parameters">要应用于命令字符串的参数</param>
        /// <returns>执行命令后由数据库返回的结果</returns>
        int Execute(string sql, params object[] parameters);

        /// <summary>
        /// 创建一个原始 SQL 查询,该查询将返回给定泛型类型的元素。
        /// </summary>
        /// <typeparam name="T">查询所返回对象的类型</typeparam>
        /// <param name="sql">SQL 查询字符串</param>
        /// <param name="parameters">要应用于 SQL 查询字符串的参数</param>
        /// <returns></returns>
        IQueryable<T> SqlQuery<T>(string sql, params object[] parameters);
    }

然后在EntityFramework中实现该接口:

public class SqlExecuter : ISqlExecuter, ITransientDependency
    {
        private readonly IDbContextProvider<ZSWDbContext> _dbContextProvider;

        public SqlExecuter(IDbContextProvider<ZSWDbContext> dbContextProvider)
        {
            _dbContextProvider = dbContextProvider;
        }

        /// <summary>
        /// 执行给定的命令
        /// </summary>
        /// <param name="sql">命令字符串</param>
        /// <param name="parameters">要应用于命令字符串的参数</param>
        /// <returns>执行命令后由数据库返回的结果</returns>
        public int Execute(string sql, params object[] parameters)
        {
            return _dbContextProvider.GetDbContext().Database.ExecuteSqlCommand(sql, parameters);
        }

        /// <summary>
        /// 创建一个原始 SQL 查询,该查询将返回给定泛型类型的元素。
        /// </summary>
        /// <typeparam name="T">查询所返回对象的类型</typeparam>
        /// <param name="sql">SQL 查询字符串</param>
        /// <param name="parameters">要应用于 SQL 查询字符串的参数</param>
        /// <returns></returns>
        public IQueryable<T> SqlQuery<T>(string sql, params object[] parameters)
        {
            return _dbContextProvider.GetDbContext().Database.SqlQuery<T>(sql, parameters).AsQueryable();
        }
    }

四:在构造函数中注入:

 private readonly ISqlExecuter _sqlExecuter;
    public AppService(ISqlExecuter sqlExecuter)
    {
        _sqlExecuter = sqlExecuter;
    }

然后调用存储过程:

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

注意的地方:

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

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

[UnitOfWork(isTransactional: false)]

 

参考博客:

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

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

 

转载于:https://www.cnblogs.com/kennyliu/p/8985936.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将ABP2数据库的数据复制到ABP2_HIS数据库,可以使用以下步骤: 1. 创建ABP2_HIS数据库,并在其创建与ABP2数据库相同的表结构。 2. 使用SQL语句将ABP2数据库的数据导出为一个SQL脚本。 3. 修改该SQL脚本数据库名称为ABP2_HIS,并保存该脚本。 4. 在ABP2_HIS数据库运行该SQL脚本,将ABP2数据库的数据复制到ABP2_HIS数据库。 下面是具体的步骤: 1. 创建ABP2_HIS数据库,并在其创建与ABP2数据库相同的表结构。 可以使用以下SQL语句创建ABP2_HIS数据库: ``` CREATE DATABASE ABP2_HIS; ``` 在ABP2_HIS数据库创建与ABP2数据库相同的表结构,可以使用以下命令: ``` mysqldump -u root -p ABP2 > ABP2.sql ``` 2. 使用SQL语句将ABP2数据库的数据导出为一个SQL脚本。 在命令行窗口输入以下命令: ``` mysqldump -u root -p ABP2 > ABP2.sql ``` 该命令将ABP2数据库的数据导出为一个名为ABP2.sqlSQL脚本。 3. 修改该SQL脚本数据库名称为ABP2_HIS,并保存该脚本。 打开ABP2.sql文件,并用文本编辑器将其所有的“ABP2”替换为“ABP2_HIS”。 4. 在ABP2_HIS数据库运行该SQL脚本,将ABP2数据库的数据复制到ABP2_HIS数据库。 在命令行窗口输入以下命令: ``` mysql -u root -p ABP2_HIS < ABP2.sql ``` 该命令将ABP2.sql文件SQL语句在ABP2_HIS数据库执行,从而将ABP2数据库的数据复制到ABP2_HIS数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值