ABP框架 sql语句(转载)
2023-09-11 14:21:28 时间
ABP.Core实现SQL语句仓储,支持EF.Core兼容的数据库
ISqlRepository.cs代码
public interface ISqlRepository : IRepository { /// <summary> /// 执行给定的命令 /// </summary> /// <param name="sql">命令字符串</param> /// <param name="parameters">要应用于命令字符串的参数</param> /// <returns>执行命令后由数据库返回的结果</returns> Task<int> Execute(string sql, params object[] parameters); /// <summary> /// 执行语句返回dataset,注意参数用@p0、@p1、@p3...以此类推,要按照顺序 /// </summary> /// <param name="sql">sql语句</param> /// <param name="parameters">sql参数</param> /// <returns>dataset</returns> Task<DataTable> ExecuteDataTable(string sql, params object[] parameters); }
SqlRepository.cs代码
public class SqlRepository : ISqlRepository, ITransientDependency { private readonly IDbContextProvider<SmartDbContext> _dbContextProvider; public SqlRepository(IDbContextProvider<SmartDbContext> dbContextProvider) { _dbContextProvider = dbContextProvider; } /// <summary> /// 执行给定的命令 /// </summary> /// <param name="sql">命令字符串</param> /// <param name="parameters">要应用于命令字符串的参数</param> /// <returns>执行命令后由数据库返回的结果</returns> public async Task<int> Execute(string sql, params object[] parameters) { return await _dbContextProvider.GetDbContext().Database.ExecuteSqlCommandAsync(sql, parameters); } public async Task<DataTable> ExecuteDataTable(string sql, params object[] parameters) { return await Task.Run(() => { var db = _dbContextProvider.GetDbContext().Database; var conn = db.GetDbConnection(); if (conn.State != ConnectionState.Open) conn.Open(); DataTable dt = new DataTable(); RawSqlCommand rawSqlCommand = db.GetService<IRawSqlCommandBuilder>().Build(sql, parameters); RelationalDataReader query = rawSqlCommand.RelationalCommand.ExecuteReader(db.GetService<IRelationalConnection>(), parameterValues: rawSqlCommand.ParameterValues); DbDataReader dr = query.DbDataReader; int fieldCount = dr.FieldCount; //获取schema并填充第一行数据 if (dr.Read()) { for (int i = 0; i < fieldCount; i++) { string colName = dr.GetName(i); dt.Columns.Add(colName, dr.GetFieldType(i)); } DataRow newrow = dt.NewRow(); for (int i = 0; i < fieldCount; i++) { newrow[i] = dr[i]; } dt.Rows.Add(newrow); } //填充后续数据 while (dr.Read()) { DataRow newrow = dt.NewRow(); for (int i = 0; i < fieldCount; i++) { newrow[i] = dr[i]; } dt.Rows.Add(newrow); } dt.AcceptChanges(); return
思路:
1 ef可以直接写sql,然后试着调用这个方法。
2 ORM从EF切换到ADO或NHibernate,然后试着调用这个方法。
3 若ORM无法切换到原生ADO,基础设施层加一个原生ADO层,然后(应用服务层)试着调用这个方法。
相关文章
- sql isdate判断时间函数(小技巧)
- 工作总结 1 sql写法 insert into select from 2 vs中 obj文件和bin文件 3 npoi 模板copy CopySheet 最好先全部Copy完后 再根据生成sheet写数据 4 sheet.CopyRow(rowsindex, rowsindex + x); 5 npoi 复制模板如果出现单元格显示问题
- sql的执行流程
- 第七十八章 SQL命令 TUNE TABLE
- 第四十二章 SQL函数 DATEADD
- MyBatis的动态SQL
- gen_grant_exec.sql
- SQL教程大全之你应该记住的 10 个 SQL 查询
- sql server 小技巧(5) Sql server 获取指定字符后的所有字符 - 去掉指定字符前的所有字符
- 【转发】C# Entity Framework框架 Code First 模式 连接 SQLAccessSQLite (组合式)
- sql server 数据分析优化实战(一)——SQL语句优化
- SQL Server中的SQL语句优化与效率问题
- 【漏洞复现】CVE-2022–21661 WordPress核心框架WP_Query SQL注入漏洞原理分析与复现
- mybatis或hibernate框架连接数据库报错:java.sql.SQLException: Access denied for user 'Administrator'@'localhost' (using password: YES)
- SQL INSERT INTO & UPDATE & DELETE
- 怎样使用oracle 的DBMS_SQLTUNE package 来执行 Sql Tuning Advisor 进行sql 自己主动调优
- SQL Server SSPI handshake failed报错,sql server修改windows账户密码的影响,sql server订阅发布客户端访问一直报错
- (4.52)解决sql server动态SQL中对表字段操作时需要频繁 ISNULL的问题
- sql server该账户当前被锁定,所以用户'sa'登录失败。系统管理员无法将该账户解锁。(Microsoft SQL Server,错误:18486),登录错误18456
- sql server存储引擎启动错误(SQL Server could not spawn FRunCM thread)
- 【sql server复制】教你使用SQL SERVER复制
- 【sql server镜像】SQL SERVER 基于数据库镜像的主从同步(数据库镜像实践汇总)
- SQL CHECK sql server免费监控单实例工具
- SQL Server Profiler 跟踪某个数据库某张表sql语句
- sql server 变量声明、设置、使用、输出
- sql-常见的SQL优化
- SQL server 2016 安装步骤
- mysql 常用sql语句