Получить имя таблицы, из которой TField

Я использую TDataSet, где свойство CommandText установлено для запроса SQL. Я также сделал следующую функцию, которая создает часть SQL-запроса на основе полей TDataSet. Это однако неполно. Как вы можете видеть, мне все еще нужно получить имя таблицы, из которой находится TField. Как мне этого добиться?

function GetDataSetFieldsMSSQL(Dataset: TDataSet): String;
var
  I, L: Integer;
  TableName: String;
begin
  Result := '';
  L := Dataset.Fields.Count;
  if (L > 0) then
  begin
    TableName := ... // Name of the table for the Dataset.Fields[0] field.
    Result := '[' + TableName + '].[' + Dataset.Fields[0].FieldName + ']';
    I := 1;
    while (I < L) do
    begin
      TableName := ... // Name of the table for the Dataset.Fields[I] field.
      Result := Result + ',[' + TableName + '].[' + Dataset.Fields[I].FieldName + ']';
      Inc(I);
    end;
  end;
end;

4 ответа

Решение

Может быть, нет никакого решения для простого TDataSet?

Я верю нет. Потому что TDataset может получать свои "данные не только из таблиц RDBMS". Может быть:

  1. RSS-канал
  2. XML-файл Пример: TCliendataset является потомком TDataset, который может читать XML из своего собственного формата или с использованием XMLTransformProvider.
  3. Это может быть SQL для чтения электронной таблицы Excel или текстового файла, если у вас есть драйвер ODBC для этого и настроен источник данных.
  4. Sky (и воображение программистов Delphi по всему миру) - это предел того, что поле может представлять в TDataset.

У вас есть несколько вариантов, так как вы используете набор данных ADOD:

  • Разбор команды Text из ADOCommand
  • Использование свойства BASETABLENAME объекта ADORecordSet (как в комментарии Кобика)
  • Гадание по соглашению ( ответ Абелисто)

Вы можете использовать функцию Delphi GetTableNameFromQuery(SQL : String):String; от DBCommon Блок. Просто добавьте DBCommon на использование. знак равно

То, что вы пытаетесь сделать, невозможно, если у вас нет знаний или контроля над SQL, используемым в запросе. Запрос может содержать вычисляемые / вычисляемые поля или может возвращать поля из представления и т. Д. Кроме того, база данных может иметь несколько таблиц, которые содержат одинаковые имена полей.

Если возможно, вы можете запросить представление SQL-сервера INFORMATION_SCHEMA.COLUMNS и таким образом попытаться выяснить, из какой таблицы происходит имя поля. Однако, если имена полей не являются уникальными, это также может оказаться невозможным.

Как я знаю, нет никакого способа получить имя таблицы из компонента SQL-запроса. Однако вы можете указать псевдонимы для полей, например: "выберите foo_field как foo_dot_foo_field from foo" и затем замените их на правильный синтаксис: "Result: = '[' + StringReplace (DataSet.Fields [0].FieldName, 'dot'", '].[', [rfReplaceAll]) + ']'"

Другие вопросы по тегам