![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с 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.