Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > ADO||BDE как создать dbf таблицы


Автор: Programister0 6.7.2007, 20:34
немогу создать нормальные dbf файлы 
пробовал пример и bildera с TTable вроде создает таблицу но файла нет
Код

  NewTable->Active = false;
  NewTable->DatabaseName = BDType->Text ;
  NewTable->TableName = TBname->Text;
  NewTable->TableType = TBType->ItemIndex ;
  NewTable->FieldDefs->Clear();

  TFieldDef *NewField;
  for(int i=0;i<fieldCount;i++)
  {
    NewField=NewTable->FieldDefs->AddFieldDef(); // define  field
    NewField->Name     = df[i]->field->Text;
    NewField->DataType = df[i]->type->ItemIndex;
    NewField->Size     = StrToInt(df[i]->size->Text);
  }
  bool CreateIt = (!NewTable->Exists);  //если TBname->Text один и тотже 2 раза  CreateIt==1
  if (!CreateIt)                            
    if(MessageBox(0,"Overwrite table ?","Table Exists", MB_YESNO) == IDYES)
      CreateIt = true;
  if(CreateIt)
    NewTable->CreateTable(); // create the table
  
код работает но файла нет! (никогда неповторяюсь неповторяюсь)

пробовал с помощью ADO
Код

  ADOq->ConnectionString="Provider=MSDASQL.3;"  
                         "Persist Security Info=False;"
                         "Data Source=Файлы dBASE;"
                         "Mode=ReadWrite";
  ADOq->SQL->Add(
"CREATE TABLE "
"TBname_0"  
" ( "  //дальше идут типы полей которые я подобрал
"field_0  byte, " 
"field_1  numeric, "
"field_2  integer, "
"field_3  long, "
"field_4  float, "
"field_5  double, "                //с 0 по 5 - все одинаковые numeric размером 20,5
"field_6  string(10), "           //character(10)
"field_7  char, "                    //character(254)
"field_8  varchar(21), "        //character(21)
"field_9  date"                     //date(8)
" );" 

 таблица создается нормально но проблема в числовых полях numeric размером 20,5 
необходимо задать размер ЧИСЛОВОГО ПОЛЯ
я пробовал :
numeric(n,m) 
numeric(n)
- ошибка в запросе !
может изначально ошибка в ConnectionString или опять вернуться к TTable?

Автор: mutex 6.7.2007, 22:01
Попробуйте использовать VFP OLE DB Provider (скачайте от Микрософт) и определения полей на языке Visual FoxPro.
Строка соединения может выглядеть так:
Provider=VFPOLEDB.1;Data Source=C:\DBFTEST\;Mode=ReadWrite;User ID="";Password="";Collating Sequence=MACHINE;DSN=""

Определение структуры таблицы (файла TEST.DBF) так:
CREATE TABLE TEST (
  FCHAR C(20),
  FNUM N(10,3),
  FDATE D,
  FDATETIME T,
  FINTEGER I,
  FLOGIC L,
  FMEMO M(4)
)

Этот SQL оператор можно выполнять через метод Execute Вашего соединения.



Автор: Данкинг 6.7.2007, 22:43
Да, коннектимся через VFP провайдер, кидаем AdoQuery и в нём пишем запрос на создание таблицы. На дельфи я делал именно так.

Автор: mutex 7.7.2007, 11:27
Если на Дельфи код работает, в чем же проблема на Билдере?

Автор: Programister0 7.7.2007, 12:17
mutex ты следишь за мной 
я сразу и недогнал что ты имел ввиду, пока не вспомнил про dat файлы.
ответ:
  нет ни какого кода(ни в делфи не в билдере), в этом я полуторный ЛАМО
  есть только компоненты из bildera с которыми я немогу разобрваться
  т.к. компоненты bildera и delphi одинаковы(почти) я искал ответы и в разделе delphi
  как выбирать записи из dbf это понятно, как получить их из dat незнаю!
  
сейчас проблема была в том как коректно создавать эти самые dbf-ки 
спасибо за совет с VFP OLE DB Provider все нормально засвистело 
- теперь числовые поля нужного размера получаются!

тема закрыта!
еще раз спасибо.

Автор: Programister0 7.7.2007, 23:35
блин опять не так,
таблицы создаются нормально и поля нужного размера
но выбирать и добавлять записи можно ТОЛЬКО с помощью того-же 
ADOTable и ADOQuaery другие программы либо выдают лишнее поле типа _NullFlags размером 1 и типом соседнего поля
либо вообще не открывают 
TTable работать с такими файлами отказывается говорит типа: "Corrupt table/index header"

Ещё скачал компоненты degisy data с помощью DsDBF создавал таблицы 
которые нормально работают везде, но опять появилась проблема 
с указанием размера поля (например numeric(8,4)) создаваемой таблицы 
там размер указывается только для строк! может кто то работал с этим компонентом - как размер прописать? 
или
может в ConnectionString для ADO что то не так
я пишу:
Provider=VFPOLEDB.1;Data Source=.;Mode=ReadWrite;User ID="";Password="";Collating Sequence=MACHINE;DSN=""

Автор: mutex 8.7.2007, 14:02
Чтобы не было поля _NullFlags, попробуйте добавить фразу "NOT NULL" (без кавычек) в определениях строковых полей - типа "C" (Character).

TTable использует BDE. BDE не умеет распознавать DBF-файлы, имеющие VFP-формат. ADO считается более продвинутой технологией, чем устаревший BDE. Следовательно, работайте спокойно через ADO. smile

Можете в ADO ConnectionString попробовать изменить параметр Collating Sequence на:
Collating Sequence=RUSSIAN
если только VFP-провайдер найдет русскую последовательность сортировки.
Это должно дать независимость от регистра-высоты кириллических букв.

PS. Чем же не устраивает TADODataset?  Если что непонятно, спросите. smile
PPS. Я не встречал ни одного готового компонента, который корректно работает с кириллическими индексами, а также предоставляет возможность полного управления DBF-файлами.

Автор: Programister0 8.7.2007, 15:41
В ADO простой запрос 
SELECT * FROM TB 
где в TB ~30,000 записей выполняется 0,3 сек.
в DBE тоже самое за 0,2 сек.
а есть таблицы где ещё больше записей (но там нет счетчика т.к. редко загр-ся)

ещё драйвер ado какойто работает от в зависимости от "погоды" 
то нормально то "cannot load driver" перезапускаю проект опять нормально.

и видимо этот VFP OLE DB Provider должен быть на машинах где будут использоваться его dbf-ки,
что возможно будет накладно.

Автор: mutex 8.7.2007, 18:45
С оптимизацией, конечно, надо разбираться. По умолчанию ADO просчитывает всю таблицу сразу в память. Поэкспериментируйте свойствами BlockReadSize, CacheSize и MaxRecords. 

Видимо, BDE читает только начальные записи таблицы, чтобы заполнить сетку-грид, а потом делает подкачку по необходимости. Кстати, если хотите остаться в среде BDE, воспользуйтесь компонентами Halcyon, где можно создавать DBF-файлы для Dbase3 или Dbase4. 

Провайдер VFP надо ставить везде, но BDE - тоже ведь надо. Причем размеры BDE больше.
 
> то "cannot load driver" перезапускаю проект опять нормально
Что-то установлено криво. Переустановите MDAC и VFP провайдер. В моей практике провайдер пока что не подводил меня.

Автор: Programister0 8.7.2007, 18:55
действительно если прописывать not null для всех полей _NullFlags пропадает и 
TTable нормально с ними работает, благодарю за совет. 

и на счет BDE тоже верно 
ща буду эксперементировать со скоростью ADO 
может тогда все компоненты и поменяю.

Автор: Programister0 8.7.2007, 20:43
нет ADO однозначно медленнее BDE.

компоненты Halcyon - для Buildera я не нашел, только для делфи!
если есть такие дай ссылочку.

Автор: mutex 8.7.2007, 21:34
Halcyon сделан на Паскале. Но, он должен установиться под Билдером. У Вас какая версия Билдера?

Автор: Programister0 8.7.2007, 21:58
BCB 6 
скачал hlcn696
пробовал ставить он требует package 
а там вообще нет файлов с расширением bpk.
пробовал чегото самостоятельно наваять невыходит.

Автор: mutex 9.7.2007, 18:17
И сдался же этот Блиндер. smile

Попробуйте так:
1. создать пакет *.bpk (меню File/New/Other потом package)
2. сохранить его под именем Halcyuon6
2. включить туда все *.pas файлы из Дельфийского dpk-файла
3. в опциях проекта пакета отключить все флаги из Pascal/Messages
4. добавить путь
      $(BCB)\Source\ToolsApi
   в Library Path через Tools/Environment Options/Library

Автор: Programister0 12.7.2007, 16:56
спасибо mutex,
с твоей помощью и терпением удалось установить компонент.

извиняюсь за долгое молчание - трафик кончился.
вообще щас вроде с ADO подружился теперь там ковыряюсь 
т.к. мне кажется там можно более сложные запросы выполнять чем в BDE.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)