【问题标题】:How to use multiple select queries inside c# by oracle如何通过oracle在c#中使用多个选择查询
【发布时间】: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: 无效 人物

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

语句没有正确终止

【问题讨论】:

    标签: c# sql oracle


    【解决方案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
      • 我的错误。用手机回答。在回答中复制上述查询时遗漏了一些东西
      猜你喜欢
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 2018-04-26
      • 2021-01-05
      • 2021-09-16
      • 1970-01-01
      相关资源
      最近更新 更多