
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.60] |
![]() |
|
Сообщ.
#1
,
|
|
|
Привет всем!
![]() Delphi 7/Paradox/BDE Ситуация выглядит так: имеются несколько отдельных таблиц *.db В каждой из них имеется одно ключевое поле (типа autoincrement). И несколько обычных (целочисленные и строковые). Внешних ключей нет (соответственно таблицы между собой не связаны, каждая сама по себе). Работаю с таблицами через компоненту TQuery. Точнее у меня на каждую таблицу используется своя Query (так надо было: чтобы одновременно можно было наборы данных из разных таблиц в разных DBGrid смотреть, а через Query проще делать выборку по условиям). Запись новых строк делаю тоже через Query, но в следующей последовательности: создаю новый Query, выполняю insert для нужно таблицы, освобождаю Query. После, для связанного с таблицей Query делаю Close/Open. Кроме того, чтобы при запущенной проге никто извне не мог читать данные, стоят дополнительно компоненты Table с Exclusive=true. Эта программа стоит у достаточного количества пользователей. У некоторых из них через разное время перестали добавляться новые записи. Выдается ошибка "Key Violation". Читать данные можно, делать update тоже, а вот добавлять новые - нет. ![]() ![]() ---- ЗЫ: больней чем наступить на грабли, может быть только наступить на детские грабли! ![]() |
Сообщ.
#2
,
|
|
|
![]() надо с каждым TQuery иметь TUpdateSQL с соответствующими настройками. Возможно, глючит здесь. Цитата SilverShield @ стоят дополнительно компоненты Table с Exclusive=true не совсем понятно... ЗЫ. А нет возможности перейти на ADO? |
Сообщ.
#3
,
|
|
|
Цитата SilverShield @ Работаю с таблицами через компоненту TQuery. Точнее у меня на каждую таблицу используется своя Query (так надо было: чтобы одновременно можно было наборы данных из разных таблиц в разных DBGrid смотреть, а через Query проще делать выборку по условиям). Запись новых строк делаю тоже через Query, но в следующей последовательности: создаю новый Query, выполняю insert для нужно таблицы, освобождаю Query. После, для связанного с таблицей Query делаю Close/Open. Кроме того, чтобы при запущенной проге никто извне не мог читать данные, стоят дополнительно компоненты Table с Exclusive=true. ![]() ![]() ![]() если ею пользуются много народу, то BDE отпдает автоматически, так как это не клиент серверная БД!!! тебе нада InterBase или что-то похожее.... а твой проект это не детские грабли....это МЕГА ГРАБЛИ!!!! ![]() |
Сообщ.
#4
,
|
|
|
Запись новых строк производится не в самой проге, а вынесена в dll, потому и производится динамически. Через ADO, на сколько я знаю, Парадокс извратно использовать.
.DeV!L, все с тобой ясно. Действительно награмождение, но все-таки, есть мысли по делу? Хотяб в каком направлении копать? Добавлено .DeV!L, это локальная база, с ней надо работать только одному пользователю, так что с архитектурой все нормально. А про мега-грабли, читай ЗЫ ![]() |
Сообщ.
#5
,
|
|
|
Цитата SilverShield @ Запись новых строк производится не в самой проге, а вынесена в dll, потому и производится динамически. А кто тебе мешает в длл-ке иметь квери и апдейт-скл, созданные в дизайне? |
Сообщ.
#6
,
|
|
|
Coala, согласен, можно и в дизайне. Попробую поставить TUpdateSQL, он вроде кэшировать запросы позволяет?
|
Сообщ.
#7
,
|
|
|
Цитата SilverShield @ Через ADO, на сколько я знаю, Парадокс извратно использовать. Первый раз слышу ![]() Цитата SilverShield @ Попробую поставить TUpdateSQL, он вроде кэшировать запросы позволяет? Деталей не помню, но без него ты просто не создашь запрос на модификацию данных (в отличие от ADO). |
Сообщ.
#8
,
|
|
|
Цитата Coala @ Деталей не помню, но без него ты просто не создашь запрос на модификацию данных (в отличие от ADO). ![]() ![]() update Table1 set Col2 = ... where Col1 = ... ![]() ![]() ![]() TUpdateSQL applies cached updates on behalf of queries or stored procedures that can’t post updates directly. Взято из хелпа к нему. |
![]() |
Сообщ.
#9
,
|
|
А сколько записей в таблицах (чему равен максимальный id)?
|
Сообщ.
#10
,
|
|
|
Не больше 6000. Поэтому вариант с переполнением я и исключил.
Кстати, таким образом загнулось сразу несколько таблиц! Связей через ключи между этими таблицами нет. ![]() |
Сообщ.
#11
,
|
|
|
Цитата Главное причину понять, тогда я ее как-нить уже поборю. попробуй удалить и создать заново их индексы |
Сообщ.
#12
,
|
|
|
Цитата SilverShield @ Выдается ошибка "Key Violation". Полный текст сообщения можешь привести? |
Сообщ.
#13
,
|
|
|
Сообщение ошибки выглядит примерно так:
![]() ![]() "Project PTest1.exe raised exception class EDBEngineError with message 'Key violation'. Process stopped. ... " Но это уже последствия, когда все запорчено и просто нельзя добавить новые записи. Добавлено H.Iglesias II, подскажи если не трудно, через что пересоздание индексов делается? Мне это впервой, я обычно с MSSQL работаю ![]() |
![]() |
Сообщ.
#14
,
|
|
Цитата SilverShield @ через что пересоздание индексов делается? ![]() ![]() DROP INDEX table_reference.index_reference | PRIMARY CREATE [UNIQUE] [ASC | DESC] INDEX index_reference ON table_reference (column_reference [,column_reference...]) |
Сообщ.
#15
,
|
|
|
Спасибо. Только дело в том что я из индексов использовал только первичный ключ (поставил на автоинкрементное поле). В хелпе Database Desktop нашел такую фразу: первичный индекс в Paradox может быть создан только через определение первичного ключа при создании таблицы. Получается единственное решение - это грохать таблицу и создавать ее заново?
Если проблема в падении индексов, то все равно не понятно почему они упали сразу на нескольких таблицах с разной структурой и разным количеством строк! |
Сообщ.
#16
,
|
|
|
Цитата подскажи если не трудно, через что пересоздание индексов делается? Можно, например, в DatabaseDesktop открыть таблицу и там есть кнопка "Restructure" |
Сообщ.
#17
,
|
|
|
SilverShield, приведи фрагмент кода, которым делаешь добавление.
|
![]() |
Сообщ.
#18
,
|
|
Цитата SilverShield @ дело в том что я из индексов использовал только первичный ключ UNIQUE- гарантирует что два одинаковых не будет. Или "убей" поле и создай заново. Или попробуй это |
Сообщ.
#19
,
|
|
|
Цитата Bas @ UNIQUE- гарантирует что два одинаковых не будет. Точно, сам когда-то на эти грабли... |
Сообщ.
#20
,
|
|
|
Спасибо всем!
![]() ![]() Осталось только определить причину такого массового падения таблиц. Есть ли тут какая-то закономерность или это страшное проклятие Paradox? Может можно как-то это предотвратить? ![]() |
![]() |
Сообщ.
#21
,
|
|
Цитата SilverShield @ Убрать кэширование, как вариант. Может можно как-то это предотвратить? Добавлено Или при каждом Post вызывать FlushBuffers |
Сообщ.
#22
,
|
|
|
Цитата SilverShield @ Осталось только определить причину такого массового падения таблиц. Есть ли тут какая-то закономерность или это страшное проклятие Paradox? Может можно как-то это предотвратить? Причина Парадокс, решение только одно бежать подальше. |
Сообщ.
#23
,
|
|
|
У меня кэширование итак выключено (CachedUpdates = false). Для работы использую Query.
Наверное прийдется прибегнуть к координальному решению - смене БД ![]() А ведь парадокс по всем параметрам, кроме сбоеустойчивости подходил! ![]() Всем спасибо за помощь и обсуждение. ![]() |