On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение
администратор




Пост N: 2962
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.04.13 15:28. Заголовок: ADS error 5023


Ошибка на ровном месте.
Открыта куча баз со связями через set relation
При выдаче команды Dbcloseall() вываливается ошибка 5023.
Долго пытался понять что ему надо
Помог следующий трюк

 
Перед Dbcloseall() , делаем вот так hb_waEval( {|| (Alias())->(DbClearRelation())} )


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 17 [только новые]


Администратор




Пост N: 2839
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 08.04.13 16:03. Заголовок: 5023 AE_INVALID_TABL..


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()

и может быть что-то еще, сразу не скажу, что может быть.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2963
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.04.13 16:15. Заголовок: Pasha Дело в том чт..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2966
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.04.13 16:35. Заголовок: Pasha пишет: либо п..


Pasha пишет:

 цитата:
либо перед dbCloseAll() выдать:
dbCommitAll()
dbUnlockAll()



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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3274
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 06.07.13 15:28. Заголовок: Снова косяк и весьма..


Снова косяк и весьма не приятный , хорошо свежий архив был.
Слетела база прав пользователей , просто обнулилась (ни одной записи).
В ADS_ERR вижу ошибки 7008 и затем 7038
Сторонние проги базу не юзают. Либо это не понятный глюк ADS , либо
какой то глюк при копировании открытой базы (для создания архива) с
помощью Hb_fcopy.

А может причина в SSD винте и софтовых ошибках ......
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3277
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 06.07.13 21:38. Заголовок: Есть пара интересных..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3278
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.07.13 09:23. Заголовок: В проге при входе в ..


В проге при входе в нее стоит проверка наличия баз данных. Если базы нет , она создается.
Код примерно таков
 
if !HB_fileexists(PathUNC+"test.dbf")

// PathUNC UNC путь к файлу

dbcreate(..........)
endif

Единственное объяснение почему обнулилась база это вероятный сбой сети до HB_fileexists и ее восстановление
после HB_fileexists и вот тут и произошло обнуление ну если конечно файл не был кем то открыт по сети , в
этом случае обнуления не произойдет и прога выпадет с 32 ошибкой.
Возможно такой мой подход не совсем верный и не нужно каждый раз проверять наличие баз данных
и есть какой то другой подход. Готов выслушать советы.
Спасибо.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 221
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.07.13 11:02. Заголовок: Dima пишет: Готов вы..


Dima пишет:
 цитата:
Готов выслушать советы


Проверку перенести в NETIO

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3279
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.07.13 11:21. Заголовок: SergKis пишет: Пров..


SergKis пишет:

 цитата:
Проверку перенести в NETIO


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 74
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 07.07.13 11:52. Заголовок: А если попытаться проверить средствами ADS


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

Вроде как сетевые ошибки должны игнорироваться т.к. все происходит на сервере


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3280
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.07.13 12:04. Заголовок: Haz Тоже вариант , ..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3556
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.09.13 16:12. Заголовок: Тоже самое случилось..


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

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2984
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 13.09.13 16:40. Заголовок: Я сначала грешил на ..


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

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


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3557
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.09.13 16:43. Заголовок: Pasha пишет: В этом..


Pasha пишет:

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


Ты имеешь в виду немного допилить RDDADS ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2985
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 13.09.13 16:47. Заголовок: Dima пишет: Ты имее..


Dima пишет:

 цитата:
Ты имеешь в виду немного допилить RDDADS ?



Ну да.
Попробуй выдать много use, и затем:

AdsCloseAllTables()
dbCloseAll()

Последний вызов даже необязателен, он будет по quit
Какая ошибка выскочит ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3558
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.09.13 16:51. Заголовок: Pasha пишет: Ну да...


Pasha пишет:

 цитата:
Ну да.


Хорошо бы.
Pasha пишет:

 цитата:
Последний вызов даже необязателен, он будет по quit
Какая ошибка выскочит ?


Упало с виндовой ошибкой ;) Хорошо хоть без синьки обошлось.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2986
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 13.09.13 20:18. Заголовок: Дима, с днем програм..


Дима, с днем программиста ! Меня к вечеру поздравили, иначе я бы и не вспомнил.

Я как раз трошки по-про-грамм-ировал. Насчет пакетного закрытия.

Есть 2 проблемы. Первая: AdsCloseAllTables закрывает только таблицы, а для закрытия sql-запросов такой функции нет. Но на нет и суда нет. Это вопрос sybase, а не наш.
Их придется закрывать отдельно.

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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3559
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.09.13 21:00. Заголовок: Pasha пишет: Я тебе..


Pasha пишет:

 цитата:
Я тебе на ящик скинул измененные сырцы.


Получил , ответил.

Pasha пишет:

 цитата:
Дима, с днем программиста !


Точно ;) Я и забыл. Спасибо и всех нас с праздничком !

Pasha пишет:

 цитата:
А именно: в rdd leto можно корректно работать с многими letodb-серверами.


ADS разве не может ? Думаю может ведь по IP адресу стучим к серваку все же.
Не проверял конечно , так как пока нет такой необходимости.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 96
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет