Форум: "Базы";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизКак создать 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.047 c