NSIS- Обработка ошибок - PullRequest
       8

NSIS- Обработка ошибок

0 голосов
/ 08 января 2010

Я написал установщик и деинсталлятор в NSIS, который создает и удаляет базу данных SQL, которая работает нормально. Я написал несколько файлов .bat и .sql для создания и удаления базы данных, а затем просто вызываю эти файлы из сценария NSIS. Моя проблема заключается в том, что если я оставлю эту базу данных открытой в SQL Server Management Studio и в идеале запустю деинсталлятор, то должно появиться сообщение об ошибке, что база данных открыта. В моем случае он показывает сообщение об успешном удалении, но не удаляет базу данных должным образом. Как я могу обработать эту ошибку в NSIS?

Ответы [ 3 ]

1 голос
/ 08 января 2010

Это зависит от того, как вы вызываете эти файлы sql из NSIS. Предполагая, что вы используете командную строку SQL, вы можете использовать nsExec :: ExecToStack для захвата вывода. Обратите внимание на ограничение длины строки (которое можно изменить с помощью одной из специальных сборок NSIS): http://nsis.sourceforge.net/Docs/nsExec/nsExec.txt

Проверка на наличие ошибки в верхней части стека, которая указывает, вернула ли командная строка ненулевой код возврата. Если ошибки нет, вам все равно нужно проанализировать выходные данные команды sql, чтобы увидеть, не были ли в ней ошибки. Вам может потребоваться передать параметры в командную строку sql, чтобы указать подробный вывод ошибок и еще много чего. Это будет зависеть от вас, чтобы поэкспериментировать и посмотреть, какие сценарии дают какой выход. Обычно я записываю выходные данные из ExecToStack, чтобы я мог вернуться и посмотреть после того, что было возвращено.

0 голосов
/ 22 декабря 2013

Из моего опыта - обработка SQL и RDMS или других типов баз данных довольно неудобна, и вы всегда можете столкнуться с некоторыми проблемами, которые производитель ядра СУБД просто не скажет.

В настоящее время - самый подходящий способ (в моей производственной среде, который является очень универсальным, если сравнивать со всеми возможностями его настройки) обрабатывать вещи - это обрабатывать их в плагине NSIS и позволить Objecy Oriented Programming (например, если вы написали код на C # / C ++ / Delphi / .NET / и т. д.), заботитесь об обработке ошибок, а не об установщике. На самом деле - установщик должен только заботиться (если вы хотите сделать плагин повторно используемым, но не полностью привязанным к другому продукту с закрытым исходным кодом) о состоянии / фактологии системы, а не предоставлять вам логику для управления конфигурацией связанного продукта.

Как уже отмечали другие комментаторы, вы должны позаботиться о том, чтобы, по моему скромному мнению, слишком много опций и настроек, влияющих на саму кодовую базу установщика. Вы хотите получить требуемую логику для использования файлов SQL вместо того, чтобы возиться с перекомпиляцией NSIS, верно? :)

Конечно, использование nsExec является одним из способов сделать это, но если вы много играли с NSIS, я думаю, вы также могли бы прийти к выводу, что добавление управления стеками на основе плагинов отделено от плагина, заботясь о установке прилагаемого программного обеспечения или любая другая запрашиваемая логика, просто делает вашу реализацию и предопределенность кодовой базы непоследовательной и ненадежной.

Ответ - не делайте этого, но если у вас есть только этот вариант, сделайте его на основе некоторой методологии обратного вызова, а не сценариев оболочки или других функций, зависящих от ОС.

0 голосов
/ 06 мая 2010

Ваши файлы .bat должны выйти с кодом ошибки (например, 1). Когда вы вызываете .bat (я полагаю, с ExecWait) вы можете поймать код возврата. Затем вы сравниваете код возврата с ошибкой и вызываете функцию SetErrors, если они равны. Я могу дать вам пример кода, если вы хотите.

...