Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];

Вниз

Проблема с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.046 c
2-1165692889
FIL-23
2006-12-09 22:34
2006.12.31
QReport


15-1165829210
RightD
2006-12-11 12:26
2006.12.31
Кто запустил программу?


11-1142772736
Dim@s
2006-03-19 15:52
2006.12.31
VCL & KOL


15-1165475150
codeCleaner
2006-12-07 10:05
2006.12.31
Удобочитаем ли следующий код?


15-1165766364
vidiv
2006-12-10 18:59
2006.12.31
Как в ASPLinux поставить KDE?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский