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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM