Форум » [x]Harbour » ADS error 5023 » Ответить

ADS error 5023

Dima: Ошибка на ровном месте. Открыта куча баз со связями через set relation При выдаче команды Dbcloseall() вываливается ошибка 5023. Долго пытался понять что ему надо Помог следующий трюк [pre2] Перед Dbcloseall() , делаем вот так hb_waEval( {|| (Alias())->(DbClearRelation())} ) [/pre2]

Ответов - 17

Pasha: 5023 AE_INVALID_TABLE_HANDLE Advantage does not have a table open with the specified handle. dbCloseAll последовательно закрывает все таблицы Пусть для Т2 установлена связь к Т1 Закрывается Т1 Закрывается Т2. У нее есть незавершенные операции. Для их завершения реализуются relations, т.е идет обращение к уже закрытой Т1. ACE поднимает ошибку 5023. Т.е причина та же самая - незавершенные операции. Надо либо избегать этого, т.е. после каждого изменения обязательно выдавать dbCommit() dbUnlock() либо перед dbCloseAll() выдать: dbCommitAll() dbUnlockAll() и может быть что-то еще, сразу не скажу, что может быть.

Dima: Pasha Дело в том что я и в базу то ни чего не писал. Попробую Dbcommitall() спасибо

Dima: Pasha пишет: либо перед dbCloseAll() выдать: dbCommitAll() dbUnlockAll() Не помогло (в базу ни чего не пишется ) Странно но только вот работает hb_waEval( {|| (Alias())->(DbClearRelation())} ) а потом dbCloseAll() Вероятно глюк ADS , в DBFCDX и в LetoDB такого нет.


