运行 从 ASP .NET 处理时未找到 SQLCMD

SQLCMD was not found when running Process from ASP .NET

我有一个 ASP .NET 应用程序作为进程启动 sqlcmd.exe。在我们三个测试环境中的两个中,我们没有遇到任何问题。但是,在第三台机器上,即使 sqlcmd.exe 与客户端连接工具一起安装,Process.exe 也找不到 sqlcmd.exe。显示的错误是:

Error running process: System.ComponentModel.Win32Exception (0x80004005): The system cannot find the file specified
       at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
       at L3_CNM.Utilities.Common.SqlcmdHelper.RunRemoteScript(String ServerAddress, String datbaseName, String filePath, String outputFilePath

我不知道为什么会这样。一切正常的情况与失败的情况之间的区别是:

1) 当它工作时,有一个完整的 SQL 服务器安装。当它失败时,我们只是将 sqlcmd 安装为下载的安装包,它指向驻留在其他地方的 SQL 服务器。

2) 运行时,应用程序 运行 来自与 Windows 安装相同的磁盘卷。在出现故障的机器上,应用程序安装在 Windows 安装的另一个卷上。

其他关键点 - PATH 变量显示 sqlcmd.exe 的位置,作为应用程序池身份的用户是本地系统管理员的一部分,当 运行 sqlcmd.exe通过命令提示符,结果是预期的。

如有任何帮助,我们将不胜感激。

谢谢

编辑:添加代码:

try
{
    Process process = new Process();
    process.StartInfo.FileName = "sqlcmd.exe";
    Logging.Instance.Log(Logging.Levels.Message, "Process start arguments: " + process.StartInfo.Arguments);
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    process.StartInfo.CreateNoWindow = true;
    if (process.Start())
        Logging.Instance.Log(Logging.Levels.Message, "Process successfully started");
    else
    {
        Logging.Instance.Log(Logging.Levels.Message, "Unable to start process");
    }
    string output = process.StandardOutput.ReadToEnd();
    output += process.StandardError.ReadToEnd();
    process.WaitForExit();
    Logging.Instance.Log(Logging.Levels.Message, "Process exited with output: " + output);
    return output;
}
catch (Exception e)
{
    Logging.Instance.Log(Logging.Levels.Error, "Error running process: " + e.ToString());
    return e.ToString();
}

我猜是关于 PATH 环境变量的。

几个测试!一、打开命令window并输入

WHERE SQLCMD

这将打印出任何可以看到 SQLCMD 的地方。如果您什么也没得到,则需要更新您的路径。如果你得到一些东西,它可能是一个用户环境变量,而不是系统环境变量,这是 ASP.NET 会使用的。

你能检查一下这个变量的 SYSTEM 版本是否包含正确的文件夹吗?在 win8 及更高版本上,打开开始菜单并键入 "edit the system environment variables"。然后点击 "environment variables" 并确保在系统变量下,PATH 包含 WHERE SQLCMD 返回的文件夹,如果没有,将其放入,并用分号与其他文件夹分隔。

一个简单的重启。上帝,我有时讨厌 Windows。

感谢@Methodman 的建议。