Как выполнить запрос к таблице, в имени которой есть двоеточие?

Я читаю данные из .файл 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;

2 ответов


TQuery интерпретирует : если ParamCheck = true.
Set 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


Я проверял решения на других языках. Однако ответ Йохана кажется, правильный, но тот, который опубликован здесь также работает в случае Delphi / Access:

использование backticks ' вокруг вашего tablename должно позволить ему игнорироваться проверкой param.

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

Этот также можно комбинировать с использованием параметров в строке запроса.