水晶报道。使用MVC在Windows Server 2008中找不到“指定的路径”

时间:2015-01-06 07:59:42

标签: c# asp.net-mvc crystal-reports

这可以在计算机中正常工作,但是当我将其部署到客户端测试服务器时。弹出此错误。服务器是Windows Server 2008标准版。我已经检查了rpt的路径并安装了CRV并允许访问所有人。我花了将近2天仍然无法找到解决方案。

Server Error in '/QC' Application.

The system cannot find the path specified.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Runtime.InteropServices.COMException: The system cannot find the path specified.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[COMException (0x80004005): The system cannot find the path specified.
]
   CrystalDecisions.ReportAppServer.Controllers.ReportSourceClass.Export(ExportOptions pExportOptions, RequestContext pRequestContext) +0
   CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext) +1140
   CrystalDecisions.CrystalReports.Engine.FormatEngine.ExportToStream(ExportRequestContext reqContext) +656
   CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToStream(ExportOptions options) +111
   CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToStream(ExportFormatType formatType) +99
   Sanipex.Infrastructure.Label.PrintToImage(String inputPath, String parameter, String outputPath, ImageFormat formatType) +482
   Sanipex.Controllers.WarehouseController.ScanLabel(Nullable`1 qty, Nullable`1 missinglabel, String txtdate, String product, Nullable`1 linenumber, Nullable`1 ordernumber, String btnsubmit, SessionData model, Cases casemodel) +17807
   lambda_method(Closure , ControllerBase , Object[] ) +465
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +182
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
   System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +28
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32
   System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +58
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +225
   System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34
   System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +24
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +99
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +39
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +29
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +25
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +31
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9631916
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.17929

12 个答案:

答案 0 :(得分:2)

我在部署水晶报告方面遇到了类似的问题。问题通常是在服务器上安装正确的水晶报告运行时,正确的意思是32或64位 - 取决于iis网站的设置方式。

另一个问题是该站点在IIS中运行的用户 - 确保它可以访问文件所在的位置。

答案 1 :(得分:1)

这可能是误导性错误。

在我的情况下,报告的存储过程通常有效,但是当以特定格式传递参数时,它将失败,这将导致The system cannot find the file specified异常。

答案 2 :(得分:1)

我遇到了同样的问题,但是看到一份报告正在运行,我检查了你的财产并与那些不起作用的财产进行了比较。实际上,Crystal保留了开发人员计算机上定义的连接类型,如果在服务器上没有安装该连接,则应用程序将失败。要纠正这一点,必须改变连接类型。在我的情况下,我用SQLOLEDB替换SQLNCLI11。

在VS2015上,选择您的报告,然后转到菜单“Crystal Reports”&gt;&gt; “数据库”&gt;&gt; “设置数据库位置”,然后展开“属性”。

在“Provider”属性上更改连接类型。我把SQLOLEDB和我的报告完美地运用了。

答案 3 :(得分:0)

请检查您是否在visual studio下的水晶报告文件属性中选择Copy to Output Folder"Copy Always"

Copy to output folder

在其他计算机上试用它,如果有效,则可以尝试在Server 2008计算机中重新安装Crystal Report Viewer。

在开发系统中,您可能已直接运行,在那里您不会遇到此错误,但在部署时您可能会遇到这些错误。

Here是给定异常的一种解决方案。

答案 4 :(得分:0)

如果我们为他加载数据,就会发现Crystal Report会这样做。但是提供连接信息可以使它工作。

var report = new ReportDocument();
report.Load("FILE PATH HERE");

report.SetParameterValue("@myParameter", "Value");

var connectionBuilder = new SqlConnectionStringBuilder(connectionString);

foreach (var connection in report.DataSourceConnections)
{
   if (connectionBuilder.IntegratedSecurity)
   {
       connection.SetConnection(connectionBuilder.DataSource, connectionBuilder.InitialCatalog, true);
   }
   else
   {
       connection.SetConnection(connectionBuilder.DataSource, connectionBuilder.InitialCatalog, connectionBuilder.UserID, connectionBuilder.Password);
       connection.IntegratedSecurity = false;
    }
}

