Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Как создать DBF, используя только DAO ?   Найти похожие ветки 

 
B@BY ©   (2005-09-28 16:27) [0]

Здравствуйте мастера!
Необходима функция для создания DBF в определенной директории и именем, и опред. структурой БД с помощью DAO.

Как объявить DAO в uses.
И как будет выглядеть функция, переделанная из VB на Delphi:

Private Function CreateDBF(PathDBF As String, NameDBF As String) As Boolean
Dim NewDB As Database
Dim NewTable As TableDef
Dim NewFld As Field

Set NewDB = OpenDatabase(PathDBF, False, 0, "Dbase IV")
Set NewTable = NewDB.CreateTableDef(NameDBF)

Set NewFld = NewTable.CreateField("NUM", dbText, 14)
NewTable.Fields.Append NewFld

Set NewFld = NewTable.CreateField("MASS", dbDouble)
NewTable.Fields.Append NewFld

Set NewFld = NewTable.CreateField("COMMENT", dbText, 120)
NewTable.Fields.Append NewFld

NewDB.TableDefs.Append NewTable

NewDB.Close
//CreateDBF = True
End Function


Заранее спасибо.


 
Desdechado ©   (2005-09-28 16:33) [1]

один из действенных, но не очень "легальных" способов
действует даже при отсутствии любых DB-компонентов и драйверов
сохранить бинарник файла DBF заданной структуры в ресурсе ЕХЕ, а при необходимости выгружать его в файл потоком


 
B@BY ©   (2005-09-28 17:04) [2]

Мне нужно разобраться как вобщем создать DBF на Delphi с помощью DAO.
Как объявить DAO, как создать таблицу, поле.
Ведь иногда может понадобиться динамическая структура БД...


 
Digitman ©   (2005-09-28 17:37) [3]


> B@BY ©   (28.09.05 17:04) [2]


непонятно, зачем тебе Access, DAO, ADO (и прочая лабуда) для создания DBF ..

в Делфи с этим не самым худшим образом справится BDE, которому для этой цели всякие там Access, DAO, ADO - как корове седло ...


 
isasa ©   (2005-09-28 18:06) [4]

Desdechado ©   (28.09.05 16:33) [1]
>сохранить бинарник файла DBF заданной структуры в ресурсе ЕХЕ


Пишем
type
TDBFHeaderDescrRec = record ...
 TDBFFieldDescrRec = record ...
по описанию

Структура таблиц(.DBF)
   Файл базы данных состоит из записи заголовка и записей с данными. В записи заголовка определяется структура базы данных и содержится вся другая информация, относящаяся к базе данных. В файле она начинается с нулевой позиции.
Записи с данными следуют за заголовком (байты располагаются последовательно) и включают в себя фактическое содержимое полей. Длина записи (в байтах) определяется суммированием указанных длин всех полей.

Запись заголовка .DBF файлa

Байты Описание
00 Тип файла: 0x03 без memo-поля 0xE5 с мемо полем
01-03 Дата последнего изменения ГГММДД, где ГГ записывается со смещением -0x30
04-07 Число записей в файле
08-09 Положение первой записи с данными
10-11 Длина одной записи с данными (включая признак удаления)
12-27 Зарезервированы
28 0x00 файл НЕ содержит структурный .NSX 0x01 файл содержит структурный .NSX
29 Зарезервирован
30-31 Зарезервировано, содержит 0x00
32..32x(n+1) Подзаписи полей, где n - число полей
32x(n+1)+1 Признак завершения записи заголовка 0x0D

Подзаписи полей

Байты Описание
00-10 Название поля (максимально - 10 символов, если меньше 10, то дополняется пустым символом (0х00))
11 Тип данных:
          C   Character (символьный)
          N   Numeric (числовой)
          D   Date (дата)
          L   Logical (логический)
          M   Memo
12-15 Зарезервировано
16 Длина поля (в байтах)
17 Длина дробной части в байтах
18 Зарезервирован


Сам файл

<Запись заголовка>
<Данные>
$1A


Пустой


<Запись заголовка>
$1A


 
Desdechado ©   (2005-09-28 18:09) [5]

2 isasa
вот со структурой возможны варианты
версий DBF столько всяких разных, что на всех описания не напасешься, а тем паче веток в программе генерации DBF


 
isasa ©   (2005-09-28 18:12) [6]

> Длина записи (в байтах) определяется суммированием указанных длин всех полей.

Плюс единица - признак удаления (" "($20) - рабочая, "*"($2A) - помечена для удаления)


 
isasa ©   (2005-09-28 18:15) [7]

Desdechado ©   (28.09.05 18:09) [5]


Нормально открывается :).
Например файл, сделаный под dBase II, спокойно открывался FoxPro for Windows v 1.5


 
isasa ©   (2005-09-28 18:19) [8]

Да, добавлю. Естественно, баловаться с vtvj-полями в этом случае не стоит.
Тип файла = $03 - без memo-поля


 
Desdechado ©   (2005-09-28 18:24) [9]

а как с кодировочками? или наличием индексов, особенно многотэговых?
а байты 12-27, 29-31 ?


 
isasa ©   (2005-09-28 18:38) [10]

а байты 12-27, 29-31 ?
Прописываем $00.

Кодировка - по вкусу 866 или 1251 - строковые хранятся как есть,
числовые,
123,0123 -> N(9,4)-> " 123.0123"

