{codecitation class="brush: pascal; gutter: false;" width="600px"}

Программирование под Майкрософт.Net — это как секс с представителем своего пола — пока этим не займешься, сама мысль об этом кажется извращением. После того, как этим займешься, понимаешь, что наверное что-то в этом есть, но друзьям признаться стыдно.

ADO

Если у Вас Delphi 5 Enterprise или Delphi 5 Professional с ADO Express, то Вы можете использовать компонент ADOTable и в его свойстве ConnectionString настроить (build) подключение как базе данных MS Access. Например:

Provider=Microsoft.Jet.OLEDB.4.0;

User ID=Admin;

Password=Password;

Data Source=D:\Path\dbname.mdb;

Mode=ReadWrite;

Extended Properties=" «;

Persist Security Info=False;

Jet OLEDB:System database=» «;

Jet OLEDB:Registry Path=» «;

Jet OLEDB:Database Password=» «;

Jet OLEDB:Engine Type=5;

Jet OLEDB:Database Locking Mode=1;

Jet OLEDB:Global Partial Bulk Ops=2;

Jet OLEDB:Global Bulk Transactions=1;

Jet OLEDB:New Database Password=» ";

Jet OLEDB:Create System Database=False;

Jet OLEDB:Encrypt Database=False;

Jet OLEDB:Don't Copy Locale on Compact=False;

Jet OLEDB:Compact Without Replica Repair=True;

Jet OLEDB:SFP=False

При этом будет открыта база данных D:\Path\dbname.mdb, будет использован драйвер ADO для базы данных Access (Microsoft.Jet.OLEDB.4.0). Имя пользователя будет Admin без пароля (эти значения присваиваются поумолчанию при создании базы Access). Если Вы всё-таки захотите использовать пароль, то его надо будет задать в ствойстве Jet OLEDB:Database Password. Если у Вас установлен режим безопасности, то необходимо указать файл.MDW или.MDA в свойстве Jet OLEDB:System database.

BDE

Так же для открытия базы данных Access можно воспользоваться BDE которая содержит родной драйвер (MSACCESS). В компоненте Database установите следующие свойства:

DatabaseName = any_name (или alias_name)

DriverName = MSACCESS

LoginPrompt = False

Params = PATH=d:\path

DATABASE NAME=d:\path\filename.mdb

TRACE MODE=0

LANGDRIVER=Access General

USER NAME=Admin

PASSWORD=your_password

OPEN/MODE=READ/WRITE

SQLPASSTHRU MODE=NOT SHARED

Значения свойства DatabaseName объекта Database, это то, которое Вы будете использовать в свойстве DatabaseName компонентов Table и Query, которые представляют таблицы и запросы для этой базы данных (тем самым связывая их с объектом Database).

BDE ODBC

В случае с базой данных Access, BDE предоставляет драйвер, однако существует множество других баз, для которых в BDE драйвера нет, но для которых есть драйвер ODBC. ODBC обычно используется для небольших баз данных или в приложениях, в которых присутствуют только операции импорта/экспорта…

Ниже приведён пример использования драйвера ODBC с BDE для открытия базы данных Access:

Создайте DSN (Data Source Name) для Вашей базы данных (используя апплет ODBC Data Sources в панели управления).

Кликните на закладку « System DSN» или « User DSN»

Кликните по кнопке « Add…»

Выберите « Microsoft Access Driver (*.mdb)» и нажмите ENTER. Появится диалоговое окошко « ODBC Microsoft Access Setup».

Задайте имя в текстовом окошке Data Source Name (без пробелов и без специальных символов).

Кликните по кнопке « Select…» чтобы выбрать нужный файл.MDB.

Если у Вас установлена схема безопасноти, то выберите радио кнопку « Database» в « System Database», а затем кликните кнопку « System database…», чтобы указать файл рабочей группы.MDW или.MDA.

