1

我一直在使用Oracle ODP.NET,托管驱动程序从 C# 发出查询。

我写的很多查询都需要很长时间才能返回任何数据;就像它忽略了我的行限制条款:

SELECT TOP 10 * 
FROM Customers

或者

SELECT * 
FROM Customers
FETCH FIRST 10 ROWS ONLY

就像甲骨文忽略了我的10行限制,并开始返回所有内容 - 因为返回需要很长时间。最终我意识到并不是查询忙于返回大量数据;是查询SQL无效。

当您向 Oracle 发出无效 SQL 时,它不会因错误而失败。

  • select top 10 * from customers;
  • select 'Hello, world!';
  • select sysdate from duel;
  • select sysdate fro;
  • Ceilings make pie and markers drive the ocean with their feet

Oracle 将坐在那里等待命令超时到期。

IDbCommand cmd = connection.CreateCommand();
cmd.CommandText = "Ceilings make pie and markers drive the ocean with their feet";

IDataReader rdr = cmd.ExecuteReader(); //<--will wait forever

while (rdr.Read()) 
{
   //...
}

我最终意识到该Oracle.ManagedDataAccess.Client.OracleCommand对象(奇怪)没有CommandTimeout;它默认为永远运行。一旦我将其更改为更合理的 30 秒,我开始看到错误消息:

ORA-12537: 网络会话: 文件结束

Oracle ODP.NET、托管驱动程序或连接字符串中是否有一个选项,或者OracleCommand如果我的 SQL 语句中有错误,则告诉服务器抛出错误?

奖金喋喋不休

Oracle 为 ADO.net 提供了两个数据库驱动程序

  • 一个是 ADO.net 托管包装器,围绕您必须已经安装的 100MB 本机数据库驱动程序 ( Oracle.DataAccess )
  • 另一个是独立的 3.8 MB 驱动程序,用纯托管代码编写,没有其他依赖项(Oracle.ManagedDataAccess

Microsoft 创建了一个 Oracle 驱动程序,该驱动程序包含在 .NET Framework 中。但是该驱动程序已被弃用,并且在 .NET 4.5 中不再起作用需要安装完整的 Oracle 客户端软件版本 8.1.7 或更高版本 ( System.Data.OracleClient )

4

0 回答 0