Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"Ошибка - 502" [D6, IB5.x, dBase, FoxPro]


Страницы:   1 2

off ©   (2004-05-12 12:46:00) 

Привет! Такое дело: простенькая процедура типа insert... postперегоняет данные из Query в IBDataSet. И все ничего, но только на 60% вылазит сообщение:
Dynamic SQL Error
SQL error code=-502
Declared cursor already exists.

При этом данные коммитятся, хотя commit стоит в самом конце. Вопрос в том почему вылезла эта кака и как от нее избавиться?


Johnmen   (2004-05-12 16:20:00) [1]

А с этим никто и не спорил, кажись...:)


Курдль   (2004-05-12 16:17:00) [2]

СУБД ничего не изменит без commit-a! Другое дело, что явно его мы не видим - компоненты сами его посылают. Вот и в примере пропавшего автора та же фигня -
> При этом данные коммитятся, хотя commit стоит в самом конце.


Johnmen   (2004-05-12 16:12:00) [3]

>Vlad ©   (12.05.04 16:06) [19]

Конечно. Это просто некий общий случай...


Vlad   (2004-05-12 16:06:00) [4]


> Johnmen ©   (12.05.04 16:00) [18]


> I. Если не объявлены кэшированные изменения
> 1. При каждом post-е Датасет передает пакет из одного запроса
> на изменения одной записи. (тчк)
> 2. От клиента поступает команда завершить транзакцию.

Причем I.2 и II.5 совсем не обязательно. Зависит от того, какие компоненты используем и их настроек, а то может и вобще не быть сигнала ни на подтверждение ни на откат.


Johnmen   (2004-05-12 16:00:00) [5]

0. От клиента поступает команда стартовать транзакцию.
>1. От клиента поступает пакет запросов на обновление (insert/update/delete)
2. ---
...

I. Если не объявлены кэшированные изменения
1. При каждом post-е Датасет передает пакет из одного запроса на изменения одной записи. (тчк)
2. От клиента поступает команда завершить транзакцию.

II. При включенных кэшированных изменениях
1. При каждом изменении набора данных (insert/edit/delete) при вызове Post Датасет сохраняет в кеше дельту между предыдущим значением и текущим.
2. От клиента поступает команда стартовать транзакцию.
3. По команде ApplyUpdates ДатаСет формирует на основе всех дельт запросы к БД и они уходят.
4. Не прошедший запрос не сбрасывает кеш.
5. От клиента поступает команда завершить транзакцию.
6. Сами чистим кеш, если надо.


Vlad   (2004-05-12 15:49:00) [6]


> 1. При каждом post-е Датасет передает пакет из одного запроса
> на изменения одной записи + commit


Товарищ. Ну открой ты книжки умные чтоли.
Берем BDE ради классического примера.
У каждого алиаса есть параметр SQLPASSTHRU MODE, который как раз отвечает за то, нужно ли делать Commit транзакции или не нужно.
DataSet и его метод Post тут вобще непричем. Ну не отвечает он за Commit на сервере.


Курдль   (2004-05-12 15:29:00) [7]

Мои досужие мысли на тему СУБД (вдруг кому интересно).

Все СУБД создаются так, чтобы прдерживаться общепринятого протокола при работе с данными. Говоря коротко, действия с данными делятся на 2 основных вида - выборка (которая нам пока не интересна) и обновление.
Практически все изменения в данных СУБД производит по командам (инструкциям) извне. В общих чертах порядок обновления следующий:
1. От клиента поступает пакет запросов на обновление (insert/update/delete)
2. Если это первый запрос из пакета - открывается транзакция по умолчанию.
3. Выполняются все инструкции на обновление согласно запросов
4. Если приходит commit - все изменения утверждаются.
5. Если приходит rollback - все изменения отменяются.
Ключевая фраза: Если приходит commit

Мои досужие мысли о работе ДатаСэтов
I. Если не объявлены кэшированные изменения
1. При каждом post-е Датасет передает пакет из одного запроса на изменения одной записи + commit

II. При включенных кэшированных изменениях
1. При каждом изменении набора данных (insert/edit/delete) Датасет помечает затронутую запись специальным значением статуса - "добавлена/изменена/удалена", а в нетронутых оставляет статус "исходная".
2. По команде ApplyUpdates ДатаСет пробегает по всем измененным записям, выбирает для каждой соответствующий статусу запрос и передает его СУБД.
3. ДатаСет или юзер передает СУБД инструкцию Commit.
4. Если все прошло удачно, ДатаСет помечает все измененные записи, как "исходные".

Лейтмотив моей тиррады - ничто не происходит в СУБД без COMMIT-а!


Johnmen   (2004-05-12 14:54:00) [8]

>Что происходит (между клиентом и сервером), если есть
>TIBDatabase и связанный с ней TIBDataSet, когда скомандуешь
>последнему Post?

Если есть кеширование, то ничего.
Если нет, то выполниться соответствующий запрос.


Курдль   (2004-05-12 14:40:00) [9]

Объясните мне, - бесталкешке, (ну туплю!)!
Что происходит (между клиентом и сервером), если есть TIBDatabase и связанный с ней TIBDataSet, когда скомандуешь последнему Post?


Johnmen   (2004-05-12 14:19:00) [10]

Я даже скажу больше
Кеш, Post и Commit никак между собой не связаны (в глобальном смысле)


Vlad   (2004-05-12 14:16:00) [11]


> Курдль ©   (12.05.04 14:08) [11]

Нет, Post и Commit никак между собой не связаны


Курдль   (2004-05-12 14:08:00) [12]

А разве без кэша не происходит автоматический commit после каждого post? :(


Johnmen   (2004-05-12 14:04:00) [13]

>1. А какой имеет смысл Commit без режима кэшированных изменений?

Смысл стандартный. И кеш здесь непричём. (Дежа вю...)


Курдль   (2004-05-12 13:59:00) [14]

1. А какой имеет смысл Commit без режима кэшированных изменений?
2. Что прописано в IBDataSet1.InsertSQL?


Johnmen   (2004-05-12 13:48:00) [15]

Одно непонятно, зачем для простой вставки держать ещё и набор данных ?
Почему просто не сделать INSERT INTO ... ?


Соловьев   (2004-05-12 13:45:00) [16]


> При этом данные коммитятся, хотя commit стоит в самом конце

потому как у тебя стоит AutoCommit = true


off   (2004-05-12 13:40:00) [17]


> Курдль ©   (12.05.04 13:37) [5]

Commit стоит после цикла while not ... do begin ... end


Курдль   (2004-05-12 13:37:00) [18]

А где тогда commit стоит в самом конце.?
И что стоит в самом начале?


off   (2004-05-12 13:36:00) [19]


> Курдль ©   (12.05.04 13:29) [3]

CachedUpdates - False


Курдль   (2004-05-12 13:29:00) [20]

А как выставлены кэшированные изменения IBDataSet1?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо