Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Delphi mdb в dbf

506
19 декабря 2005 года
evgen
20 / / 20.12.1999
Есть БД в формате mdb, в ней куча таблиц причем структура и количество полей неизвесно.
Мне нужно получить списов dbf файлов что бы в каждом файле была таблица из mdb файла.
Программа пишется на Delphi...
Я конечно понимаю в рамках Access это все делается простым экспортом.. а как это сделать программно?
8.3K
20 декабря 2005 года
banshee
40 / / 25.11.2005
Для начала, наверное, надо определить структуру полей mdb'шной базы. Примерно так:

procedure TForm1.Button1Click(Sender: TObject);
const
MyFielddefs: array[ftUnknown..ftTypedBinary] of string[11] =
('Unknown', 'String', 'Smallint', 'Integer',
'Word', 'Boolean', 'Float', 'Currency', 'BCD',
'Date', 'Time', 'DateTime', 'Bytes', 'VarBytes',
'AutoInc', 'Blob', 'Memo', 'Graphic', 'FmtMemo',
'ParadoxOle', 'DBaseOle', 'TypedBinary');
var
i, Indx: integer;
Definition: string;
begin
for i := 0 to Table1.FieldCount - 1 do
begin
Definition := Table1.Fields.DisplayLabel;
Definition := Definition + ' ' +
MyFieldDefs[Table1.Fields.DataType];
Table1.IndexDefs.Update;
if Table1.Fields.IsIndexField then
begin
Indx := Table1.IndexDefs.Indexof(Table1.Fields.Name);
if Indx > -1 then
if ixPrimary in Table1.IndexDefs[Indx].Options then
Definition := Definition + ' (Первичный)';
end;
Listbox1.Items.Add(Definition);
end;
end;

А затем создавать нужный тебе файл, например так:

procedure TForm1.CreateMyTable(NameFile: string);
begin
with Table1 do
begin
Active := False;
DatabaseName := '';
TableName := NameFile;
TableType := ttDefault;
with FieldDefs do
begin
Clear;
Add('EmpNo', ftInteger, 0, False);
Add('LastName', ftString, 20, False);
Add('FirstName', ftString, 15, False);
Add('PhoneExt', ftString, 4, False);
Add('HireDate', ftDateTime, 0, False);
Add('Salary', ftFloat, 0, False);
end;
with IndexDefs do
begin
Clear;
Add('', 'EmpNo', [ixPrimary, ixUnique]);
Add('ByName', 'LastName;FirstName', [ixCaseInsensitive]);
end;
CreateTable;
Free;
end;
end;

Удачи!
8.3K
20 декабря 2005 года
banshee
40 / / 25.11.2005
Нашел еще вот такой пример. Он создает dbf во время работы приложения

...
const

CreateTab = 'CREATE TABLE ';
IDXTab = 'PRIMARY KEY ';
MyTabStruct =
'IDX_TAB DECIMAL(6,0), ' +
'DATE_ DATE, ' +
'FLD_1 CHARACTER(20), ' +
'FLD_2 DECIMAL(7,2), ' +
'FLD_3 BOOLEAN, ' +
'FLD_4 BLOB(1,1), ' +
'FLD_5 BLOB(1,2), ' +
'FLD_6 BLOB(1,3), ' +
'FLD_7 BLOB(1,4), ' +
'FLD_8 BLOB(1,5) ';
...

// создание таблицы без индекса

procedure TForm1.Button1Click(Sender: TObject);
begin

if CreateTable('"MYTAB.DBF"', MyTabStruct, '') then
...
// выполняем дальнейшие операции

else
...
end;

// создание таблицы с индексом

procedure TForm1.Button2Click(Sender: TObject);
begin

if CreateTable('"MYTAB.DBF"', MyTabStruct, IDXTab + ' (IDX_TAB)') then
...
// выполняем дальнейшие операции

else
...
end;

function TForm1.CreateTable(TabName, TabStruct, TabIDX: string): boolean;
var

qyTable: TQuery;
begin

result := true;
qyTable := TQuery.Create(Self);
with qyTable do
try
try
SQL.Clear;
SQL.Add(CreateTab + TabName + '(' + TabStruct + TabIDX + ')');
Prepare;
// ExecSQL, а не Open. Иначе ... облом

ExecSQL;
except
// Обработка ошибок открытия таблицы Возможности обработчика можно расширить.

