Форум » [x]Harbour » Мусор в базах... » Ответить

Мусор в базах...

Loach: Может кто сталкивался с такой гадостью: Задачка работает у пользователей (все базы в shared режиме, но чаще всего на 1 компе у каждого). Базы без индексов не открываются. И иногда создается такое впечатление, что кто-то или что-то дописывает какой-то мусор (типа куски памяти, куски баз, куски индексов) в конец базы. ПРИЧЕМ! индексы при этом не трогаются, остаются красивыми. В итоге при следующем входе в программу все работает корректно, к базе добавляются строки, мусор не виден до первой переиндексации. Понимаю, что сумбурно все объяснил, но может у кого какие мысли будут? Пы.Сы. XHarbour 0.99.51 + FWH 2.5

Ответов - 36, стр: 1 2 All

Haz: Andrey пишет: Не проходит .... Нужно делать 2 проверки: на IDZ > 0 и TSZ > 0 Задача для школьника , Проверок нужно делать столько, сколько потребуется чтобы поймать все , включая валидные значения ID, даты в полях и пр. Не нули в значениях времени это не 100% гарантия . Для первого твого скрина по этой теме пойдет, а дальше ....тут нет телепатов чтобы читать в астрале данные из твоей базы.

Andrey: Всё таки самый простой способ это моё первое предложение. по первому полю (AutoInc) последовательное копирование полей с запоминанием номера при разрыве записей и продолжением копирования. Ну и доп.проверки по другим полям.

Haz: Andrey пишет: с запоминанием номера при разрыве записей Обычно Autoinc работает примерно так В заголовке базы храниться последнее значение и при добавлении записи оно инкрементируется. Если в базе были удаления и паки - то разрывы в нумерации будут 100 % ( автоинк не восполняет дыры ) Andrey пишет: проверки по другим полям. Вот это единственный правильный способ. Как вариант - можно не копировать а удалить мусор по условию и пакануть .


nick_mi: Какая-то подозрительно регулярная порча базы. Портится, судя по скрину, одно поле, хотя если данные портятся, то крякозябры должны быть во всех полях, если связано с аварийным завершением. А посмотреть базу, именно порченные места в WIN кодировке не пробовал ?

Andrey: nick_mi пишет: Портится, судя по скрину, одно поле, хотя если данные портятся, то крякозябры должны быть во всех полях, если связано с аварийным завершением. Сбойные поля все кракозябы: Смотреть нечего !

Dima: Andrey пишет: Смотреть нечего ! nick_mi пишет: А посмотреть базу, именно порченные места в WIN кодировке не пробовал ?

Andrey: Dima пишет: nick_mi пишет: цитата: А посмотреть базу, именно порченные места в WIN кодировке не пробовал ? Последнее поле CHUMKVAR на картинке (номер дома, строка). Ну и что там в ней смотреть ? Кто попробует расшифровать ? И так везде в битых записях. Нормальные записи вытащил и всё прекрасно читается.

vvv: А если тупо железо виновато? Винт сбойный или что-то в этом роде?

Andrey: vvv пишет: А если тупо железо виновато? Винт сбойный или что-то в этом роде? Да тут много чего может быть. Починил базу, пока проблем нет. Скорее всего "скачки" электроэнергии, мусор тогда и пишется. Встречал захломлённую WinXP на которой периодически писался мусор в базы. Переустановка ХР решило проблему.

rvu: Andrey пишет: Вообще в нормальных прогах (типа БЭСТ или других) предусмотрено поле в базе с контрольной суммой записи. А есть в Харборе стандартные функции для вычисления контрольной суммой записи? Для контрольной суммы файла, я знаю, есть hb_md5file и hb_crc32. Или они не только для файлов? Кстати, чем они отличаются? Я использовал только hb_md5file.

Pasha: rvu пишет: А есть в Харборе стандартные функции для вычисления контрольной суммой записи? Для контрольной суммы файла, я знаю, есть hb_md5file и hb_crc32. Или они не только для файлов? Кстати, чем они отличаются? Я использовал только hb_md5file. Стандартной функции нет, но ничего не мешает сделать свою Мне самому когда-то пришлось при добавлении записи заполнять поле crc32, по конкатенации всех остальных полей записи, преобразованных в строку. При чтении записи соответственно crc32 проверялось

Andrey: Можно ещё в базу самым первым полем поставить [pre2] AADD( aDbf , {"ID" ,"+", 8, 0 } ) // автоинкремент[/pre2] тогда при сбоях можно визуально в программе dbedit.exe видеть и удалять "мусор" из базы.

Dima: rvu пишет: А есть в Харборе стандартные функции для вычисления контрольной суммой записи? Pasha пишет: Стандартной функции нет, но ничего не мешает сделать свою Сделал или подсказать ?

rvu: Dima пишет: Сделал или подсказать ? Выяснил, что hb_crc32 можно не только для файлов использовать, но и для полей. Пока у себя не делал, но даже если бы и сделал, все равно с интересом бы посмотрел другой пример.

Dima: rvu Например так можно [pre2] cc:="" for i = 1 to fcount() cc+=hb_valtoexp(fieldget( i )) // или что то другое вместо hb_valtoexp next hb_md5(cc) // или hb_crc32(сс) [/pre2]

rvu: А еще из функций CHECKSUM() есть.



полная версия страницы