2012-03-06 32 views
1

oracle 00911エラー(不正な文字)が表示されています。私は誰かが私の理解を助けることを望んでいます。私は私のOracle 11gデータベースにSQL文を実行するには、次のコードを使用していORA 00911 SQL文のwhere句がセミコロンで終了するとエラー?

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); 
     } 
    } 
    ... 

私はそれが正常に動作"Select * from X;"のようなDbCommand.CommandTextプロパティを使用してこの機能を何かを与えるが、この意志"Select * from x where y;"与えられた場合にはoracle 00911の例外をスローします。ただし、セミコロンを削除すると、正常に実行されます。

誰かが、特定の種類の文でのみセミコロンで文を終了すると、不正な文字エラーが発生する理由は誰にも分かりますか?明確にするため

アップデート:私は、エラーの原因とセミコロンをテストするために使用さ

正確なクエリた:このクエリはうまく働いた

SELECT * FROM Machines;

をこのクエリは、ORA 0911を生成エラー: SELECT * FROM Machines WHERE ID = 47;

このクエリは正常に機能しましたが、 SELECT * FROM Machines WHERE ID = 47 < - 一部のプロバイダは、(SELECT COUNT(*)...のような)先行追加のクエリを実行し、および/または何かを追加 - 唯一のセミコロンはまた、使用されているプロバイダはこの動作は使用DBプロバイダに依存Oracle.DataAccess.Client

+0

実行しようとしているクエリを表示できますか? –

+0

それは文字通り 'Select * from X;'であり、もう一つは 'Select * from x where x.foo = 'bar';' – user12345613

+0

'' bar''の引用符は普通の引用符アスキー39)? –

答えて

3

ある

を変更しました(例えば、 ROWIDのように)...プロバイダがこの「内部動作」をどのように実装するかによって、セミコロンが存在するときには奇妙なことが起きる可能性があります... WHEREが存在するかどうかによって、そうでないか...

シナリオあなた(純粋SELECT/UPDATE/DELETE書)のように、私は好奇心から...

を最後にセミコロンを追加しないでくださいと、この問題は決してありませんでした:なぜあなたは最後にセミコロンを持っているのですか?

+0

私は、セミコロンで明示的に文を終了する方が正しいと思った。私はそれを今削除しました。ありがとうございます – user12345613

+0

@ user12345613あなたは歓迎です:-)私はPL/SQL(例えば匿名ブロック)のセミコロンのみを使用しています... – Yahia

+0

@ user12345613助けとなる受け入れられた回答としてマークするのを忘れないでください(http: /meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 – Yahia