Exception.Create('Ошибка открытия таблицы');
result := false;
end;
finally
Close;
end;
end;
506
20 декабря 2005 года
evgen
20 / / 20.12.1999
Мне посоветовали использовать OLE Automation тока вот где найти описание к свойствам и обьектам Access
8.3K
20 декабря 2005 года
banshee
40 / / 25.11.2005
Help по синтаксису Ассess (DAO/ADO/ODBC) лежит примерно здесь

C:\Program Files\Common Files\Microsoft Shared\Office10\1033\JETSQL40.CHM

Еще есть конечно MSDN :)
506
20 декабря 2005 года
evgen
20 / / 20.12.1999
Цитата:
Originally posted by banshee
Help по синтаксису Ассess (DAO/ADO/ODBC) лежит примерно здесь

C:\Program Files\Common Files\Microsoft Shared\Office10\1033\JETSQL40.CHM

Еще есть конечно MSDN :)



А у меня нету этого файла. :(

8.3K
20 декабря 2005 года
banshee
40 / / 25.11.2005
C:\Program Files\Common Files\Microsoft Shared\OfficeXXX\1033\JETSQL40.CHM

Здесь XXX может быть разным. У меня, например, 11.

Но я бы, все-таки, не заморачивался с OLE, а сделал бы все "руками" Delphi.

Кстати, список таблиц в БД можно получить так:

ADOConnection.GetTableNames(ListBox)

У меня есть пример импорта mdb-таблиц в CSV-файл. Если надо, то могу выложить.
506
20 декабря 2005 года
evgen
20 / / 20.12.1999
Нету у меня там в папке вапще не одного *.CHM

Выложи пример плз.:)
9.0K
25 декабря 2005 года
Yurezxxx
18 / / 21.08.2005
Цитата:
Originally posted by banshee
Для начала, наверное, надо определить структуру полей mdb'шной базы. Примерно так:

procedure TForm1.Button1Click(Sender: TObject);
const
MyFielddefs: array[ftUnknown..ftTypedBinary] of string[11] =
('Unknown', 'String', 'Smallint', 'Integer',
'Word', 'Boolean', 'Float', 'Currency', 'BCD',
'Date', 'Time', 'DateTime', 'Bytes', 'VarBytes',
'AutoInc', 'Blob', 'Memo', 'Graphic', 'FmtMemo',
'ParadoxOle', 'DBaseOle', 'TypedBinary');
var
i, Indx: integer;
Definition: string;
begin
for i := 0 to Table1.FieldCount - 1 do
begin
Definition := Table1.Fields.DisplayLabel;
Definition := Definition + ' ' +
MyFieldDefs[Table1.Fields.DataType];
Table1.IndexDefs.Update;
if Table1.Fields.IsIndexField then
begin
Indx := Table1.IndexDefs.Indexof(Table1.Fields.Name);
if Indx > -1 then
if ixPrimary in Table1.IndexDefs[Indx].Options then
Definition := Definition + ' (Первичный)';
end;
Listbox1.Items.Add(Definition);
end;
end;

А затем создавать нужный тебе файл, например так:

procedure TForm1.CreateMyTable(NameFile: string);
begin
with Table1 do
begin
Active := False;
DatabaseName := '';
TableName := NameFile;
TableType := ttDefault;
with FieldDefs do
begin
Clear;
Add('EmpNo', ftInteger, 0, False);
Add('LastName', ftString, 20, False);
Add('FirstName', ftString, 15, False);
Add('PhoneExt', ftString, 4, False);
Add('HireDate', ftDateTime, 0, False);
Add('Salary', ftFloat, 0, False);
end;
with IndexDefs do
begin
Clear;
Add('', 'EmpNo', [ixPrimary, ixUnique]);
Add('ByName', 'LastName;FirstName', [ixCaseInsensitive]);
end;
CreateTable;
Free;
end;
end;

Удачи!


Почему бы не сделать проще
создать пустой dbf "Create table <Name>;"
а потом скопировать таблицу целиком
"INSERT INTO <Name>
SELECT * FROM <Откуда копировать>"
MS Jet должен такое прохавать только Name - это должен быть полный путь к файлу в dbf вместе с именем файла и расширением например <C:\...\Table1.dbf>. Ну только смысл аксессовскую базу копировать в dbf ??? Вопрос в том как сохранить связи и ограничения?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог