运行 从 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 的建议。
我有一个 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 的建议。