Так DBF создаем пустой! :))


 
Desdechado ©   (2005-09-28 20:37) [11]

нули писать, конечно, можно
но в каких-нибудь версиях DBF эти байты вполне могут использоваться, и ноль уже будет что-то конкретное означать, а что именно - еще вопрос

пустой-то пустой, но далее-то с ним надо как-то работать, а это зависит от того, как мы его создадим

это я к тому, что махать флагом о возможности так создать файл с любой структурой, подходящий по формату под что угодно, - нельзя


 
isasa ©   (2005-09-28 20:57) [12]

что махать флагом о возможности так создать файл с любой структурой,
Сабж о DBF файлах, не надо ничего придумывать!


 
Desdechado ©   (2005-09-28 22:46) [13]

маловато ты DBF"ов видел, имхо
они как арбузы - все съедобные, вот только формой, полосатостью, толщиной кожуры, размером и цветом семечек отличаются


 
ANB ©   (2005-09-29 09:19) [14]

Формат DBF Clipper и FoxPro отличаются. Принципиально - структура стандартная, а вот заполнение поле - чуть чуть разное.

ЗЫ. А через Local SQL это никак сделать нельзя ?


 
B@BY ©   (2005-09-29 12:12) [15]

Вопрос заключался в том как создать DBF с помощью DAO, а не с помощью ресурсов или как предложил > isasa ©   (28.09.05 18:06) [4].

Так что пришлось самому :(( искать ответы в инете... (http://excode.ru/?mod=article&id=index&topicid=76&ex=575b8fb3a8c8120935669f594ca8f1ef ; http://megalib.com/books/478/350.htm ; http://www.sources.ru/delphi/db/create_table_in_access_with_dao.shtml) и смог найти то что нужно было мне :)).
В общем мне нужно было что-то вроде этого:


unit Unit1;
interface
uses
 Dialogs, Forms, Classes, Controls, StdCtrls, ComObj;
type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   function CreateDBF(PathDBF: String; NameDBF: String): Boolean;
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
 if CreateDBF("D:\-\","qwe.dbf")=False then ShowMessage("Ошибка создания DBF")
   else ShowMessage("DBF успешно создан");
end;

function  TForm1.CreateDBF(PathDBF: String; NameDBF: String): Boolean;
var access, NewDB, NewTable, NewFld: variant;
begin
try
 try
   access := GetActiveOleObject("DAO.DBEngine.35");
 except
   access := CreateOleObject("DAO.DBEngine.35");
 end;
 NewDB := access.OpenDatabase(PathDBF, False, 0, "Dbase IV");
 NewTable := NewDB.CreateTableDef(NameDBF);
...
 NewFld := NewTable.CreateField("NUM", 10 , 14); //dbText = 10
 NewTable.Fields.Append(NewFld);
...
 NewFld := NewTable.CreateField("MASS", 7); //dbDouble = 7
 NewTable.Fields.Append(NewFld);
...
 NewFld := NewTable.CreateField("COMMENT", 10, 120);
 NewTable.Fields.Append(NewFld);

 NewDB.TableDefs.Append(NewTable);

 NewDB.Close;
 Result:=True;
except
 Result:=False;
end;
end;
end.


FOR > Digitman ©   (28.09.05 17:37) [3]
> непонятно, зачем тебе Access, DAO, ADO (и прочая лабуда) для создания DBF ..
> в Делфи с этим не самым худшим образом справится BDE, которому для этой цели всякие там Access, DAO, ADO - как корове седло ...

Во первых у меня много наработок на DAO в Visual Basic"e, и поэтому не хотелось на данный момент изучать структуру другого компонента.
А во вторых в инете написано что BDE нужно устанавливать отдельно (т.к. не входит в состав Windows или Office), а DAO входит в состав MSOffice, и поэтому устанавливать на каждом компе BDE меня не устраивает.

P.S. Может мне нужно было почитать http://ln.com.ua/~openxs/articles/smart-questions-ru.html(как правильно задавать вопросы) , прежде чем задавать вопрос???...


 
ANB ©   (2005-09-29 12:27) [16]

А DAO поддерживает SQL ? Если поддерживает, то почему бы не воспользоваться DDL ?


 
isasa ©   (2005-09-29 12:56) [17]

>маловато ты DBF"ов видел
см. профиль. Насчет пешком под стол ... Промолчу.


 
Desdechado ©   (2005-09-29 14:10) [18]

> Насчет пешком под стол ...
На личности не надо.
Можно всю жизнь программировать БД и не представлять себе многих вещей, которые в повседневной практике не нужны. А можно за год наковырять (читай, набить шишек) столько нюансов, сколько другие и представить не могут.
DBF - самый "разболтанный" формат, каждый под себя его крутит. А таких "каждых" - по пальцам не посчитать.



Страницы: 1 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.031 c
2-1130313822
alless
2005-10-26 12:03
2005.11.13
Как передать ф-ию в качестве параметра дин. массив?


3-1128347433
Антон1209
2005-10-03 17:50
2005.11.13
параметры TSQLDataSet


14-1129898967
oldman
2005-10-21 16:49
2005.11.13
пятничная задачка...


14-1129810870
wHammer
2005-10-20 16:21
2005.11.13
Как перевести исходники с версии 6 на версию 5


2-1130226417
RainKm
2005-10-25 11:46
2005.11.13
Список папок