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


Автор: Yra 27.10.2006, 16:04
Всем привет.
дело такое :
на форме у меня Query, UpdateSQL, и всякое другое.
Сперва я редактирую некотурую запись.
При нажатии на кнопу "Обновить" исполняется код :
Код

Query1->ApplayUpdates();
Query1->CommitUpdates();
Query1->Close();
Query1->Open();

и запись обновляеться.
Но если в БД несколько одинаковых записей , то появляеться сообщение : Updates failed
(обновление провалено).
Потом я завершаю работу этого приложения, и сново его запускаю.....
И.... о чудо!! все одинаковые записи (одну из которых я редактировал) обновленны.

отсюда вопрос : Почему выдает ошибку? Как это исправить? Может кто посоветует
иной подход к редекции записей (что бы из одинаковых редактировалась избранная)?

Автор: Rodman 27.10.2006, 16:07
Обычно 
Код

Query1->Close();
Query1->Open();


хватает... больше ничего ты не напутал???

Автор: Romikgy 27.10.2006, 16:08
а че ид никакого нет (уникального)?

Автор: Yra 27.10.2006, 16:10
Rodman, просто в компоненте Query1-> CachedUpdates = true;
поэтому , что бы изменения вступили в силу, первые 2 оператора используються.
(ввод в БД буферезирован)

Добавлено @ 16:13 
Romikgy, нету....пробовал использовать поле Autoincrement , но возникают 
проблемы связанные с копированием записи.

Автор: Vyacheslav 27.10.2006, 16:16
А самом  генерить уникальный id слабо?
Кстати Autoincrement обычно не используются

Автор: Yra 27.10.2006, 16:20
Vyacheslav, еще не имею столько опыта.....и знаний.
Т.Ч. будь добр расскажи по подробней , где я могу про генерацию id 
прочитать, или  smile  пример напиши.

Автор: Vyacheslav 27.10.2006, 18:42
Ну например в коде можно генерить по времени или просто использовать GUID
Обычно я использовал GUID
Чтобы особо не задуматься на событие OnNewRecord вешаешь обработчик
и у Вас при вставке новой записи поле ID всегда будет заполнено
Код

void __fastcall TForm1::Table1NewRecord(TDataSet *DataSet)
{
     DataSet->FieldByName("ID")->AsString = CreateClassID();
}

Поле ID в этом случае строка, длиной 32.
Microsoft вроде бы гарантирует уникальность сгенеренного значения и следовательно такой метод можно вполне применять и при многопользвательской работе

Автор: Yra 27.10.2006, 22:56
Vyacheslav, спасибо за ответ.
Но что такое GUID?
когда это событие возникает ? (OnNewRecord)
есть ли это событие в компоненте Query?
это поле "ID" можно назвать скажем "No_zach" ?

Очень прошу, порекомендуй мне на эту тему хорошую книгу...

зарание спасибо за ответы. smile 

Автор: Romikgy 28.10.2006, 12:53
http://proklondike.com/database2.html

Автор: Yra 28.10.2006, 15:55
Romikgy, пОнЯтО !!! спасибо за ссылку!!! smile 

Автор: Yra 29.10.2006, 20:19
Всем спасибо........разобрался smile 

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