1

我正在OSQL通过 inno setup 执行一些 sql 查询。我正在使用以下代码运行OSQL。这仅用于示例目的

SQLQuery:= '"EXEC sp_addserver ''PCNAME'';"';
Param:= '-S(local) -Usa -Psa -Q ' + SQLQuery;
Exec('osql.exe', Param, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);

这工作正常。问题是ResultCode值始终为 0。即使查询没有被执行。例如,如果我尝试像下面这样的相同查询,其中我传入了一个无效的存储过程名称,ResultCode它仍然是 0。

SQLQuery:= '"EXEC sp_invalidname ''PCNAME'';"';
Param:= '-S(local) -Usa -Psa -Q ' + SQLQuery;
Exec('osql.exe', Param, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);

为什么不给我一个正确的代码。如果我在管理工作室中运行第二个查询,我会收到这样的错误

Msg 2812, Level 16, State 62, Line 1 Could not find stored procedure 'sp_invalidname'

这里的返回码是2812. 当我通过 inno 运行它时,为什么我没有得到这个。我需要做什么才能在 inno 中获取此错误代码?

4

1 回答 1

2

感谢 TLama,我更新了我的代码,如下所示,它现在可以工作了。我必须添加-b命令行参数,现在如果命令失败,它会返回 1。

-b 指定 osql 在发生错误时退出并返回 DOS ERRORLEVEL 值。当 SQL Server 错误消息的严重性为 11 或更高时,返回给 DOS ERRORLEVEL 变量的值为 1;否则,返回值为 0。Microsoft MS-DOS 批处理文件可以测试 DOS ERRORLEVEL 的值并适当地处理错误。

我更新了我的代码如下。

Param:= '-S(local) -Usa -Psa -b -Q ' + SQLQuery;

它在文档中进行了解释。

于 2015-03-05T16:36:44.680 回答