Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Непонятности с компонентом Table


Автор: Нитонисе 20.1.2010, 14:53
Хочу изменить значения в базе данных. Набо из 3000 записей. Программно по всем им прохожу, меняя значение одного поля. Но размер вбайтах файла базы данных *.db не меняется, хотя и при выполнении программы и впроцессе проектирования - база данных уже представлена в измененном виде. Однако перезагружаю компьютер - и база данных в старом своем состоянии. Такое ощущения что эти изменения хранятся в каком-то кэше, и нужно применить что-то типа ApplyUpdates. В чем тут дело?
Похожая история с копированием записей из одной базы в другую. Вроде бы все скопировалось, однако размеры как исходной базы данных, так и той, куда копировал - остались без изменений, хотя в процессе выполнения программы все отображается нормально, до перезагрузки компьютера.

Автор: azesmcar 20.1.2010, 15:02
Цитата(Нитонисе @  20.1.2010,  14:53 Найти цитируемый пост)
Такое ощущения что эти изменения хранятся в каком-то кэше, и нужно применить что-то типа ApplyUpdates. В чем тут дело?

 smile 
Ну в общем-то так оно и есть, и больше всего меня веселит то, что функция так и называется smile 
Кажется там была опция CashedUpdates, можно ее убрать. Давно это было, точно не помню.

Автор: Нитонисе 20.1.2010, 15:33
Цитата(azesmcar @  20.1.2010,  15:02 Найти цитируемый пост)
Ну в общем-то так оно и есть, и больше всего меня веселит то, что функция так и называется

Называется-то она так, но не работает
Код

        T2->Append();
        T2->FieldByName("A")->AsString = "текст";       
        T2->ApplyUpdates();
        T2->Post();

Выдает ошибку - T2: Not in cached update mode.
T2 - это компонент класса TTable.

Автор: azesmcar 20.1.2010, 15:45
Нитонисе

вызывай ApplyUpdates() после функции Post() и ApplyUpdates стоит вызывать если CashedUpdates стоит.

Автор: Нитонисе 20.1.2010, 16:13
Цитата(azesmcar @  20.1.2010,  15:45 Найти цитируемый пост)
вызывай ApplyUpdates() после функции Post() и ApplyUpdates стоит вызывать если CashedUpdates стоит.

После Post() пишет ошибку - Database not in insert or edit mode. CashedUpdates на это никак не влияет. Да и вообще - эту опцию нужно ставить если надо кэшировать данные. А мне-то этого не надо. Мне надо сразу записывать. Потому CashedUpdates у меня всегда false. Но база почему-то не обновляется после прямой записи.

Автор: azesmcar 20.1.2010, 16:15
Код

        T2->Insert();
        T2->FieldByName("A")->AsString = "текст";       
        T2->Post();


Так не работает?

Автор: Нитонисе 20.1.2010, 16:50
Цитата(azesmcar @  20.1.2010,  16:15 Найти цитируемый пост)
Так не работает?

Ох и непонятный это компонент. Заменил на инсерт - сработало. Но мне нужно именно аппенд. Заменил обратно - и снова сработало. Что стало причиной - неясно, но проблема пока не проявляется.

Автор: azesmcar 20.1.2010, 17:09
Скорее всего проблемы компилятора..бывает

Автор: Нитонисе 20.1.2010, 22:26
Опять начались проблемы с Table.
Редактирую записи таки образом. Меняю в них точку на запятую.
Код

while (!Table1->EOF)
  {
     AnsiString s = Table1->FieldByName("Name")->AsString;
     int p = s.Pos(".");
     if (p)
       {
            s.Delete(p,1);
            s.Insert(",",p);
            Table1->Edit();
            Table1->FieldByName("Name")->AsString = s;
            Table1->Post();
       }
     Table1->Next();
  }

В итоге все записи успешно редактируются, но они как будто бы в каком-то кэше. Отображаются правильно в DBGrid, но файл размера не поменял, а должен был. 

Автор: dumb 20.1.2010, 22:36
Цитата(Нитонисе @  20.1.2010,  22:26 Найти цитируемый пост)
но файл размера не поменял, а должен был
ничего он не должен. формат хранения данных для всех СУБД свой, и, как правило, при изменении данных, размер контейнеров(файлов) не меняется. тебя это вообще не должно волновать.
и где твоя логика?! - возьми текстовый файл, замени в нем все точки на запятые - размер поменяется?

Автор: Данкинг 20.1.2010, 23:23
Цитата(Нитонисе @  20.1.2010,  22:26 Найти цитируемый пост)
но файл размера не поменял, а должен был.  

Да ладно. Возьми базу Access, добавь 1000 записей, потом их удали, потом добавь снова. Размер файла поменяется?

Цитата(Нитонисе @  20.1.2010,  16:50 Найти цитируемый пост)
Ох и непонятный это компонент.

Скорее, "Парадокс" непонятный. smile 

Автор: Нитонисе 21.1.2010, 00:30
Цитата(dumb @  20.1.2010,  22:36 Найти цитируемый пост)
ничего он не должен. формат хранения данных для всех СУБД свой, и, как правило, при изменении данных, размер контейнеров(файлов) не меняется. тебя это вообще не должно волновать.
Кстати да... наверное ты прав. То есть получается что если у меня база данных с одним текстовым полем, размером 255 символов, то ее размер в байтах при значении этого поля всего в один текстовый символ не будет отличаться от размера в байтах если поле будет содержать 255 символов?

Цитата(Данкинг @  20.1.2010,  23:23 Найти цитируемый пост)
Да ладно. Возьми базу Access, добавь 1000 записей, потом их удали, потом добавь снова. Размер файла поменяется?

Я так пробовал с *.xml - тоже размер не меняется. Все записи как будто присутствуют в базе данных. Видимо есть возможность их восстановить. Они даже видны все, если просматривать файл в браузере. "Удаленные" записи имеют какой-то спец флаг, говорящий о том, что они !удаленные" smile

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