Delphi mdb в dbf
Мне нужно получить списов dbf файлов что бы в каждом файле была таблица из mdb файла.
Программа пишется на Delphi...
Я конечно понимаю в рамках Access это все делается простым экспортом.. а как это сделать программно?
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;
Удачи!
...
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;
Мне посоветовали использовать OLE Automation тока вот где найти описание к свойствам и обьектам Access
C:\Program Files\Common Files\Microsoft Shared\Office10\1033\JETSQL40.CHM
Еще есть конечно MSDN :)
Цитата:
Originally posted by banshee
Help по синтаксису Ассess (DAO/ADO/ODBC) лежит примерно здесь
C:\Program Files\Common Files\Microsoft Shared\Office10\1033\JETSQL40.CHM
Еще есть конечно MSDN :)
Help по синтаксису Ассess (DAO/ADO/ODBC) лежит примерно здесь
C:\Program Files\Common Files\Microsoft Shared\Office10\1033\JETSQL40.CHM
Еще есть конечно MSDN :)
А у меня нету этого файла. :(
Здесь XXX может быть разным. У меня, например, 11.
Но я бы, все-таки, не заморачивался с OLE, а сделал бы все "руками" Delphi.
Кстати, список таблиц в БД можно получить так:
ADOConnection.GetTableNames(ListBox)
У меня есть пример импорта mdb-таблиц в CSV-файл. Если надо, то могу выложить.
Выложи пример плз.:)
Цитата:
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;
Удачи!
Для начала, наверное, надо определить структуру полей 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 ??? Вопрос в том как сохранить связи и ограничения?