C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
C++Builder + IBase, не разберусь что не так.
Anatoliys
Отправлено: 15.12.2003, 15:26


Не зарегистрирован







Когда выхожу из прграммы и захожу снова, то ввижу что запись не изменилась. Мне нужно отредактировать два поля в БД.

Задача: Отредактировать путь к файлу и если нужно то и имя файла.
Действия: Пользователь щелкает правой кнопкой мыши на нужной записи в гриде, и с помощью диалога выбора файла указывает где находится новый файл.
Проблема изменения видны только пока программа не закрыта.

Код пишу так:
В компоненте "IBDataSet1" установлены параметры
ModifiSQL: update DOCUMENTS set EDOCNAME =:EDOCNAME, PATHDOC =:PATHDOC where EDOCNAME = "'+nname+'" and PATHDOC = '"+npat+"'.
RefreshSQL
Select
PATHDOC,
EDOCNAME
и т.д.
from DOCUMENTS
where
PATHDOC = :PATHDOC and
PATHFOLDER = :PATHFOLDER and
и т.д.

Код на кнопке:
if(FMain->OpenDialog->Execute()) {
npat = FMain->OpenDialog->FileName;
nname = ExtractFileName(FMain->OpenDialog->FileName);

DataModule1->IBDataSet1->Edit();
DataModule1->IBDataSet1->CachedUpdates=false;
DataModule1->IBDataSet1->FieldByName("PATHDOC")->AsString = npat;
if(DataModule1->IBDataSet1->FieldValues["EDOCNAME"] != nname)
{ DataModule1->IBDataSet1->FieldByName("EDOCNAME")->AsString = nname; }

DataModule1->IBDataSet1->CachedUpdates=false;

DataModule1->IBDataSet1->UpdateRecord();
DataModule1->IBDataSet1->ApplyUpdates();

DataModule1->IBTransaction1->CommitRetaining();

}


Предположения:

- Не правильно открывается/закрывается транзакция.
- Не происходит сохранения после открытия DataModule1->IBDataSet1->Edit();
-
-
[B][B]
Nick
Отправлено: 15.12.2003, 18:01


Машинист паровоза

Группа: Участник
Сообщений: 247



При закрытии формы проверяй состояние записи.
Если в состоянии Edit делаешь Post() и
DataModule1->IBTransaction1->Commit();

FormOnClose()
{
if (DataModule1->IBDataSet1->State != dsBrowse ) DataModule1->IBDataSet1->Post();
DataModule1->IBTransaction1->Commit();
}

CommitRetaining(); не рекомендуется применять очень часто



// DataModule1->IBDataSet1->CachedUpdates=false; — убрать достаточно установить при проектировании
DataModule1->IBDataSet1->FieldByName("PATHDOC")->AsString = npat;
if(DataModule1->IBDataSet1->FieldValues["EDOCNAME"] != nname)
{
if (DataModule1->IBDataSet1->State == dsBrowse ) DataModule1->IBDataSet1->Edit();
DataModule1->IBDataSet1->FieldByName("EDOCNAME")->AsString = nname;
// DataModule1->IBDataSet1->CachedUpdates=false; — убрать
// DataModule1->IBDataSet1->UpdateRecord();  — убрать
// DataModule1->IBDataSet1->ApplyUpdates(); — убрать нужна при CachedUpdates= true


// DataModule1->IBTransaction1->CommitRetaining();
DataModule1->IBDataSet1->Post(); // если сразу запись сохраняется
}
Nick
Отправлено: 15.12.2003, 18:02


Машинист паровоза

Группа: Участник
Сообщений: 247



Вообще переходи сраз на FIBPlus. Там много вкусного и работает быстрей.
anatoliys
Отправлено: 16.12.2003, 08:47


Не зарегистрирован







А что такое FIBPlus ?
Nick
Отправлено: 16.12.2003, 09:27


Машинист паровоза

Группа: Участник
Сообщений: 247



Компоненты для работы с базами IBase, FireBird.
Зайди на сайт www.iBase.ru там много полезного.

1.FIBPlus лучше обрабатывает ошибку отключения клиента от сервера.
2.DataSet имеет сразу весь набор запросов Select, Insert, Update, Delete, Refresh (правда в стандартном IBX тоже есть такой компонент) и 2 транзакции, одна просмотр другая запись, если указать две разные транзакции и AutoCommit = true то при сохранении записи Post() запись будет подтвержнаться на сервере.
3.В разделе Статьи этого сайта можно прочитать еще кое чего

Компоненты стоят 500р для русских разработчиков.
Можно скачать trial версию.

Вообще отключение от сервера мне в IBX попортила нервы.
Оказалось правда что виноваты свои UDF.
anatoliys
Отправлено: 16.12.2003, 10:26


Не зарегистрирован







Nick

Я уже на грани(.

Никак не сделаю эту вещь. Сохранения не сохраняются и всё в БД.

Исправил код как Вы мне исправили.

//--------- N4Click

if(FMain->OpenDialog->Execute()) {

if (DataModule1->IBDataSet1->State == dsBrowse ) {

DataModule1->IBDataSet1->Edit();
DataModule1->IBDataSet1->FieldByName("PATHDOC")->AsString = FMain->OpenDialog->FileName;
if(DataModule1->IBDataSet1->FieldValues["EDOCNAME"] != ExtractFileName(FMain->OpenDialog->FileName))
DataModule1->IBDataSet1->FieldByName("EDOCNAME")->AsString = ExtractFileName(FMain->OpenDialog->FileName);

DataModule1->IBDataSet1->Post();
DataModule1->IBTransaction1->CommitRetaining();
}
}

//------------------
FormClose
{
if(DataModule1->IBDataSet1->State == dsEdit ) {
DataModule1->IBDataSet1->Post();
DataModule1->IBTransaction1->Commit();
ShowMessage("Изменения сохранены. Транзакция закрыта.");
}

Может в компоненте "BTransaction1" нужно что то указать в параметрах.
anatoliys
Отправлено: 16.12.2003, 10:34


Не зарегистрирован







S.O.S.
anatoliys
Отправлено: 16.12.2003, 13:40


Не зарегистрирован







sad.gif ohmy.gif ЛЮДИ! Не дайте умереть....

Вернуться в Работа с базами данных в C++Builder