return report.ExportToStream(ExportFormatType.PortableDocFormat);

答案 5 :(得分:0)

我遇到了同样的问题,我的修复方法是确保两台机器之间的ODBC连接相同。在这种情况下它正在寻找的文件似乎是ODBC连接参数。此外,请确保您的机器之间有关于位数的相同设置。同样,32位ODBC设置与64位ODBC设置必须匹配CR正在寻找的。

答案 6 :(得分:0)

确保您的Crystal报表没有任何公式字段或与未使用的数据库链接的任何其他公式字段。 我有同样的问题,我在我的Visual Studio项目中添加了一些由某人制作的水晶报表,我只是更改了SQL查询并建立了与我想要连接的数据库的ODBC连接,我认为它应该可以正常工作。但我得到错误信息。 &#34;系统无法找到指定的路径。&#34; 在一次又一次地调试到水晶报告代码后,我才知道问题在公式字段中。 最后问题解决了。 谢谢 快乐编码

答案 7 :(得分:0)

我们在不同的机器上编译应用程序时遇到了类似的问题。这是由于子报告的路径不正确。确保始终可以访问子报表的路径。这解决了我们这方面的问题。

答案 8 :(得分:0)

即使连接都指向同一连接,ODBC连接也需要命名相同。如果您有一个包含多个子报表的报表,并且任何数据连接的命名方式不同,您将收到“找不到路径”错误。

答案 9 :(得分:0)

错误消息通常没有任何意义。我遇到的一个案例是查询在环境中安装的oracle版本中运行不正常。但它确实在开发报告的环境中正常运行。我遇到的另一个案例是其中一个子报告在oracle中使用了不同的数据类型进行比较,似乎有些实例支持而其他实例会抛出错误。而且他们都只有相同的无信息错误信息。

答案 10 :(得分:0)

我知道这是一个旧线程,但是在部署到Windows Server 2016时遇到了相同的错误。它在本地运行良好,但是一旦部署到服务器,就会引发“找不到指定的路径”错误。 / p>

解决该问题的方法:我去了IIS,并创建了一个虚拟目录,该目录指向报告所在的/ AppName / bin / Reports文件夹。

一切都很好!

答案 11 :(得分:0)

我刚刚花了最后五个小时来弄清楚为什么两个报表在dev中能很好地工作但是在服务器上却失败了。最初它们是由视图提供的,但是我将它们更改为使用存储过程,这就是问题所在(不过仅在服务器上)。

我只是(非常简单地)记录使这些工作要做的事情:

我的第一个问题是存储过程正在接收所有参数的NULL值。这是因为,当将报表的连接(ODBC)设置为指向服务器时,报表将丢失其参数映射到存储过程。在应用登​​录信息之前,我需要将表的名称分配给表的TableName属性,然后在以下情况下需要将名称分配给表的Location属性:

foreach(var crTable in doc.Database.Tables) {
    crystalTableLogOnInfo = crTable.LogOnInfo;

    crystalTableLogOnInfo.ConnectionInfo.ServerName = strDSNName;
    crystalTableLogOnInfo.ConnectionInfo.DatabaseName = strDBName;
    crystalTableLogOnInfo.ConnectionInfo.UserID = strUserName;
    crystalTableLogOnInfo.ConnectionInfo.Password = strPassword;
    crystalTableLogOnInfo.TableName = crTable.Name; // this line
    crTable.ApplyLogOnInfo(crystalTableLogOnInfo);
    crTable.Location = crTable.Name;                // and this line
}

doc.VerifyDatabase();

一旦我添加了这两行,存储的proc就收到了参数值,但是当我调用它的ExportToStream方法时,报告失败。偶然地我发现我需要重命名报表中的表。我之所以必须这样做,是因为当我将视图换成存储过程时,Crystal有效地使用原始视图的名称对存储的proc进行了别名,并且我猜想在潜在的情况下,Crystal应该在使用实数时使用别名。基础表/视图/进程。使用“数据库专家”,我用鼠标右键单击了原始视图的名称(在“选定表”框中),选择了“重命名”,并将其更改为由分号和数字连接的存储过程的名称。 1,例如“ spMyReportData; 1”。