При разработке приложений с использованием Delphi XE3 для работы с базами данных MS Access часто возникает необходимость в получении списка таблиц, исключая из него представления и запросы. Это может потребоваться, например, для сравнения структур таблиц двух баз данных и создания скрипта для их модификации или синхронизации.
Проблема
Разработчик столкнулся с задачей получения списка таблиц в MS Access, исключая представления и запросы. Попытки использовать метод ADOConnection1.GetTableNames приводили к возвращению всех таблиц и представлений. Также была попытка использовать запрос к системе MS Access, но это требовало наличия файла System.mdw, который не всегда присутствует.
Решение
Для решения этой проблемы можно использовать метод OpenSchema, передавая в него значение _siTables, и затем отфильтровать результаты с помощью столбца TABLE_TYPE возвращаемого набора данных. В примере кода ниже демонстрируется, как можно получить список таблиц, исключая представления и запросы.
{$APPTYPE CONSOLE}
{$R *.res}
uses
SysUtils,
ActiveX,
ComObj,
Adodb,
Variants;
procedure ListTables(const FileName: string);
var
LADOConnection: TADOConnection;
LADODataSet: TADODataSet;
begin
LADOConnection := TADOConnection.Create(nil);
try
LADOConnection.ConnectionString := Format('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;Persist Security Info=False;', [FileName]);
LADODataSet := TADODataSet.Create(nil);
try
LADODataSet.Connection := LADOConnection;
LADOConnection.Open;
LADOConnection.OpenSchema(siTables, EmptyParam, EmptyParam, LADODataSet);
LADODataSet.Filter := '(TABLE_TYPE = ''TABLE'')'; // показывать только таблицы
LADODataSet.Filtered := True;
while not LADODataSet.EOF do
begin
Writeln(Format('Name %s Type %s', [LADODataSet.FieldByName('TABLE_NAME').AsString, LADODataSet.FieldByName('TABLE_TYPE').AsString]));
LADODataSet.Next;
end;
finally
LADODataSet.Free;
end;
finally
LADOConnection.Free;
end;
end;
begin
try
CoInitialize(nil);
try
ListTables('C:\Test\Northwind.MDB');
finally
CoUninitialize;
end;
except
on E: EOleException do
Writeln(Format('EOleException %s %x', [E.Message, E.ErrorCode]));
on E: Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
Примечание
Благодарность пользователю RRUZ за предоставленный рабочий пример кода. Использование фильтра позволило успешно решить проблему, над которой разработчик работал несколько недель.
Заключение
При использовании Delphi XE3 для работы с базами данных MS Access, важно правильно использовать методы и свойства компонентов ADO для получения необходимой информации о структуре таблиц. Приведенный пример кода демонстрирует, как можно эффективно исключить представления и запросы из списка, получаемого с помощью OpenSchema. Это может быть полезно при разработке приложений для сравнения и синхронизации структур таблиц в разных базах данных.
Разработчик использует Delphi XE3 для работы с базами данных MS Access и сталкивается с задачей получения списка таблиц, исключая представления и запросы, для сравнения структур баз данных.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.