我正在从.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;
答案 0 :(得分: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;
现在可行。
组合克隆的表/列名称和参数
如果您绝对必须沿着使用冒号的表/列名称的路径,并且仍然想在查询中的其他地方使用params,那么您可以使用宏来填充表/列名称。
这需要FireDac。
我建议你对此非常小心,因为与参数不同,宏对SQL注入是不安全的!
请参阅:http://docwiki.embarcadero.com/CodeExamples/Seattle/en/FireDAC.TFDQuery.Macros_Sample
答案 1 :(得分:4)
我正在检查其他语言的解决方案。但是Johan's answer似乎是正确的,但发布的here也适用于Delphi / Access案例:
在tablename周围使用反引号`应该允许param检查忽略它。
Query.SQL.Text := 'select * from `Table1:1`';
这个也可以与查询字符串中的参数结合使用。