Если Вы хотите указать имя пользователя и пароль, то нажмите кнопку « Advanced…». Данный способ защиты является низкоуровневым, так как любой, кто имеет доступ к Вашей машине может спокойно посмотреть свойства DSN. Если Вам необходим более высокий уровень защиты, то задавать имя пользователя и пароль необходимо на стадии открытия базы данных (см. ниже).

В заключении нажмите « OK», после чего Ваш DSN будет сохранён.

В Delphi установите свойства компонента TDatabase:

В DatabaseName задайте имя, которое указали в DSN.

Если Вы хотите, чтобы пользователя спрашивали имя и пароль, то установите LoginPrompt в True.

Если Вы не хотите использовать стандартный диалог имени и пароля (или если имя и пароль будут задаваться программно), то установите LoginPrompt в False и задайте свойство Params (или задайте эти свойства по ходу выполнения программы):

USER NAME=your_username

PASSWORD=your_password

Свяжите компоненты TTable или TQuery с компонентом TDatabase, как рассказывалось Выше, просто указав тоже имя (которое было задано в DSN) в их соответствующих свойствах DatabaseName.

{/codecitation}

{codecitation class="brush: pascal; gutter: false;" width="600px"}

1. Объявляем переменные:

var

access, db, td, recordset: Variant;

2. объявляем массив констант соответствия типов данных (между полями в Delphi и типами полей DAO)

arrMDBTypes: array[TFieldType] of Integer =

({dbText} 10 {ftUnknown},

{dbText} 10 {ftString},

{dbInteger} 3 {ftSmallint},

{dbLong} 4 {ftInteger},

{dbInteger} 3 {ftWord},

{dbBoolean} 1 {ftBoolean},

{dbDouble} 7 {ftFloat},

{dbCurrency} 5 {ftCurrency},

{dbDouble} 7 {ftBCD},

{dbDate} 8 {ftDate},

{dbTime} 22 {ftTime},

{dbDate} 8 {ftDateTime},

{dbLongBinary} 11 {ftBytes},

{dbLongBinary} 11 {ftVarBytes},

{dbInteger} 3 {ftAutoInc},

{dbLongBinary} 11 {ftBlob},

{dbMemo} 12 {ftMemo},

{dbLongBinary} 11 {ftGraphic},

{dbMemo} 12 {ftFmtMemo},

{dbLongBinary} 11 {ftParadoxOle},

{dbLongBinary} 11 {ftDBaseOle},

{dbBinary} 9 {ftTypedBinary},

{dbText} 10 {ftCursor}

{$IFDEF VER120}

,

{dbText} 10 {ftFixedChar},

{dbText} 10 {ftWideString},

{dbBigInt} 16 {ftLargeint},

{dbText} 10 {ftADT},

{dbText} 10 {ftArray},

{dbText} 10 {ftReference},

{dbText} 10 {ftDataSet}

{$ELSE}

{$IFDEF VER125}

,

{dbText} 10 {ftFixedChar},

{dbText} 10 {ftWideString},

{dbBigInt} 16 {ftLargeint},

{dbText} 10 {ftADT},

{dbText} 10 {ftArray},

{dbText} 10 {ftReference},

{dbText} 10 {ftDataSet}

{$ELSE}

{$,

{dbText} 10 {ftFixedChar},

{dbText} 10 {ftWideString},

{dbBigInt} 16 {ftLargeint},

{dbText} 10 {ftADT},

{dbText} 10 {ftArray},

{dbText} 10 {ftReference},

{dbText} 10 {ftDataSet},

{dbLongBinary} 11 {ftOraBlob},

{dbLongBinary} 11 {ftOraClob},

{dbText} 10 {ftVariant},

{dbText} 10 {ftInterface},

{dbText} 10 {ftIDispatch},

{dbGUID} 15 {ftGuid}

{$ENDIF}

{$ENDIF}

{$ENDIF}

);

// 3. загружаем DAO:

try

access:= GetActiveOleObject ('DAO.DBEngine.35');

except

access:= CreateOleObject ('DAO.DBEngine.35');

end;

// 4. открываем базу данных

try

db:= access.OpenDatabase (yourDatabaseName);

except

exit

end;

// 5. созда?м новую таблицу в открытой базе данных

td:= db.CreateTableDef (yourTableName, 0, '', '');

// 6. добавляем в таблицу поле с описаниями

td.Fields.Append (td.CreateField (strFieldName,

arrMDBTypes[intDataType], Size));

// например,

td.Fields.Append (td.CreateField ('ID', arrMDBTypes[intDataType], Size));

td.Fields.Append (td.CreateField ('NAME', arrMDBTypes[intDataType], Size));

// 7. добавляем таблицу в список таблиц

db.TableDefs.Append (td);

// 8. открываем созданную таблицу

recordset:= db.OpenTable (yourTableName, 0);

// 9. добавляем новую запись в открытую таблицу

recordset.AddNew;

// 10. изменяем значения поля

curField:= recordset.Fields[0].Value:= 1;

curField:= recordset.Fields[1].Value:= 'First record';

// 11. помещаем новую запись в базу

recordset.Update (dbUpdateRegular, False);

// где

const

dbUpdateRegular = 1;

// 12. закрываем recordset

recordset.Close;

// 13. закрываем базу данных

db.Close;

// 14. освобождаем экземпляр DAO

access:= UnAssigned;

{/codecitation}

{codecitation class="brush: pascal; gutter: false;" width="600px"}

Автор: Savva

WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****

>> Программное сжатие базы данных Access используя DAO

Процедура позволяет сжать базу данных в формате Access, используя DAO.

Действие аналогичное пункту меню в Access «Сервис -> Служебные программы ->

Сжать и восстановить базу данных».

Параметры:

* DatabaseName — путь к базе данных

* Password — пароль базы данных

Зависимости: windows,SysUtils,Dialogs,DAO2000,ComObj

(Dialogs можно исключить используя MessageBox для вывода

сообщения исключительной ситуации)

Автор: savva, Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра., ICQ:126578975, Орел

Copyright: Сапронов Алексей (Savva)

Дата: 31 мая 2002 г.

***************************************************** }

