我一直在使用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 )