![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Форумчанин
Регистрация: 26.07.2009
Сообщений: 216
|
![]()
Попробую объяснить все позиции по своему разумению, естественно (кроме "попробовала кинуть в другое место, копия получилась" - кто знает что на самом деле происходит в отдельно взятом компе).
Может кому в будущем пригодится. Если обрамлять путь+имя файла двойными кавычками (на что указал Stilet, и что правильно делает Liones), то неважно на каком языке написан путь к файлам. Испытано сотни раз. Ошибку 126 - можно не считать ошибкой (забавно?). Дело в том, что ShellExecute возвращает при успешном выполнении handl экземпляра запущенного приложения (не окна). При этом функция RaiseLastWin32Error вернет последнюю ошибку, которая произошла раньше (может в этом, а может быть и в другом месте приложения) и значение handl не совпадает со значением ошибки. Исчерпывающий список ошибок для ShellExecute приведен в справке к этой функции и только эти значения можно считать ошибками. Т.е. функция RaiseLastWin32Error в нашем случае для постоянного применения не годиться. В сухом остатке применение функции ShellExecute для запуска консольных приложений. Код:
|
![]() |
![]() |
![]() |
#12 |
Пользователь
Регистрация: 26.11.2008
Сообщений: 81
|
![]()
В общем, по результатам "народного тыка" получаем сухой остаток:
1. в коде все правильно Код:
Вот его содержание: gbak: ERROR:I/O error for file "D:\PRIL\DATA\BD.GDB" gbak: ERROR: Error while trying to open file gbak: ERROR: Процесс не может получить доступ к файлу, так как этот файл занят другим процессом. gbak:Exiting before completion due to errors В коде пыталась написать так: Код:
Может кто знает как это обойти? |
![]() |
![]() |
![]() |
#13 | |
Форумчанин
Регистрация: 26.07.2009
Сообщений: 216
|
![]() Цитата:
Обойти создание резервной копии, когда к базе есть коннект нельзя. Это общее место, о котором талдычут везде, где есть упоминание об IB и FB. "Если хотите иметь 100% испорченную копию, то пожалуйста, копируйте на здоровье когда к базе подключен клиент (клиенты)". А gbak этого вообще не позволяет. Можно, конечно, сделать shutdown базе перед резервным копированием, но в этом случае надо понимать что делаешь. Если без этого никак (что очень сомнительно), ищите по этому слову материал на ibase.ru. |
|
![]() |
![]() |
![]() |
#14 | ||
Пользователь
Регистрация: 26.11.2008
Сообщений: 81
|
![]() Цитата:
Цитата:
Я тут еще одну фишку заметила. Если в папке уже существует копия, то новая не создается. Т.е. получается надо удалить предыдущую, потом уже делать новую. А как ее удалить? |
||
![]() |
![]() |
![]() |
#15 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
I'm learning to live...
|
|
![]() |
![]() |
![]() |
#16 |
Форумчанин
Регистрация: 26.07.2009
Сообщений: 216
|
![]()
Если "в том то и дело, что нет", то скорее всего, из-за того что соединение на самом деле не сброшено (компоненты IBX грешат этим) или, может быть, не были завершены транзакции. В первом случае сложно сказать что делать (может быть попробовать в цикле отсоединяться). Во втором, перед Connected:=False проверить активность транзакций всех Dataset и завершить их (Commit). Хотя тоже "по воде вилами..."
Если Х.Борри "сказал", то почему бы не сделать как им сказано? Новая копия не создается из-за особенностей gbak (не позволяет перезаписывать). Самое простое - это создать bat-файл, в котором есть две команды: удаление копии и создание новой (с помощью gbak), а из приложения запускать этот bat-файл. А вообще то, резервные копии добрые люди делают не из основного приложения, а, уделяя этому особое внимание, применяют несколько иные способы. Нет, Stilet, gbak не умеет делать инкрементное добавление. Здесь причина прозаична (как выше сказано). |
![]() |
![]() |
![]() |
#17 | |
Пользователь
Регистрация: 26.11.2008
Сообщений: 81
|
![]() Цитата:
Только вот загвоздка: рядовому юзеру в принципе пофиг есть резервная копия базы или нет, поэтому я хотела сделать бэкап автоматом у меня тут еще одна мысль появилась: написать батник (удаление старого архива, архивация, запуск приложения), закрыть приложение, запустить батник, запустить приложение. Код:
1. файл не удаляется, ругается на команду del 2. после команды Application.Destroy; выдается сообщение "Runtime error 216 at 0040399 E" и приложение не запускается Последний раз редактировалось Stilet; 03.11.2010 в 13:13. |
|
![]() |
![]() |
![]() |
#18 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
В принициппе по-моему есть опция WAIT, которая заставляет ждать консоль пока эта команда (с этой опцией) отработает полностью и только тогда интерпретатор возьмется за выполнение другой команды. попробуй ее прикрутить может поможет. http://www.nevor.ru/comp/bat_files2.php
I'm learning to live...
|
|
![]() |
![]() |
![]() |
#19 |
Пользователь
Регистрация: 26.11.2008
Сообщений: 81
|
![]()
В общем я пришла к выводу, что самое простое пойти по пути разработчиков 1С. Написать отдельный модуль с набором административных действий, включить туда архивацию, лечение, восстановление БД и т.п.
|
![]() |
![]() |
![]() |
#20 |
Форумчанин
Регистрация: 26.07.2009
Сообщений: 216
|
![]()
Liones, очень правильное решение. Только это не "путь разработчиков" 1С, а путь реально мыслящих разработчиков баз данных, о котором в литературе упоминание (если память не изменяет) было еще лет 40 назад.
"Если вы хотите сберечь свои и пользователей нервы, не давайте пользователям заниматься администрированием баз данных, а тем более из клиентских приложений". Что-то в этом роде. Stilet, подзабыли, наверное. Консольные приложения, которые вызываются в bat-файлах не отдают управление сразу же в батник до тех пор пока не закончат свою работу. Скоро 7 лет как использую этот прием для резервирования файлов БД, размеры которых от 50 до 1800 Мб (на объемных файлах задумчивости gbak позавидуют и аксакалы). Работают батники и работают - "все простенько и со вкусом". Пример одного из таких файлов (может кому сгодится): Код:
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Delphi и командная строка | nusik | Общие вопросы Delphi | 5 | 26.10.2010 11:10 |
Командная строка | Morphling | Помощь студентам | 9 | 01.02.2010 00:27 |
Командная строка | Vladya | Помощь студентам | 4 | 09.02.2009 18:29 |
Командная строка | Dj_smart | Свободное общение | 2 | 23.08.2008 20:12 |
командная строка | Mails | Помощь студентам | 2 | 12.05.2008 18:29 |