2016-04-30 15 views
8

.mdbファイル(MSAccess 2000形式)からデータを読み込んでいます。名前にコロンが付いたテーブルがいくつかあります。私はこれらのテーブルにクエリを開こうとすると、私は例外を取得しています:名前にコロンを持つテーブルでクエリを実行するにはどうすればよいですか?

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Query: TADOQuery; 
begin 
    Query := TADOQuery.Create(nil); 
    Query.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;'+ 
    'Data Source=DB.mdb;Persist Security Info=False'; 
    Query.SQL.Text := 'select * from [Table1:1]'; 
    try 
    Query.Open; 
    finally 
    Query.Free; 
    end; 
end; 

答えて

8

TQuery:if ParamCheck = trueを解釈します:

EOleException with message 'Parameter object is improperly defined. Inconsistent or incomplete information was provided'. 

が、これは私のコードです。
ParamCheck:= falseを設定し、SQL.Textを設定します。

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Query: TADOQuery; 
begin 
    Query := TADOQuery.Create(nil); 
    Query.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;'+ 
    'Data Source=DB.mdb;Persist Security Info=False'; 
    Query.ParamCheck:= false; 
    Query.SQL.Text := 'select * from [Table1:1]'; 
    try 
    Query.Open; 
    finally 
    Query.Free; 
    end; 
end; 

これで機能します。

colonedテーブル/カラム名を組み合わせて、あなたは絶対に彼らにコロンを持つテーブル/列名を使用しての道を行かなければならないし、まだ、あなたがマクロを使用することができ、クエリ内の他の場所でのparamsを使用したい場合は
パラメータテーブル/列名を入力します。
これにはFireDacが必要です。 このようなパラメータマクロとは違って、SQLインジェクションに対して安全ではないので、これに非常に注意することをお勧めします。

参照:http://docwiki.embarcadero.com/CodeExamples/Seattle/en/FireDAC.TFDQuery.Macros_Sample

+0

以前に追加されたパラメータを削除することを忘れないでください。 'Parameters'プロパティを確認してください。 – GolezTrol

+0

@GolezTrol: 'SQL.Text'が自動的に' Parameters'をクリアしませんか? –

+1

ParamCheckをfalseに設定した場合、ParamCheckはそうでないと思います。あなた自身で管理できるように、パラメータだけを残すだけです。 99%は確かです。 ;) – GolezTrol

4

私は他の言語でのソリューションをチェックしていました。しかしJohan's answerは正しいもののようですが、一つはhereもデルファイ/アクセスケースで動作掲載:あなたのテーブル名の周り `バッククォートを使用して

は、それがのparamチェックで無視されるようにする必要があります。

Query.SQL.Text := 'select * from `Table1:1`'; 

これは、クエリ文字列のパラメータを使用して組み合わせることもできます。

+0

私はDelphiについて知りませんが、MS Access *はバッククックを使用しません。例えばテーブル/フィールド名。スペースは常に必要です[角括弧]。 – Andre

+0

@Andre MS Access 2007内でクエリを作成し、このクエリ文字列をSQLビューで入力しました。結果は問題なく表示されます。 – saastn

+0

あなたは正しい(と私は間違っていた) - バッククォートは大括弧の代わりに使用することができます。驚くべきことだ。 :) [Tabelle1:1] .ID、\ 'Tabelle1:1 \'。\ 'nix:dings \' FROM [Tabelle1:1];はバッククォートなしで動作します。 – Andre

関連する問題