我有一个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();
}
答案 0 :(得分:0)
我猜它是关于PATH环境变量的。
几个测试!一,打开命令窗口并输入
WHERE SQLCMD
这将打印出可以看到SQLCMD的任何地方。如果什么都没有,你需要更新你的路径。如果你得到了什么,它可能是一个用户环境变量,而不是系统环境变量,这是ASP.NET将使用的。
您可以检查此变量的SYSTEM版本是否包含正确的文件夹?在win8及更高版本中,打开开始菜单并输入"编辑系统环境变量"。然后点击"环境变量"并确保在系统变量下,PATH包含WHERE SQLCMD
返回的文件夹。如果没有,请将其放入,用分号与其他文件夹分开。
答案 1 :(得分:0)
简单的重启。上帝我有时讨厌Windows。
感谢@Methodman提出的建议。