我收到了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
答案 0 :(得分:3)
此行为取决于所使用的数据库提供程序 - 某些提供程序预先执行其他查询(如SELECT COUNT(*)...
)和/或向查询添加内容(例如ROWID
)...取决于如果提供者实现这种“内部行为”,当分号出现时可能会导致一些奇怪的事情......根据WHERE
是否存在,它甚至可能表现不同......
在像您这样的场景中(纯SELECT
/ UPDATE
/ DELETE
声明)我绝不会在结尾处添加分号,而且从来没有遇到过这个问题......
出于好奇:你为什么最后有分号?