//перед вызовом процедуры базу надо закрыть, а после — открыть

procedure TData.CompactAccessDatabase (DatabaseName, Password: string);

var

TempName: array[0..MAX_PATH] of Char; // имя временного файла

TempPath: string; // путь

Name: string;

tmpDAO: _DBEngine;

ClassID: TGUID;

V35, V36: string; // версия DAO

begin

V35:= 'DAO.DBEngine.35';

V36:= 'DAO.DBEngine.36';

try // получим ClassID

try

ClassID:= ProgIDToClassID (v35);

except

try

ClassID:= ProgIDToClassID (v36);

except

raise; // что то нам неизвестное

end;

end;

// получаем путь для временного файла

TempPath:= ExtractFilePath (DatabaseName);

if TempPath = '' then

TempPath:= GetCurrentDir;

//получаем имя временного файла

GetTempFileName (PChar (TempPath), 'mdb', 0, TempName);

Name:= StrPas (TempName);

DeleteFile (PChar (Name)); // этого файла не должно существовать:))

if Password '' then

Password:= ';pwd=' Password;

tmpDAO:= CreateComObject (ClassID) as _DBEngine;

tmpDAO.CompactDatabase (DatabaseName, Name, 0, 0, Password);

DeleteFile (PChar (DatabaseName)); // удаляем не упакованную базу

RenameFile (Name, DatabaseName); // переименовываем упакованную базу

except

// выдаем сообщение об исключительной ситуации

on E: Exception do

ShowMessage (e.message);

end;

еnd;

Пример использования:

db.Close;

CompactAccessDatabase ('database.mdb', 'password');

db.open;

{/codecitation}

{codecitation class="brush: pascal; gutter: false;" width="600px"}

Автор: Savva

WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****

>> Программное сжатие базы данных Access используя JRO (Jet Replication Objects)

Процедура позволяет сжать базу данных в формате Access,

используя JRO (Jet Replication Objects). Действие аналогичное

пункту меню в Access «Сервис -> Служебные программы ->

