0

我在 NSIS 中编写了一个安装程序和卸载程序,它创建和删除一个运行良好的 sql 数据库。我编写了一些 .bat 和 .sql 文件来创建和删除数据库,然后从 NSIS 脚本中调用这些文件。我的问题是,如果我在 SQL Server Management Studio 中保持这个数据库打开并理想地运行卸载程序,它应该会给出一个错误消息,表明数据库已打开。就我而言,它显示卸载程序的成功消息,但不会正确删除数据库。如何在 NSIS 中处理此错误?

4

3 回答 3

1

这取决于您如何从 NSIS 调用这些 sql 文件。假设您使用的是 SQL 命令行,您可以使用 nsExec::ExecToStack 来捕获输出。请注意字符串长度的限制(可以使用 NSIS 的特殊版本之一进行修改): http: //nsis.sourceforge.net/Docs/nsExec/nsExec.txt

检查堆栈顶部的错误,这表明命令行是否返回非零返回码。如果没有错误,您仍然需要解析 sql 命令的输出以查看那里是否记录了错误。您可能需要将参数传递给 sql 命令行以指定详细的错误输出等。这将取决于您进行试验,看看哪些场景会产生哪些输出。我通常会记录 ExecToStack 的输出,以便我可以在事后查看返回的内容。

于 2010-01-08T15:35:10.967 回答
0

根据我的经验 - 处理 SQL 和 RDMS 或其他数据库类型非常不方便,您总是会遇到一些数据库引擎供应商不会简单说的问题。

目前 - 处理事情的最合适的方式(在我的生产环境中,这是非常通用的,如果与调整它的所有可能性相比)是在 NSIS 插件中处理它们并让面向对象的编程(例如,如果你写C#/C++/Delphi/.NET/等中的代码)关心错误处理,而不是安装程序。事实上 - 安装程序只应该关心(如果你想让插件重用,但不完全绑定到其他闭源产品)关于系统状态/事实,而不是为你提供处理捆绑产品配置的逻辑。

正如其他评论者所说,以我的拙见,您必须关心影响安装程序代码库本身的太多选项和设置。您想实现 SQL 文件利用所需的逻辑,而不是搞乱 NSIS 的重新编译,对吧?:)

当然,使用 nsExec 是一种方法,但如果您使用 NSIS 玩了很多,我想您也可能会得出结论,即添加基于插件的堆栈管理与插件分开,负责捆绑软件安装或任何其他需要的逻辑,只会让你的实现和代码库的preety不一致和不可靠。

答案 - 不要那样做,但如果你只有它的选项,那么就让它基于一些回调方法,而不是 shell 脚本或其他依赖于操作系统的功能。

于 2013-12-22T13:38:14.160 回答
0

您的 .bat 文件应退出并显示错误代码(例如 1)。当您调用 .bat (我假设使用 ExecWait)时,您可以捕获返回码。然后将返回代码与错误进行比较,如果它们相等,则调用 SetErrors 函数。如果你愿意,我可以给你一个示例代码。

于 2010-05-05T20:12:57.050 回答