1

我目前通过调用带有参数的批处理文件来使用 osql 和 nant。以下是我的 nant 脚本中定义的属性(不,不是真实的用户名/密码值):

<property name="project.config" value="debug" />
<property name="server" value="(local)" />
<property name="database" value="Test" />
<property name="username" value="sa" />
<property name="password" value="password" />

然后我根据用户名/密码创建 osql 连接:

<if test="${username==''}">
  <property name="osql.connection" value="-E" />
</if>
<if test="${username!=''}">
  <property name="osql.connection" value="-U ${username} -P ${password}" />
</if>

然后我将这些值传递到我的批处理文件中:

<exec program="setup.bat">
   <arg value="${server}"/>
   <arg value="${database}" />
   <arg value="${osql.connection}" />
</exec>

setup.bat 文件使用 osql 删除数据库:

osql -S %1 -d master %3 -Q "IF EXISTS (SELECT * FROM sysdatabases WHERE name = N'%2') DROP DATABASE [%2]"

如果我不将用户名/密码传递给 nant 脚本并使用集成安全性(“-E”到 osql),这可以正常工作。如果我确实指定了用户名/密码,那么 nant 脚本就会暂停(就像它正在等待一些输入一样)。我知道我指定了正确的用户名/密码,因为我可以登录 SQL 连接管理器并删除数据库。

如果对尝试什么或替代方法有任何建议,请告诉我。

4

3 回答 3

2

这里有一些建议

  1. 为了帮助诊断 nant/batch 脚本的问题,回显正在执行的完整 osql 命令(来自批处理脚本)会很有帮助。这当然是为了确保在提供用户名/密码时正确扩展 osql.connection。
  2. 您使用我们不知道的批处理脚本可能还有其他原因。但是,为了帮助诊断问题,您可以使用直接将 osql.exe 作为程序传入的exec任务。同样,这只是为了直接使用 osql.exe 将批处理脚本取出来看看它是否有效。此外,您还可以使用echo任务在执行之前回显整个命令字符串。
  3. 对于完全不同的方法,您可以尝试作为NAntContrib发行版一部分的sql任务。很多时候,它是 osql.exe 的一个非常好的替代品。

也许通过尝试其中的一些,您将能够缩小到底发生了什么。在评论中发布您的发现,我很乐意尝试并提供帮助。

于 2008-11-21T15:37:55.683 回答
0

我认为您可能想尝试使用参数的顺序...我似乎记得过去被 OSQL 对参数顺序的敏感性所困扰。

这就是我现在所拥有的一切......对不起。

于 2008-11-21T15:07:57.867 回答
0

我猜 %3 仅扩展为“-U”。

大概可以通过以下方式解决

SET Server=%1
SET Database=%2
SHIFT 
SHIFT
osql -S %Server% ... %* -Q "...%Database%..."

或将属性值设置为包含双引号。

评论后更新:

请参阅这篇文章,了解如何从 shell 变量中删除引号,并将其应用于第三个参数。

于 2008-11-21T15:30:09.523 回答