Сжать и восстановить базу данных».

Параметры:

* DatabaseName — путь к исходной (не сжатой) базе данных

* DestDatabaseName — путь к сжатой базе данных

(по умолчанию пустой — в этом случае исходная база заменяется сжатой)

* Password — пароль базы данных (по умолчанию пустой)

PS. этот код был написан в связи с тем что аналогичная процедура

через DAO у многих не работала (по пока неизвестным для меня причинам)

Зависимости: windows,SysUtils,ComObj,Dialogs (Dialogs можно исключить

используя MessageBox для вывода сообщения исключительной ситуации)

Автор: savva, Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра., ICQ:126578975, Орел

Copyright: Сапронов Алексей (Savva)

Дата: 9 сентября 2002 г.

***************************************************** }

procedure CompactDatabase_JRO (DatabaseName: string; DestDatabaseName: string =

''; Password: string = '');

const

Provider = 'Provider=Microsoft.Jet.OLEDB.4.0;';

var

TempName: array[0..MAX_PATH] of Char; // имя временного файла

TempPath: string; // путь до него

Name: string;

Src, Dest: WideString;

V: Variant;

begin

try

Src:= Provider 'Data Source=' DatabaseName;

if DestDatabaseName '' then

Name:= DestDatabaseName

else

begin

// выходная база не указана — используем временный файл

// получаем путь для временного файла

TempPath:= ExtractFilePath (DatabaseName);

if TempPath = '' then

TempPath:= GetCurrentDir;

//получаем имя временного файла

GetTempFileName (PChar (TempPath), 'mdb', 0, TempName);

Name:= StrPas (TempName);

end;

DeleteFile (PChar (Name)); // этого файла не должно существовать:))

Dest:= Provider 'Data Source=' Name;

if Password '' then

begin

Src:= Src ';Jet OLEDB:Database Password=' Password;

Dest:= Dest ';Jet OLEDB:Database Password=' Password;

end;

V:= CreateOleObject ('jro.JetEngine');

try

V. CompactDatabase (Src, Dest); // сжимаем

finally

V:= 0;

end;

if DestDatabaseName = '' then

begin // т. к. выходная база не указана

DeleteFile (PChar (DatabaseName)); //то удаляем не упакованную базу

RenameFile (Name, DatabaseName); // и переименовываем упакованную базу

end;

except

// выдаем сообщение об исключительной ситуации

on E: Exception do

ShowMessage (e.message);

end;

end;

Пример использования:

db.Close;

CompactDatabase_JRO ('c:\database.mdb',

'c:\Archiv\database_pack.mdb', 'password');

db.open;

{/codecitation}

{codecitation class="brush: pascal; gutter: false;" width="600px"}

Автор: Savva

WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****

>> Программное создание базы данных Access (DAO DBEngine)

Функция создания файла базы данных Access.

PS. кто будет использовать — в комментариях отметьте версии ОС, Access,Delphi.

Зависимости: ComObj, Dialogs,

Автор: savva, Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра., ICQ:126578975, Орел

Copyright: Сапронов Алексей (Savva)

Дата: 11 октября 2002 г.

***************************************************** }

function CreateDatabase (DatabaseName: string): boolean;

var

DBEngine, Workspace: Variant;

const

dbLangGeneral = ';LANGID=0×0409;CP=1252;COUNTRY=0';

dbVersion30 = 32;

begin

result:= false;

try

try

DBEngine:= CreateOleObject ('DAO.DBEngine.36');

except

try {For DAO 3.5}

DBEngine:= CreateOleObject ('DAO.DBEngine.35');

except

raise;

end;

end;

Workspace:= DBEngine.Workspaces[0];

try

Workspace.CreateDatabase (DatabaseName, dbLangGeneral, dbVersion30);

except on e0: EOleException do

ShowMessage (e0.Message);

end;

except on e1: EOleException do

ShowMessage (e1.Message);

end;

result:= true;

end;

Пример использования:

CreateDatabase (db_name);

{/codecitation}