ORA 00911错误当SQL语句与Where子句结束半结肠?

时间:2012-03-06 00:55:36

标签: c# oracle exception

我收到了oracle 00911错误(非法字符)。我希望有人能帮助我理解。

我正在使用以下代码在我的oracle 11g数据库上执行sql语句:

private DataTable ExecuteQuery(DbCommand query) {
    DataTable result = new DataTable();
    using (DbConnection con = CreateConnection()) {
    try {
       query.Connection = con;
       query.CommandTimeout = int.MaxValue; // don't impose a timeout
       using (DbDataAdapter dataAdapter = factory.CreateDataAdapter()) {
           dataAdapter.SelectCommand = query;
           dataAdapter.Fill(result);
       }
    }
    ...

如果我给这个函数赋予像DbCommand.CommandText这样的"Select * from X;"属性它可以正常工作,但是给定"Select * from x where y;"这将抛出一个oracle 00911异常。但是,如果我删除分号,则执行正常。

有没有人知道为什么只会在某些类型的语句中以分号结束语句会抛出非法字符错误?

为清晰起见而更新:

我用来测试半冒号导致错误的确切查询是:

这个查询运行正常: SELECT * FROM Machines;

此查询生成了ORA 0911错误: SELECT * FROM Machines WHERE ID = 47;

虽然此查询工作正常: SELECT * FROM Machines WHERE ID = 47< - 只有半结肠改变了

使用的提供商也是Oracle.DataAccess.Client

1 个答案:

答案 0 :(得分:3)

此行为取决于所使用的数据库提供程序 - 某些提供程序预先执行其他查询(如SELECT COUNT(*)...)和/或向查询添加内容(例如ROWID)...取决于如果提供者实现这种“内部行为”,当分号出现时可能会导致一些奇怪的事情......根据WHERE是否存在,它甚至可能表现不同......

在像您这样的场景中(纯SELECT / UPDATE / DELETE声明)我绝不会在结尾处添加分号,而且从来没有遇到过这个问题......

出于好奇:你为什么最后有分号?