Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с insert()

36K
04 октября 2010 года
Overmax2
63 / / 11.02.2010
Такая проблема:
Есть база данных MS Access. В ней 2 таблицы, одна является мастером для другой. Всё работает нормально, но как вызываю insert() для подчинённой таблицы пишется ошибка:

Project Project1.exe raised exception class EDatabaseError with message 'ADOTable'. Dataset not in edit or insert mode. Process stopped.

при чём после этого когда повторно нажимаешь run новая запись всё таки создаётся и сохраняется в базе данных.
Как это исправить?

Единственное что я смог придумать, это сделать второй объект ADOTAble без MasterSource и туда вводить новые записи а первый переактивировать чтобы там новые записи появлялись (По моему наихудший вариант).
11
04 октября 2010 года
oxotnik333
2.9K / / 03.08.2007
перед вставкой проверить режим, и если не в едит-моде, тогда перевести в него
36K
04 октября 2010 года
Overmax2
63 / / 11.02.2010
Извиняюсь не совсем понял. А зачем проверять edit мод, если я как раз вызываю ADOTable->Insert(), который должен добавить новую запись. Я не пользуюсь SQL-запросами.
11
04 октября 2010 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Overmax2
Извиняюсь не совсем понял. А зачем проверять edit мод, если я как раз вызываю ADOTable->Insert(), который должен добавить новую запись.


Что бы избежать вышеозначенного косяка, видимо не всегда перевод в режим редактирования происходит (о чем и сообщается в тексте ошибки).

Цитата: Overmax2
Я не пользуюсь SQL-запросами.


Очень зря, открой для себя удивительный мир SQL, и будут твои программы безглючны и шустры.

10
05 октября 2010 года
Freeman
3.2K / / 06.03.2004
Возможно, при потере фокуса редактором главной таблицы происходит автоматический CheckBrowseMode, приводящий к Post главной и Refresh подчинённой, из-за чего и теряется режим вставки.
36K
05 октября 2010 года
Overmax2
63 / / 11.02.2010
Цитата:

Сегодня 00:03
Freeman
Возможно, при потере фокуса редактором главной таблицы происходит автоматический CheckBrowseMode, приводящий к Post главной и Refresh подчинённой, из-за чего и теряется режим вставки.



Да возможно но не совсем тогда понимаю как умудряется теряться фокус. Вот код нажатия на кнопку при котором происходит ошибка :

 
Код:
void __fastcall TForm11::BitBtn1Click(TObject *Sender){
  DModulBase->ADOTLevelKnowledge->Insert();
}


При нажатии на эту кнопку уже вылетает ошибка. И после повторного нажатия на F9 (Run) в базу добавляется запись и при чём в новой записи уже содержится индекс ключа из базы MasterSource. Тоесть получается примерно так, вызывается метод insert(), в базе открывается поле для создания новой записи, туда автоматом записывается индекс базы MasterSource, вылетает ошибка и вызывается метод Post().

ДА такая же хрень происходит и если пытаться создать новую запись через DBGrid (когда просто нажимаешь стрелку вниз на последней записи).

Пока работает тока вариант как я написал выше с созданием нового объекта ADOTable без MasterSource тогда всё работает нормально.

P.S. oxotnik333 попробую перейти на SQL запросы, действительно так будет лучше.
10
05 октября 2010 года
Freeman
3.2K / / 06.03.2004
Обработчиков событий никаких нет? В любом случае, смотри отладчиком.
36K
05 октября 2010 года
Overmax2
63 / / 11.02.2010
Нет никаких обработчиков, вся проблема в связи MasterSource

Потеря фокуса может происходить как раз из за этого, так как при вставке нового поля происходить обращение к MasterSource. А кто нибудь знает как этого избежать или что делать? Не могу же я на каждой форме создавать новые ADO объекты, это ад какой -то.
1
05 октября 2010 года
kot_
7.3K / / 20.01.2000
Цитата: Overmax2
Нет никаких обработчиков, вся проблема в связи MasterSource

Потеря фокуса может происходить как раз из за этого, так как при вставке нового поля происходить обращение к MasterSource. А кто нибудь знает как этого избежать или что делать? Не могу же я на каждой форме создавать новые ADO объекты, это ад какой -то.


во первых - нет ничего страшного в создании ADO-объектов для конкретных задач. Во вторых - их таки желательно создавать не на форме, а в специальном объекте - TDataModule. В третьих - таки лучше создавать их динамически.

36K
06 октября 2010 года
Overmax2
63 / / 11.02.2010
kot_ спасибо всё в точку.

Тока, Я создаю один TDataModule к которому подключаю все формы или всё таки лучше делать несколько для каждой формы?
11
06 октября 2010 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Overmax2

Тока, Я создаю один TDataModule к которому подключаю все формы или всё таки лучше делать несколько для каждой формы?


TDataModule предназначен для того, что бы всю структуру и работу с БД держать в одном месте, и смысла их плодить нету (ну разве, что структура БД будет сложная).

1
06 октября 2010 года
kot_
7.3K / / 20.01.2000
Цитата: Overmax2
kot_ спасибо всё в точку.

Тока, Я создаю один TDataModule к которому подключаю все формы или всё таки лучше делать несколько для каждой формы?


Я лично использую подход - инкапсуляция всех операций для одного объекта. Т.е. например Клиент - и класс реализующий всю функциональность по БД к нему. Документ - и класс реализующий работу с БД для него. Если БД-логика пересекается - например соотношения клиент-документ - то для этих задач создается отдельный класс - возможно в качестве наследника.

36K
06 октября 2010 года
Overmax2
63 / / 11.02.2010
Всё понятно, всем спасибо! :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог