Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Crystal Reports在不同环境中登录失败_C#_Crystal Reports - Fatal编程技术网

C# Crystal Reports在不同环境中登录失败

C# Crystal Reports在不同环境中登录失败,c#,crystal-reports,C#,Crystal Reports,我们有几个环境: 发展 蔚蓝 预先 Crystal报表从SQL server提取数据,但数据库因环境而异 项目中有一个名为connectionStrings.config的配置文件,我们用于网站的连接字符串存储在那里。该文件的内容如下所示: 要加载报告,我设置了以下类: 公共类CrystalReportUtil { 静态字符串ReportsDirectory=ConfigurationManager.AppSettings[“ReportsDirectory”]; 私有静态字符串Conn

我们有几个环境:

  • 发展
  • 蔚蓝
  • 预先
Crystal报表从SQL server提取数据,但数据库因环境而异

项目中有一个名为
connectionStrings.config
的配置文件,我们用于网站的连接字符串存储在那里。该文件的内容如下所示:


要加载报告,我设置了以下类:

公共类CrystalReportUtil
{
静态字符串ReportsDirectory=ConfigurationManager.AppSettings[“ReportsDirectory”];
私有静态字符串ConnectionString=ConfigurationManager.ConnectionString[“dataModel”]。ConnectionString;
公共静态ReportDocument GetReport(字符串reportName)
{
var报告=新报告文档();
var fileDirectory=$“{Utilities.GetProjectRoot()}/Reports”;
if(System.Web.HttpContext.Current!=null)
{
fileDirectory=System.Web.HttpContext.Current.Server.MapPath(ReportsDirectory);
}
string file=Path.Combine(fileDirectory,$“{reportName}.rpt”);
如果(!File.Exists(File))
{
抛出新的System.Exception($“找不到报告文件:{file}”);
}
报告加载(文件);
var builder=new-SqlConnectionStringBuilder(ConnectionString);
var dataSource=builder.dataSource;
var user=builder.UserID;
var password=builder.password;
var database=builder.InitialCatalog;
递归EmapConnection(报表、用户、密码、数据源、数据库);
report.VerifyDatabase();
返回报告;
}
私有静态void RecursivelyRemapConnection(报表文档报表、字符串用户名、字符串密码、字符串服务器、字符串数据库)
{
foreach(报表中的IConnectionInfo连接。数据源连接)
{
connection.SetLogon(用户名、密码);
SetConnection(服务器、数据库、false);
}
report.SetDatabaseLogon(用户名、密码);
foreach(report.Database.Tables中的表)
{
table.LogOnInfo.ConnectionInfo.ServerName=server;
table.LogOnInfo.ConnectionInfo.DatabaseName=数据库;
table.LogOnInfo.ConnectionInfo.UserID=用户名;
table.LogOnInfo.ConnectionInfo.Password=密码;
table.LogOnInfo.ConnectionInfo.IntegratedSecurity=false;
}
如果(!report.IsSubreport)
{
foreach(report.Subreports中的ReportDocument子报告)
{
递归EmapConnection(子报表、用户名、密码、服务器、数据库);
}
}
}
}
问题是,在我的开发环境中,它工作得很好,而在其他环境中,我得到以下例外:

登录失败。没有错误

在CrystalDecisions.ReportAppServer.ClientDoc.ReportClientDocumentClass.VerifyDatabase()上

在CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.VerifyDatabase()上

在CrystalDecisions.CrystalReports.Engine.ReportDocument.VerifyDatabase()中

我通过执行以下操作验证了我的开发环境中的连接正在更改:

  • 创建我的数据源的副本
  • 在设计器中,将数据源设置为复制的数据库
  • 删除副本
  • 在设计器中预览报告无法加载(按预期)
  • 使用my utility类生成报告
  • 最后一步成功地生成了报告,该报告告诉我数据源正在更改,否则将导致登录失败

    尤其令人沮丧的是,非开发环境中的一些报告工作正常,而有些报告产生了异常。所以我不明白为什么它对某些人有效,但对所有人无效

    更新


    如果我将我的开发环境中的连接字符串更改为Azure或On Prem中使用的连接字符串,它在我的开发环境中仍然有效。我真的不相信问题出在我的连接字符串上,但我也不知道是什么原因导致登录失败。

    经过几天的研究,我终于找到了问题的原因

    失败的特定报告使用的是
    MSOLEDBSQL
    提供程序,而不是
    SQLOLEDB

    为了解决这个问题,我:

  • 在Visual Studio中打开Crystal报表
  • 右键单击报告
  • 数据库>设置数据源位置
  • 扩展了当前数据源的属性
  • 双击提供者
  • 将值从
    MSOLEDBSQL
    更改为
    SQLOLEDB
  • 重新输入登录凭据(即使它们在运行时被更改)
  • 保存了报告
  • 构建解决方案
  • 重新发布该项目