当我给它无效的SQL时,如何让Oracle返回错误?

时间:2015-12-11 20:14:48

标签: c# oracle ado.net odp.net-managed

我一直在使用Oracle ODP.NET, Managed Driver从C#发出查询。

我写的很多查询都是永远来返回任何数据;就像它忽略了我的行限制条款:

SELECT TOP 10 * 
FROM Customers

SELECT * 
FROM Customers
FETCH FIRST 10 ROWS ONLY

就像Oracle忽略了我的 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对象( bizzarly )没有CommandTimeout;它默认为永远运行。一旦我将其更改为更合理的30秒,我就会看到错误消息:

  

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

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

Bonus Chatter

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

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

Microsoft已经创建了一个Oracle驱动程序,它包含在.NET Framework中。 But that driver is deprecated不再在.NET 4.5中运行需要安装完整的Oracle客户端软件版本8.1.7或更高版本( System.Data.OracleClient

0 个答案:

没有答案