Получить имя таблицы, из которой 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". Может быть:
- RSS-канал
- XML-файл Пример: TCliendataset является потомком TDataset, который может читать XML из своего собственного формата или с использованием XMLTransformProvider.
- Это может быть SQL для чтения электронной таблицы Excel или текстового файла, если у вас есть драйвер ODBC для этого и настроен источник данных.
- 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]) + ']'"