Builder и базы данных.
От: MaxEd Россия http://www.dhost.info/msiu/
Дата: 05.10.04 05:14
Оценка:
Имеется база данных в формате MS Access. Надо работать с ней, не используя визуальные "data-aware" компоненты. В базе имеются три таблицы (all_cards, editions, scripts) для работы с которыми я создал 3 TAAOTable и 1 TADOQuery, работающие с базой через один TADOConnection. Теперь, мне очень хочется вставить в таблицу scripts новую запись. Я делают это так:
DB_SCR->Insert();
DB_SCR->SetFields(...);
DB_SCR->Post();

(DB_SCR — это TADOTable, ответственный за работу с таблицей scripts).

Всё прекрасно работает, запись добавляется в базу данных, но: при попытке в дальнейшем изменить эту запись показывается ошибка "Не удаётся найти строку для обновления. Некоторые значения могли быть изменены со времени последнего чтения" (при использовании DB_SCR->Locate). Зато после перезапуска программы всё работает без запинку. OK. Похоже, я просто забыл освежить набор данных в таблице. Изменяем код:

DB_SCR->Insert();
DB_SCR->SetFields(...);
DB_SCR->Post();
DB_SCR->Refresh();

А вот теперь всё гораздо интереснее. Запись в базу данных добавляется, но на строке "DB_SCR->Refresh();" раздаётся ошибка "Источник данных изменил или удалил значение ключа для данной строки в хранилище данных. Теперь удалена и локальная строка". Объясните мне, пожалуйста, в чём я неправый.
Re: Builder и базы данных.
От: akasoft Россия  
Дата: 05.10.04 05:47
Оценка:
Здравствуйте, MaxEd, Вы писали:

ME>Объясните мне, пожалуйста, в чём я неправый.


А какие поля есть у этой таблицы? Есть поле типа (Код: counter, primary key)? Оно задаётся в SetFields()?

А ещё, "живыми" наборами надо управлять через коллекцию Properties, что-то вроде

ADODataSet1.Properties['Update Resync'].Value:= adResyncAutoIncrement + adResyncInserts;


Про это всё есть хороший цикл статей на Королевстве Дельфи, да и в этот форум я как-то постил...
... << RSDN@Home 1.1.4 beta 2 rev. 182>>
Re[2]: А как?
От: MaxEd Россия http://www.dhost.info/msiu/
Дата: 05.10.04 07:51
Оценка:
A>
A>ADODataSet1.Properties['Update Resync'].Value:= adResyncAutoIncrement + adResyncInserts; 
A>


A>Про это всё есть хороший цикл статей на Королевстве Дельфи, да и в этот форум я как-то постил...


А как будет выглядеть это действие в Builder'е? На одном из форумов я видел вот такую строку: "(*ADOTable1->Properties)["Update Resync"]->Value = adResyncAll;", но у меня Builder на неё ругается, говорит, что "E2094 'operator+' not implemented in type 'Properties' for arguments of type 'char *'".
Re[3]: Нет, не помогло
От: MaxEd Россия http://www.dhost.info/msiu/
Дата: 05.10.04 08:06
Оценка:
Так, нашёл, как сделать adResyncAll, но это не помогло. Теперь ошибка в строке
"DB_SCR->Post();"
"Дескриптор строки указывал на удалённую строку или строку помеченную на удаление".
Про таблицу:
она состоит из четырёх полей
id — primary key, autoincrement
card_id — integer
name — строка
code — memo
SetFields выглядит так:
DB_SCR->SetFields(ARRAYOFCONST(((void *)NULL, card_id,Form3->SC_NAME->Text)));
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.