2016-04-30 80 views
8

我正在读取.mdb文件(MSAccess 2000格式)中的数据。有些表格的名字中有冒号。如何在名称中冒号的表上运行查询?

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

这是我的代码:

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当我尝试这些表打开查询我得到一个例外。
设置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,我认为它不会。它只是保留参数,所以你可以自己管理它们。 99%肯定。 ;) – GolezTrol

4

我检查其他语言的解决方案。但Johan's answer似乎是正确的,但发布的here也适用于德尔福/访问案例:

使用反斜杠`你的表名周围应允许它被参数检查忽略。

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

这一个也可以结合使用查询字符串中的参数。

+0

我不知道德尔福,但MS Access *从不*使用反引号。表/字段名称与例如空格总是需要[方括号]。 – Andre

+0

@Andre我刚刚在MS Access 2007中创建了一个查询,并在SQL视图中键入了这个查询字符串。它显示没有问题的结果。 – saastn

+0

你说得对(我错了) - 反引号可以用来代替方括号。奇怪。 :)'[Tabelle1:1] .ID,\'Tabelle1:1 \'。\'nix:dings \' FROM [Tabelle1:1];'作品,没有反引号,它没有。 – Andre

相关问题