powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / Быстрая работа с DBF.
9 сообщений из 9, страница 1 из 1
Быстрая работа с DBF.
    #32348560
DomovoY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С помощью чего можно работать с dbf в c++? Задача - перегонка больших объемов данных в dbf.
Есть ли что - нибудть кроме ODBC?
...
Рейтинг: 0 / 0
Быстрая работа с DBF.
    #32348589
Фотография tpg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщето, общепризнано, что с dbf-ами быстрее фокса никто не справляется. Рой в ту сторону.
...
Рейтинг: 0 / 0
Быстрая работа с DBF.
    #32349129
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вручную!
Сам это делаю. Правда с фоксом не сравнивал...
...
Рейтинг: 0 / 0
Быстрая работа с DBF.
    #32368114
Фотография oz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вручную получается ЗНАЧИТЕЛЬНО быстрее, чем у фокса. Вот пример кода, кот-й создает таблу с данными из датасэта. Все поля Character(250) (это для универсальности, если структура датасэта известна, то...) с именами N1...Nn. Писал сам, так что не ругайте за кривость.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
Procedure TReports.Report2DBF(OutFile:Integer);
Var
   TempStr, TempStr1:String;
   i, j:Integer;
Begin
   // заголовок
   TempStr:=Chr( 3 ); // Foxpro без мэмо - полей
   TempStr:=TempStr + Chr( 03 ) + Chr( 04 ) + Chr( 01 ); // год + месяц + число последней модификации

   //  кол-во записей
   TempStr:=TempStr + Int2Str(O_Count.Field( 0 ),  4 );

   // позиция  1 -й записи
   TempStr:=TempStr + Int2Str( 32  + O_Report.FieldCount *  32  +  1 ,  2 );

   //   длина каждой записи
   TempStr:=TempStr + Int2Str(O_Report.FieldCount *  250  +  1 ,  2 );

   // зарезервированы
   for i:= 1  to  16  do
      TempStr:=TempStr + Chr( 0 );

   // нет CDX
   TempStr:=TempStr + Chr( 0 );

   // зарезервированы
   for i:= 1  to  3  do
      TempStr:=TempStr + Chr( 0 );

   // описания полей
   For j:= 0  To O_Report.FieldCount -  1  Do Begin
      // имя
      TempStr1:='N' + IntToStr(j +  1 );
      While Length(TempStr1) <  10  Do
         TempStr1:=TempStr1 + Chr( 0 );
      // тип
      TempStr1:=TempStr1 + CHR( 0 ) + 'C';
      //положение внутри записи
      TempStr1:=TempStr1 + Int2Str(j *  250  +  1 ,  4 );
      // длина
      TempStr1:=TempStr1 + CHR( 250 );
      // зарезервированы
      While Length(TempStr1) <  32  Do
         TempStr1:=TempStr1 + Chr( 0 );
      TempStr:=TempStr + TempStr1;
   End;
   TempStr:=TempStr + Chr( 13 );

   FileWrite(OutFile, TempStr[ 1 ], Length(TempStr));
   While Not O_Report.Eof Do Begin
      ProgressBar1.Position:=ProgressBar1.Position +  1 ;
      Application.ProcessMessages;
      TempStr:=' ';
      For i:= 0  To O_Report.FieldCount -  1  Do Begin
         TempStr1:=WinToDos(O_Report.Fields[i].AsString);
         While Length(TempStr1) <  250  Do
            TempStr1:=TempStr1 + ' ';
         TempStr:=TempStr + TempStr1;
      End;
      FileWrite(OutFile, TempStr[ 1 ], Length(TempStr));
      O_Report.Next;
   End;
   TempStr:=Chr( 26 );
   FileWrite(OutFile, TempStr[ 1 ], Length(TempStr));
End;

Function TReports.Int2Str(I, Num:Integer):String;
Begin
   Result:=Chr(i mod  256 );
   Num:=Num -  1 ;
   While Num >  0  Do Begin
      i:=Round(Int((i - (i mod  256 )) /  256 ));
      Result:=Result + Chr(i mod  256 );
      Num:=Num -  1 ;
   End;
End;

ЗЫ: если нада с мэмами, то чуууть-чуть посложнее.


------------------------------------------------
Who is Fuck the Alise?
...
Рейтинг: 0 / 0
Быстрая работа с DBF.
    #32377949
AlexVic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я в дельфи для работы с дбф использую компоненту Advantage,по скорости не хуже родного средства. Она ест-но и для си, взять можно на с сайта разработчика бесплатно.
...
Рейтинг: 0 / 0
Быстрая работа с DBF.
    #32386196
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2oz

Насколько я могу судить, работа с dbf далеко не сводится единственно к их созданию ;-)
...
Рейтинг: 0 / 0
Быстрая работа с DBF.
    #32400074
Фотография oz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Urri
Я не претендовал на звание создателя нового драйвера к фокспрошным таблицам. Ежели не ошибся, то суть темы заключалась в необходимости переместить некоторый объем данных из некоего набора в дбф. Я сталкивался с такой задачей часто. Первое действие, которое совершается перед лицом, которое ее выполняет - поиск программ типа DataPump. Перебирается множество вариантов. Большинство из них не умеют создавать мэмы, другие теряют дробную часть.... Как - то я наблюдал такую агонию и просто ради интереса набросал вышеизложенный код (на самом деле надо было выкачать лонги из Oracle, поэтому текст немного отличался). Прелесть заключается в том, что я контролирую формирование таблицы и занесение в нее данных и могу повлиять на процесс когда захочу.
Ежели не убедил, то звыняйтэ за потраченное на меня время :-)

------------------------------------------------
Who is Fuck the Alise?
...
Рейтинг: 0 / 0
Быстрая работа с DBF.
    #32404684
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убедил, убедил! ;-)
Действительно, частные случаи, как правило, получаются вручную быстрее, естественно, при наличии серого вещества и хорошего компилятора.
...
Рейтинг: 0 / 0
Быстрая работа с DBF.
    #32405897
aPT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DisableControls ускоряет работу с наборами данных в несколько раз.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / Быстрая работа с DBF.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]