2016-04-30 8 views
8

Ich lese Daten aus einer MDB-Datei (MSAccess 2000-Format). Es gibt einige Tabellen, die Doppelpunkte in ihren Namen haben. Ich erhalte eine Ausnahme, wenn ich versuche Abfragen auf diese Tabellen zu öffnen:Wie führe ich eine Abfrage für eine Tabelle mit einem Doppelpunkt im Namen durch?

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

dies ist mein Code:

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; 

Antwort

8

TQuery die :if ParamCheck = true interpretieren.
Setzen Sie ParamCheck:= false und stellen Sie dann SQL.Text ein.

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; 

Jetzt funktioniert es.

coloned Tabelle/Spaltennamen und Parameter
Wenn Sie unbedingt nach unten gehen muß den Pfad der Verwendung der Tabelle/Spaltennamen mit Doppelpunkten in ihnen und will noch params verwendet an anderer Stelle in der Abfrage dann können Sie einen Makro verwenden Kombination um den Namen der Tabelle/Spalte einzugeben.
Dies erfordert jedoch FireDac. Ich empfehle, dass Sie sehr vorsichtig damit sein, denn im Gegensatz zu Parametern sind Makros nicht sicher gegen SQL-Injektion!

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

+0

Vergessen Sie nicht, eventuell zuvor hinzugefügte Parameter zu entfernen. Überprüfen Sie die Eigenschaft 'Parameters'. – GolezTrol

+0

@GolezTrol: Wird 'SQL.Text' nicht automatisch' Parameter' gelöscht? –

+1

Wenn Sie ParamCheck auf false setzen, denke ich, dass dies nicht der Fall ist. Es lässt nur die Parameter, so dass Sie sie selbst verwalten können. 99% sicher. ;) – GolezTrol

4

ich Lösungen in anderen Sprachen zu überprüfen. Allerdings Johan's answer scheint der richtige zu sein, aber die eine gepostete here funktioniert auch in Delphi/Access-Fall:

Backticks `um den Tabellenname erlauben sollte es durch die param Prüfung ignoriert werden.

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

Dieser kann auch mit Parametern in Abfragezeichenfolge kombiniert werden.

+0

Ich weiß nicht über Delphi, aber MS Access * nie * verwendet Backticks. Tabellen-/Feldnamen mit z.B. Leerzeichen brauchen immer [eckige Klammern]. – Andre

+0

@Andre Ich habe gerade eine Abfrage in MS Access 2007 erstellt und diese Abfragezeichenfolge in der SQL-Ansicht eingegeben. Es zeigt das Ergebnis ohne Probleme. – saastn

+0

Sie haben Recht (und ich lag falsch) - Backticks können anstelle von eckigen Klammern verwendet werden. Überraschend. :) 'SELECT [Tabelle1: 1] .ID, \ 'Tabelle1: 1 \'. \ 'Nix: dings \' FROM [Tabelle1: 1]; 'funktioniert, ohne die Backticks nicht. – Andre

Verwandte Themen