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

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

person saastn    schedule 30.04.2016    source источник


Ответы (2)


TQuery будет интерпретировать : если 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

person Johan    schedule 30.04.2016
comment
Не забудьте удалить любые параметры, которые могли быть добавлены ранее. Проверьте свойство Parameters. - person GolezTrol; 30.04.2016
comment
@GolezTrol: настройка SQL.Text не очищает автоматически Parameters? - person Ken White; 30.04.2016
comment
Если вы установите для ParamCheck значение false, я думаю, что это не так. Он просто оставляет параметры в покое, чтобы вы могли управлять ими самостоятельно. 99% уверен. ;) - person GolezTrol; 30.04.2016

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

Использование обратных кавычек ` вокруг вашего имени таблицы должно позволять игнорировать его при проверке параметров.

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

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

person saastn    schedule 30.04.2016
comment
Я не знаю о Delphi, но MS Access никогда не использует обратные кавычки. Имена таблиц/полей, например. пробелы всегда нужны [квадратные скобки]. - person Andre; 01.05.2016
comment
@Andre Я только что создал запрос в MS Access 2007 и набрал эту строку запроса в представлении SQL. Результат показывает без проблем. - person saastn; 01.05.2016
comment
Вы правы (а я ошибался) - вместо квадратных скобок можно использовать обратные кавычки. Удивительно. :) SELECT [Tabelle1:1].ID, `Tabelle1:1`.`nix:dings` FROM [Tabelle1:1]; работает, без кавычек - нет. - person Andre; 01.05.2016
comment
Хороший. Я предполагаю, что особые случаи TQuery - это обратные кавычки, но не особый случай [. - person Johan; 03.05.2016