// Читаем файл (любой версии) // Проверяем что это ACCESS MDB // Нужны компаненты: // TADOtable,TDataSource,TOpenDialog,TDBGrid,TBitBtn. unit uMain;
interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, ADODB, Grids, DBGrids, ExtCtrls, DBCtrls, StdCtrls, Buttons;
type
TfrmMain = class(TForm)
DSUsers: TDataSource;
DBGridUsers: TDBGrid;
BitBtn1: TBitBtn;
OpenDialog1: TOpenDialog;
TUsers: TADOTable;
procedure FormCreate(Sender: TObject);
procedure ValidateAccessDB;
function CheckIfAccessDB(lDBPathName: string): boolean;
private{ Private declarations }public{ Public declarations }end;
var
frmMain: TfrmMain;
const
DBNAME = 'ADODemo.MDB';
DBPASSWORD = '123'; // Access DB Password Protected implementation{$R *.DFM}procedure TfrmMain.FormCreate(Sender: TObject);
begin
validateAccessDB;
end;
procedure TfrmMain.ValidateAccessDB;
var
lDBpathName : String;
lDBcheck : boolean;
beginif FileExists(ExtractFileDir(Application.ExeName) + '\' + DBNAME) then
lDBPathName := ExtractFileDir(Application.ExeName) + '\' + DBNAME
elseif OpenDialog1.Execute then// Set the OpenDialog Filter for ADOdemo.mdb only
lDBPathName := OpenDialog1.FileName;
lDBCheck := False;
if Trim(lDBPathName) <> '' then
lDBCheck := CheckIfAccessDB(lDBPathName);
if lDBCheck = Truethenbegin// ADO Connection String to the MS-ACCESS DB
TUsers.ConnectionString :=
'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + lDBPathName + ';' +
'Persist Security Info=False;' +
'Jet OLEDB:Database Password=' + DBPASSWORD;
TUsers.TableName := 'Users';
TUsers.Active := True;
endelse
frmMain.Free;
end;
// Check if it is a valid ACCESS DB File Before opening it. function TfrmMain.CheckIfAccessDB(lDBPathName: string): Boolean;
var
UnTypedFile: fileof byte;
Buffer: array[0..19] of byte;
NumRecsRead: Integer;
i: Integer;
MyString: string;
begin
AssignFile(UnTypedFile, lDBPathName);
reset(UnTypedFile);
BlockRead(UnTypedFile, Buffer, High(Buffer), NumRecsRead);
CloseFile(UnTypedFile);
for i := 1 to High(Buffer) do
MyString := MyString + Trim(Chr(Ord(Buffer[i])));
Result := False;
if Mystring = 'StandardJetDB' then
Result := True;
if Result = Falsethen
MessageDlg('Invalid Access Database', mtInformation, [mbOK], 0);
end;
end.
Перевод контента на русский язык:
Код написан на Delphi и использует ADO (ActiveX Data Objects) для чтения файла базы данных Access. Вот разбивка кода:
Основная форма
Основная форма (TfrmMain) имеет несколько компонентов:
DSUsers: источник данных
DBGridUsers: компонент DB grid
BitBtn1: кнопка (не используется в этом примере)
OpenDialog1: диалог открытия компонента
TUsers: компонент таблицы ADO
Событие FormCreate основной формы вызывается при создании формы и вызывает процедуру ValidateAccessDB.
ValidateAccessDB
Эта процедура проверяет, существует ли файл базы данных Access или нужно его открыть с помощью диалога открытия OpenDialog1. Если файл существует или открывается успешно, она проверяет, является ли файл валидной базой данных Access с помощью функции CheckIfAccessDB. Если это валидная база данных Access, она настраивает строку подключения ADO и активную таблицу.
CheckIfAccessDB
Функция проверяет, является ли данный файл пути к валидной базе данных Access, прочитав первые 20 байт файла и проверив наличие строки "StandardJetDB". Это не foolproof метод, потому что другие файлы также могут иметь эту строку в их заголовке. Лучше использовать функциональность ADO для проверки, является ли это валидной базой данных Access.
Предложения по улучшению кода
Вот несколько предложений по улучшению кода:
Вместо жесткого кодирования имени файла базы данных (DBNAME), рассмотрите возможность позволить пользователю выбрать другой файл с помощью диалога открытия OpenDialog1.
Функция CheckIfAccessDB могла быть улучшена, проверив расширение файла (MDB) и используя функциональность ADO для проверки, является ли это валидной базой данных Access.
Обработка ошибок минимальна. Рассмотрите возможность добавления более robust обработки ошибок для случаев, когда файл не может быть открыт или прочитан.
Код использует глобальную переменную (frmMain). Рассмотрите возможность передачи формы в процедуры, которые нуждаются в доступе к ее компонентам.
Альтернативное решение
Вместо использования функции CheckIfAccessDB можно использовать функциональность ADO для проверки, является ли это валидной базой данных Access. Можно создать объект подключения ADO и попытаться подключиться к файлу с помощью провайдера OLEDB. Если подключение успешно, то вероятно, что это валидная база данных Access.
Вот пример:
Функция создает объект подключения ADO, настраивает строку подключения к файлу с помощью провайдера OLEDB и пытается открыть соединение. Если соединение успешно, она возвращает True. Иначе, она возвращает False.
В статье описывается пример использования ActiveX Data Objects (ADO) для чтения файла Microsoft Access (MDB) в программе на языке Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.