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

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

Проблема с TClientDataSet


Loginov Dmitry ©   (2006-10-05 11:10:00) 

Имеется система, разработанная по технологии MIDAS и состоящая из следующих звеньев :
- приложение-клиент на РМ оператора (используются компоненты TClientDataSet, TDCOMConnection)
- приложение-сервер (DCOM сервер) (используются компоненты TQuery, TDataSetProvider)
- BDE

Если в TClientDataSet на клиенте добавить к примеру 1000 записей, то вызов метода TClientDataSet.ApplyUpdates(-1) приводит к тому, что физически в базу данных добавляются первые 255 записей, и выдается Exception с текстом "Data structure corruption".

Как сделать, чтобы добавлялись все записи?


Desdechado   (2006-10-17 10:36:00) [1]

> а там уже работа с изменениями идет с помощью TQuery и без всяких транзакций
Если ты явно не указываешь транзакцию, то каждая команда неявно выполняется в отдельной транзакции.
Подразумевает ли это твоя бизнес-логика? Есть подозрения, что нет...


ANB   (2006-10-17 10:11:00) [2]

Дополню - так же убедится в том, что при генерации SQL заранее присвоенные значения не затираются пустыми.


Sergey13   (2006-10-17 09:58:00) [3]

> [10] Loginov Dmitry ©   (17.10.06 09:39)

На OnNewRecord вбивать эти значения. В "нормальных" БД эти значения можно вытащить и из самой БД. В парадоксе не знаю - возможно просто в код придется вводить.


Loginov Dmitry   (2006-10-17 09:39:00) [4]

Очередные грабли при решении данной задачи:

Потребовалось вносить изменения в  БД в рамках некой транзакции. Казалось бы самый простой вариант - имитировать ее с помощью CachedUpdates и CommitUpdates. Грабли в том, что функция CommitUpdates игнорит правила изменения полей, заданные при создании таблицы БД (в ДескТопе). Т.е. при добавлении записи игнорятся значения полей, заданные по умолчанию.


Loginov Dmitry   (2006-10-12 11:56:00) [5]

Все-таки решил эту проблему!

Способ следующий:
при нажатии кнопки "Принять" анализируются записи, хранящиеся в свойстве Delta. Формируется список изменений в строковом виде, затем полученная строка передается на сервер, а там уже работа с изменениями идет с помощью TQuery и без всяких транзакций. Весьма геморный способ, конечно (неделю долбил), зато вполне оправданный (проще, чем перейти к другой базе данных).


Loginov Dmitry   (2006-10-06 09:42:00) [6]

Блин! Вот влип! Свойство Delta оказывается - ReadOnly :(((


Loginov Dmitry   (2006-10-05 15:03:00) [7]

Sergey13 ©   (05.10.06 13:12) [6]
А велика ли система?


До меня ее уже лет 5 разрабатывали. Но там такие прогеры работали, что нет слов. Ну 255 записей сохранит, ну и фиг с ним - не ихнее это дело :).

А переписывание не катит - на это уйдет порядка года (с моим-то пол-ставочным графиком работы).


Sergey13   (2006-10-05 13:12:00) [8]

> [5] Loginov Dmitry ©   (05.10.06 13:09)

А велика ли система? Может проще переписать ее, чем так париться?


Loginov Dmitry   (2006-10-05 13:09:00) [9]

А чем плох Delta? Я думаю сделать следующим образом:
создать новый TClientDataSet (второй), в который копирнуть свойство Delta.
У исходного датасета обнулить свойство Delta.
Далее создать еще DataSet (третий), в который копировать скажем по сотне записей из второго, после чего присваивать его свойство Delta свойству Delta исходного набора, и для исходного набора делать ApplyUpdates.
Мне кажется, должно прокатить.


MsGuns   (2006-10-05 12:58:00) [10]

>Loginov Dmitry ©   (05.10.06 12:53) [3]
>Ой как нехорошо. Придется это исправлять. А это значит - копаться в данных Delta и передавать на сервер по 255 записей. Может у кого есть мысли, как это сделать по-проще?

С парадоксом ? Разве что накапливать изменения в локальном файле-табличке, а потом гетерозапросом Insert добавлять в "основную".


Loginov Dmitry   (2006-10-05 12:53:00) [11]

Ой как нехорошо. Придется это исправлять. А это значит - копаться в данных Delta и передавать на сервер по 255 записей. Может у кого есть мысли, как это сделать по-проще?


Sergey13   (2006-10-05 12:00:00) [12]

Боюсь соврать, но вроде тут мелькало недавно, что у парадокса какие то типа внутренние транзакции для таблицы поддерживают как раз 255 изменений.


Loginov Dmitry   (2006-10-05 11:55:00) [13]

Кстати, база данных состоит из табличек Paradox.


Наверх

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