【问题标题】:How to run a query on a table that has colon in its name?如何在名称中包含冒号的表上运行查询?
【发布时间】:2016-04-30 16:10:42
【问题描述】:

我正在从 .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;

【问题讨论】:

    标签: delphi ms-access query-string query-parameters


    【解决方案1】:

    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;
    

    现在可以了。

    组合冒号的表/列名称和参数
    如果您绝对必须沿着使用带有冒号的表/列名称的路径,并且仍然想在查询中的其他地方使用参数,那么您可以使用宏来填写表/列名称。
    不过,这需要 FireDac。 我建议您对此非常小心,因为与参数不同,宏对 SQL 注入并不安全!

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

    【讨论】:

    • 不要忘记删除之前可能添加的任何参数。检查Parameters 属性。
    • @GolezTrol:设置SQL.Text不会自动清除Parameters吗?
    • 如果您将 ParamCheck 设置为 false,我认为不会。它只留下参数,因此您可以自己管理它们。 99% 确定。 ;)
    【解决方案2】:

    我正在检查其他语言的解决方案。然而Johan's answer 似乎是正确的,但发布的here 也适用于Delphi/Access 案例:

    在你的表名周围使用反引号 ` 应该允许它被参数检查忽略。

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

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

    【讨论】:

    • 我不了解 Delphi,但 MS Access 从不 使用反引号。表/字段名称,例如空格总是需要[方括号]。
    • @Andre 我刚刚在 MS Access 2007 中创建了一个查询,并在 SQL 视图中输入了这个查询字符串。结果显示没有问题。
    • 你是对的(我错了)——反引号可以用来代替方括号。奇怪。 :) SELECT [Tabelle1:1].ID, `Tabelle1:1`.`nix:dings` FROM [Tabelle1:1]; 有效,没有反引号则无效。
    • 不错的一个。我猜 TQuery 是反引号的特殊情况,但不是 [ 的特殊情况。
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    相关资源
    最近更新 更多