.NET(C#) Dapper Oracle(ODP.NET)或SQL Server 执行多条查询(select)语句的方法代码
2022/3/29 2:22:36
本文主要是介绍.NET(C#) Dapper Oracle(ODP.NET)或SQL Server 执行多条查询(select)语句的方法代码,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本文主要介绍.NET(C#) Dapper Oracle或SQL server中,在一次数据库连接中,执行多条select查询语句,并且获取到相对应的查询结果。
1、查询SQL语名
Dapper似乎只是直接将SQL命令传递给ADO.NET以及正在执行该命令的任何db提供程序。在示例的语法中,每个命令由一个换行符分隔,SQL Server将其解释为针对数据库运行的多个查询,并将运行每个查询并将结果返回到单独的输出中。
1)SQL Server查询句
var sql = @" select * from Customers where CustomerId = @id select * from Orders where CustomerId = @id select * from Returns where CustomerId = @id";
2)Oracle查询句
Oracle不能识别多个查询;它认为SQL命令格式不正确,并返回ORA-00933消息。解决方案是使用游标并在DynamicParameters集合中返回输出。
var sql = "BEGIN OPEN :rslt1 FOR SELECT * FROM customers WHERE customerid = :id; " + "OPEN :rslt2 FOR SELECT * FROM orders WHERE customerid = :id; " + "OPEN :rslt3 FOR SELECT * FROM returns Where customerid = :id; " + "END;";
2、执行多条查询(select)语句实现代码
将结果集返回到游标参数,所以需要使用IDynamicParameters
集合来指定命令的参数。 要添加额外的皱纹,Dapper中的常规DynamicParameters.Add()
方法使用System.Data.DbType
作为可选的dbType
参数,但查询的游标参数必须是Oracle.ManagedDataAccess.Client.OracleDbType.RefCursor
类型,为了解决这个问题,创建了IDynamicParameters
接口的自定义实现:
using Dapper; using Oracle.ManagedDataAccess.Client; using System.Data; public class OracleDynamicParameters : SqlMapper.IDynamicParameters { private readonly DynamicParameters dynamicParameters = new DynamicParameters(); private readonly List<OracleParameter> oracleParameters = new List<OracleParameter>(); public void Add(string name, OracleDbType oracleDbType, ParameterDirection direction, object value = null, int? size = null) { OracleParameter oracleParameter; if (size.HasValue) { oracleParameter = new OracleParameter(name, oracleDbType, size.Value, value, direction); } else { oracleParameter = new OracleParameter(name, oracleDbType, value, direction); } oracleParameters.Add(oracleParameter); } public void Add(string name, OracleDbType oracleDbType, ParameterDirection direction) { var oracleParameter = new OracleParameter(name, oracleDbType, direction); oracleParameters.Add(oracleParameter); } public void AddParameters(IDbCommand command, SqlMapper.Identity identity) { ((SqlMapper.IDynamicParameters)dynamicParameters).AddParameters(command, identity); var oracleCommand = command as OracleCommand; if (oracleCommand != null) { oracleCommand.Parameters.AddRange(oracleParameters.ToArray()); } } }
多条查询的实现代码:
using Dapper; using Oracle.ManagedDataAccess.Client; using System.Data; int selectedId = 1; var sql = "BEGIN OPEN :rslt1 FOR SELECT * FROM customers WHERE customerid = :id; " + "OPEN :rslt2 FOR SELECT * FROM orders WHERE customerid = :id; " + "OPEN :rslt3 FOR SELECT * FROM returns Where customerid = :id; " + "END;"; OracleDynamicParameters dynParams = new OracleDynamicParameters(); dynParams.Add(":rslt1", OracleDbType.RefCursor, ParameterDirection.Output); dynParams.Add(":rslt2", OracleDbType.RefCursor, ParameterDirection.Output); dynParams.Add(":rslt3", OracleDbType.RefCursor, ParameterDirection.Output); dynParams.Add(":id", OracleDbType.Int32, ParameterDirection.Input, selectedId); using (IDbConnection dbConn = new OracleConnection("<conn string here>")) { dbConn.Open(); var multi = dbConn.QueryMultiple(sql, param: dynParams); var customer = multi.Read<Customer>().Single(); var orders = multi.Read<Order>().ToList(); var returns = multi.Read<Return>().ToList(); ... dbConn.Close(); }
参考文档:https://stackoverflow.com/questions/18772781/using-dapper-querymultiple-in-oracle
这篇关于.NET(C#) Dapper Oracle(ODP.NET)或SQL Server 执行多条查询(select)语句的方法代码的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#