Dima: Снова косяк и весьма не приятный , хорошо свежий архив был. Слетела база прав пользователей , просто обнулилась (ни одной записи). В ADS_ERR вижу ошибки 7008 и затем 7038 Сторонние проги базу не юзают. Либо это не понятный глюк ADS , либо какой то глюк при копировании открытой базы (для создания архива) с помощью Hb_fcopy. А может причина в SSD винте и софтовых ошибках ...... SMART READ DATA Revision: 10 Attributes List 1: (SSD Raw Read Error Rate) Normalized Rate: 110 Sectors Read: 28022135 Read Errors: 0 5: (SSD Retired Block Count) Spare blocks remaining 100% Retired Block 0 9: (SSD Power-On Hours) Value 0 Total 1882 hrs 55 mins 12: (SSD Power Cycle Count) Power Cycle Life Remaining 100% Number of power cycles 21 171: (SSD Program Fail Count) Program Error Count 0 172: (SSD Erase Fail Count) Erase Error Count 0 174: (SSD Unexpected power loss count) Unexpected power loss Count 12 177: (Wear Range Delta) Wear Range Delta 1% 181: (Program Fail Count) Program Error Count 0 182: (Erase Fail Count) Erase Error Count 0 187: (SSD Reported Uncorrectable Errors) Normalized Value 100 lifetime URAISE Errors 0 189: (Unrecognized Attribute) Value: 30 Raw Data: 1e 00 4c 00 12 00 00 194: (SSD Temperature Monitoring) Normalized temp 30 Current 30 High 76 Low 18 195: (SSD ECC On-the-fly Count) Normalized Value 120 Sectors Read 28022135 UECC Count 0 196: (SSD Reallocation Event Count) Normalized Value 100 Reallocation Event Count 0 201: (SSD Uncorrectable Soft Read Error Rate)Normalized Value 120 Sectors Read 28022135 Uncorrectable Soft Error Count 0 204: (SSD Soft ECC Correction Rate (RAISE) Normalized Value 120 Sectors Read 28022135 Soft ECC Correction Count 0 230: (SSD Life Curve Status) Normalized Value 100 231: (SSD Life Left) Life Remaining 100% 233: (SSD Internal Reserved) 302 234: (SSD Internal Reserved) 37 241: (SSD Lifetime writes from host) lifetime writes 37 242: (SSD Lifetime reads from host) lifetime reads 21

Dima: Есть пара интересных мыслей по этому поводу и думаю что винт и ADS тут не при чем. Завтра чекану и отпишу.

Dima: В проге при входе в нее стоит проверка наличия баз данных. Если базы нет , она создается. Код примерно таков [pre2] if !HB_fileexists(PathUNC+"test.dbf") // PathUNC UNC путь к файлу dbcreate(..........) endif [/pre2] Единственное объяснение почему обнулилась база это вероятный сбой сети до HB_fileexists и ее восстановление после HB_fileexists и вот тут и произошло обнуление ну если конечно файл не был кем то открыт по сети , в этом случае обнуления не произойдет и прога выпадет с 32 ошибкой. Возможно такой мой подход не совсем верный и не нужно каждый раз проверять наличие баз данных и есть какой то другой подход. Готов выслушать советы. Спасибо.

SergKis: Dima пишет: Готов выслушать советы Проверку перенести в NETIO

Dima: SergKis пишет: Проверку перенести в NETIO Да вариант , спасибо. А пока что проверку наличия баз (*.dbf) отрубил совсем (за исключением пары файликов) так как на живой рабочей базе она ни к чему.

Haz: на вскидку два варианта: 1 попытаться проверить через ADS. Например используя AdsCheckExistence() , проверяя возвращаемое значение и возможную последнюю ошибку ADS AdsGetLastError() 2 не проверяя , цепляться через ADSConnect внутри begin sequence, если код ошибки вернет что такого файла нет - создать его в обработчике и выполнить повтор. Вроде как сетевые ошибки должны игнорироваться т.к. все происходит на сервере

Dima: Haz Тоже вариант , сенкс !

Dima: Тоже самое случилось тут , мой рецепт помог. Странный глюк однако.

Pasha: Я сначала грешил на rddads, см. 2-й пост в этой теме. Но, поскольку незавершенных операций нет, виноват скорее всего ace. Он тоже хранит информацию о relations, и у него наверняка есть свои незавершенные операции, и при последовательном закрытии файлов могут быть такие конфликты из-за relations. Но это только догадки, ace это черный ящик. У ace есть своя функция для закрытия всех таблиц одним вызовом - AdsCloseAllTables(), и в rddads есть даже обертка для нее. Но использовать ее нельзя, так как ace то таблицы закроет, а rddads об этом не знает, и будет пытаться закрыть уже закрытые таблицы, на что уже будет матюкаться ace. В этом случае надо использовать такой же прием, как в letodb: установить флаг закрытия, и в adsClose не выдавать запросы к ace, а только освободить соответствующие структуры данных для рабочей области.

Dima: Pasha пишет: В этом случае надо использовать такой же прием, как в letodb: установить флаг закрытия, и в adsClose не выдавать запросы к ace, а только освободить соответствующие структуры данных для рабочей области. Ты имеешь в виду немного допилить RDDADS ?

Pasha: Dima пишет: Ты имеешь в виду немного допилить RDDADS ? Ну да. Попробуй выдать много use, и затем: AdsCloseAllTables() dbCloseAll() Последний вызов даже необязателен, он будет по quit Какая ошибка выскочит ?

Dima: Pasha пишет: Ну да. Хорошо бы. Pasha пишет: Последний вызов даже необязателен, он будет по quit Какая ошибка выскочит ? Упало с виндовой ошибкой ;) Хорошо хоть без синьки обошлось.

Pasha: Дима, с днем программиста ! Меня к вечеру поздравили, иначе я бы и не вспомнил. Я как раз трошки по-про-грамм-ировал. Насчет пакетного закрытия. Есть 2 проблемы. Первая: AdsCloseAllTables закрывает только таблицы, а для закрытия sql-запросов такой функции нет. Но на нет и суда нет. Это вопрос sybase, а не наш. Их придется закрывать отдельно. Вторая касается rddads. К сожалению, rddads до сих пор не содержит структуры вроде AdsConnection, которая бы хранила бы параметры соединения. Добавить эту структуру - фигня вопрос. Но это сейчас не для меня, у меня давно нет установленного Ads, не могу проверить. А без проверки делать что-то в таком серьезном проекте как харбор не хочется. Поэтому сделать так красиво, как в letodb не получится. А именно: в rdd leto можно корректно работать с многими letodb-серверами. Поэтому сделал пока из расчета коннекта с одним сервером. Проверь по возможности пожалуйста. Функция AdsCloseAll(), ее достаточно просто вызвать перед закрытием программы. Я тебе на ящик скинул измененные сырцы.

Dima: Pasha пишет: Я тебе на ящик скинул измененные сырцы. Получил , ответил. Pasha пишет: Дима, с днем программиста ! Точно ;) Я и забыл. Спасибо и всех нас с праздничком ! Pasha пишет: А именно: в rdd leto можно корректно работать с многими letodb-серверами. ADS разве не может ? Думаю может ведь по IP адресу стучим к серваку все же. Не проверял конечно , так как пока нет такой необходимости.



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