2012-03-06 40 views
1

我得到一個oracle 00911錯誤(非法字符)。我希望有人能幫助我理解。ORA 00911當SQL語句與Where子句結束時出現半冒號錯誤?

我用下面的代碼在My 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

你能顯示你正在執行的查詢嗎? – 2012-03-06 00:58:59

+0

它實際上是一個'Select * from X;'而另一個是'Select * from x where x.foo ='bar';' – user12345613 2012-03-06 01:01:34

+0

你確定''bar''周圍的引號字符是普通引號字符ascii 39)? – 2012-03-06 02:39:08

回答

3

此行爲取決於所使用的數據庫提供商 - 一些供應商進行前期(如SELECT COUNT(*)...)附加查詢和/或添加什麼東西(例如ROWID)...取決於提供者如何實現這種「內部行爲」,當存在分號時它可能會導致一些奇怪的事情......它可能根據WHERE是否存在而有所不同或不...

在情景中像你(純SELECT/UPDATE/DELETE語句)我從來沒有在結尾加上一個分號,從來就沒這個問題...

出於好奇:爲什麼你在分號結尾?

+0

我認爲用分號明確地結束語句似乎更正確。不過,我現在已經將它刪除了。謝謝 – user12345613 2012-03-06 20:11:50

+0

@ user12345613歡迎您:-)我僅在PL/SQL中使用分號(例如在匿名塊中)... – Yahia 2012-03-06 20:15:17

+0

@ user12345613請不要忘記標記爲已接受的答案(請參閱http:///meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 – Yahia 2012-03-06 20:16:35