Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.31;
Скачать: CL | DM;

Вниз

Проблема с TClientDataSet   Найти похожие ветки 

 
Loginov Dmitry ©   (2006-10-05 11:10) [0]

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

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

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


 
Loginov Dmitry ©   (2006-10-05 11:55) [1]

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


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

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


 
Loginov Dmitry ©   (2006-10-05 12:53) [3]

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


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

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

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


 
Loginov Dmitry ©   (2006-10-05 13:09) [5]

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


 
Sergey13 ©   (2006-10-05 13:12) [6]

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

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


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

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


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

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


 
Loginov Dmitry ©   (2006-10-06 09:42) [8]

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


 
Loginov Dmitry ©   (2006-10-12 11:56) [9]

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

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


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

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

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


 
Sergey13 ©   (2006-10-17 09:58) [11]

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

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


 
ANB ©   (2006-10-17 10:11) [12]

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


 
Desdechado ©   (2006-10-17 10:36) [13]

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



Страницы: 1 вся ветка

Текущий архив: 2006.12.31;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.055 c
1-1163079758
Сатир
2006-11-09 16:42
2006.12.31
Прорисовка формы на панели другой формы


15-1165323891
Экспериментатор
2006-12-05 16:04
2006.12.31
Жесткий диск в режиме PIO


6-1155121126
Юра
2006-08-09 14:58
2006.12.31
TClientSocket и интернет


15-1166026852
Виста
2006-12-13 19:20
2006.12.31
Кряк для Висты


15-1165842155
Beavercrazy
2006-12-11 16:02
2006.12.31
Каким образом выполнить задачу по информированию клиентов?