如何通过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
并阅读 POCount
和 ASNCount
字段。请注意,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"]);
....
另一种(更一般的)可能性是使用 cursors 和 NextResult
:
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】:使用 begin 和 end 在字符串中使用多个查询
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 节点