Несколько вопросов по Delphi и Access

0.Подключиться к access
Кидаем на форму adoconnection1
в connectionstring указываем
provider=microsoft.jet.oledb.4.0;data source=c:\ПУТЬ\ИМЯ.mdb;persist security info=false

(
microsoft.jet.oledb.4.0... - строку подключения можно менять как обычную текстовую.
Может быть довольно много параметров
s:='provider=microsoft.jet.oledb.4.0;'+
'user id=admin;'+ {id пользователя}
'data source='+basename+';'+ {цепляемся к базе}
'mode=readwrite;extended properties="";'+
'jet oledb:system database="";'+
'jet oledb:registry path="";'+
'jet oledb:database password="1234";'+ {а вот и пароль}
'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=false;'+
'jet oledb:sfp=false';
adoconnection1.loginprompt:=false; // не использовать логин
)

Кидаем adotable и/или adoqwery
у них в connection указываем adoconnection1
До работы с таблицами выполняем
adoconnection1.open; // подключение к базе
Дальше по обычной схеме работы с базой

Если не знаешь как работать с базами, то читай уроки
http://articles.org.ru/cfaq/index.php?qid=1450&catid=96
или лекции
http://articles.org.ru/lection/sozdbd.php
http://articles.org.ru/lection/compbd.php
http://articles.org.ru/lection/query.php

Там все про bde, но идея таже за исключением того, что вместо например table надо использовать adotable вместо qwery adoqwery
Т.е. не закладку bde, а закладку ado.
dataacces и datacontrols остаются те же

1. Как через delphi создать базу данных access?
procedure createmsaccessdatabase(filename: string);
var
dao: variant;
i: integer;
const
engines: array[0..2] of string = ('dao.dbengine.36', 'dao.dbengine.35',
'dao.dbengine');

function checkclass(oleclassname: string): boolean;
var
res: hresult;
begin
result := cocreateinstance(progidtoclassid(oleclassname), nil,
clsctx_inproc_server or clsctx_local_server, idispatch, res) = s_ok;
end;
begin
for i := 0 to 2 do
if checkclass(engines[i]) then
begin
dao := createoleobject(engines[i]);
dao.workspaces[0].createdatabase(filename,
';langid=0x0409;cp=1252;country=0', 32);
exit;
end;
raise exception.create('dao engine could not be initialized');
end;

2. Как создать таблицу?
var
access, db, td, recordset: variant;

массив констант соответствия типов данных (между полями в 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}

);


// загружаем dao:
try
access := getactiveoleobject('dao.dbengine.35');
except
access := createoleobject('dao.dbengine.35');
end;

// открываем базу данных
try
db := access.opendatabase(yourdatabasename);
except
exit
end;

// создаtм новую таблицу в открытой базе данных
td := db.createtabledef(yourtablename, 0, '', '');

// добавляем в таблицу поле с описаниями
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));

// добавляем таблицу в список таблиц
db.tabledefs.append(td);

// открываем созданную таблицу
recordset := db.opentable(yourtablename, 0);

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

// изменяем значения поля
curfield := recordset.fields[0].value := 1;
curfield := recordset.fields[1].value := 'first record';

// помещаем новую запись в базу
recordset.update(dbupdateregular, false);
// где
const
dbupdateregular = 1;

// закрываем recordset
recordset.close;

// закрываем базу данных
db.close;

// освобождаем экземпляр dao
access := unassigned;

3. Как получить список таблиц существующей БД? (заполнить ими например stringlist)
var
x: tstrings;
begin
x:=tstringlist.create;
adoconnection.gettablenames(x, false или true)
операции с x...
x.free;

4. Как получить список полей существующей таблицы БД?
Это уже смешно, если Вы знаете имена таблиц

adottable.fields[xxx].filedname где xxx порядковый номер поля
fieldscount - как всегда :-)



Опубликовал admin
5 Май, Суббота 2007г.



Программирование для чайников.