如何通过oracle在c#中使用多个选择查询

Posted

技术标签:

【中文标题】如何通过oracle在c#中使用多个选择查询【英文标题】:How to use multiple select queries inside c# by oracle 【发布时间】:2020-01-07 08:43:35 【问题描述】:

我需要在 C# 代码块中选择多个选择查询。当我使用它时,我收到一个错误,例如无效字符。我知道在查询中使用分号是一个错误,有没有选择多个选择查询的解决方案?

我正在使用Oracle.ManagedDataAccess ExecuteReader 执行查询。

查询:

string query = @"select COUNT(*) POCount from BISC_PO_DETAIL where TXN_DATE = @today;
                             select COUNT(*) from BISC_ASN_DETAIL where TXN_DATE = @today";

我收到此错误

Oracle.ManagedDataAccess.Client.OracleException: 'ORA-00911: 无效 人物

如果我删除了分号,那么错误将变为

语句没有正确终止

【问题讨论】:

【参考方案1】:

由于两个查询都返回标量值,您可以将它们组合为

select (select COUNT(*) from BISC_PO_DETAIL where TXN_DATE = :today) POCount,
       (select COUNT(*) from BISC_ASN_DETAIL where TXN_DATE = :today) ASNCount
  from Dual 

并阅读 POCountASNCount 字段。请注意,Oracle 使用 : 作为参数,如下所示:

string query = 
  @"select (select COUNT(*) from BISC_PO_DETAIL where TXN_DATE = :today) POCount,
           (select COUNT(*) from BISC_ASN_DETAIL where TXN_DATE = :today) ASNCount
      from Dual";

using (OracleCommand q = new OracleCommand(query, conn)) 
  q.Parameters.Add(":today", OracleDbType.Date);

  q.Parameters[":today"].Value = DateTime.Today;

  using (var reader = q.ExecuteReader()) 
    if (reader.Read()) 
      int POCount = Convert.ToInt32(reader["POCount"]);
      int ASNCount = Convert.ToInt32(reader["ASNCount"]);
      ....
    
  

另一种(更一般的)可能性是使用 cursorsNextResult:

string query = 

@"declare
    query1 ref cursor;
    query2 ref cursor;
  begin
    open query1 for select COUNT(*) from BISC_PO_DETAIL where TXN_DATE = :today;

    open query2 for select COUNT(*) from BISC_ASN_DETAIL where TXN_DATE = :today;
  end;";

...

using (var reader = q.ExecuteReader()) 
  int cursorIndex = 0;

  do 
    if (reader.Read()) 
      int value = Convert.ToInt32(reader[0]);

      if (cursorIndex == 0) 
        // value is BISC_PO_DETAIL count
       
      else 
        // value is BISC_ASN_DETAIL count
      
    

    cursorIndex += 1;
  
  while (reader.NextResult());

【讨论】:

【参考方案2】:

使用 beginend 在字符串中使用多个查询

string query = new OracleCommand(@"
        begin
        select COUNT(*) POCount from BISC_PO_DETAIL where TXN_DATE = :today;
      select  COUNT(*) from BISC_ASN_DETAIL where TXN_DATE = :today;
        end;")

【讨论】:

1. :today 而不是 @today 2. 第二个查询 COUNT(*) from BISC_ASN_DETAIL where TXN_DATE = @today 无法编译(您已省略 select 我的错误。用手机回答。在回答中复制上述查询时遗漏了一些东西

以上是关于如何通过oracle在c#中使用多个选择查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用多个 XPath 查询在 c# 中选择单个 XML 节点

Oracle通过带有内部连接和返回n行的子查询的桥表选择查询?

如何通过c#读取oracle数据库中的long类型字段

oracle动态查询通过sql获取游标变量

C#通过OleDb查询Oracle存储过程

如何使用 C# 添加通过卡片内的提示选项显示的自定义选项并在 BOT V4 中使用 C# 在选择单击时触发操作?