【发布时间】:2011-12-07 10:25:48
【问题描述】:
这是一个非常奇怪的情况,但我无法指出我做错了什么。
我正在执行一大堆 SQL 脚本(主要是表创建脚本)。它们通过 Java 执行,使用 sqlcmd。这是我使用的sqlcmd 命令。
sqlcmd -m 11 -S SERVER -d DB -U USER -P PASS -r0 -i "SCRIPT.sql" 2> "ERRORS.log" 1> NULL
注意:我使用-r0 并重定向以确保只有错误进入日志文件。我丢弃了所有的 STDOUT。
现在我在 Java 中执行这个命令,使用 getRuntime.exec(),就像这样。
Runtime.getRuntime().gc();
strCmd = "cmd /c sqlcmd -m 11 -S SERVER -d DB -U USER -P PASS -r0 -i \"SCRIPT.sql\" 2> \"ERRORS.log\" 1> NULL"
Process proc = Runtime.getRuntime().exec(strCmd);
proc.waitFor();
注意:我使用cmd /c,以便命令在自己的shell 中运行并优雅退出。此外,这有助于立即读取错误日志以查找错误。
问题!
当在命令提示符下手动运行时,此命令可以完美运行(即按预期创建表)。但是,如图所示通过 Java 执行时,脚本会运行,并且没有错误、没有异常、日志中没有任何内容。 但是,在签入 SSMS 时,表格不存在!
我什至从哪里开始调试这个问题?
更新:我是个白痴
getRuntime().exec方法的返回值为1,应该是0,表示正常执行。
关于如何解决这个问题的任何指示?
更新 2
我查看了进程的 ErrorStream,这就是它所具有的。
Sqlcmd:错误:打开或操作文件 2 时出错> (原因:文件名、目录名或卷标语法是 不正确)。
看起来我经过的路径是错误的。错误日志进入我的配置文件目录,即C:\Documents and Settings\my_username。路径中的空格重要吗?反正我是双引号!
【问题讨论】:
-
你试过从进程中读取输出流吗?
-
@RogerLindsjö 好的,所以我尝试获取 ErrorStream,它显示错误“Sqlcmd:错误:打开或操作文件 2 时发生错误>(原因:文件名、目录名或卷标语法不正确”
-
你必须重定向流吗?处理这些解析应该是 cmd 的工作。但是,如果您完全跳过重定向并处理 Java 格式的流,您可以使其工作吗?
-
我不想对使用 Java 的流做任何事情。所以我决定让 SQLCMD 处理它。现在这个问题突然出现了,我利用 ErrorStream 来查看它。另外,看看我的第二次更新。
标签: java sql sql-server-2008 sqlcmd