Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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#_.net_Winforms_Crystal Reports - Fatal编程技术网

C# 带有crystal reports的数据库登录提示

C# 带有crystal reports的数据库登录提示,c#,.net,winforms,crystal-reports,C#,.net,Winforms,Crystal Reports,我试图显示一些报表,其中包含一些子报表,但每次显示报表时都会抛出一些对话框,请求数据库连接。我正在使用以下代码: private void frmReporte_Load(object sender, System.EventArgs e) { Clave = ConfigurationSettings.AppSettings["Password"].ToString(); NombreBD = ConfigurationSettings.AppSetti

我试图显示一些报表,其中包含一些子报表,但每次显示报表时都会抛出一些对话框,请求数据库连接。我正在使用以下代码:

private void frmReporte_Load(object sender, System.EventArgs e)
    {
        Clave = ConfigurationSettings.AppSettings["Password"].ToString();
        NombreBD = ConfigurationSettings.AppSettings["CatalogBD"].ToString();
        NombreServidor = ConfigurationSettings.AppSettings["Servidor"].ToString(); ;
        UsuarioBD = ConfigurationSettings.AppSettings["UserID"].ToString();
        this.crtReportes.ReportSource = this.prepareReport();
    }
    public void imprimirReporte()
    {
        ReportDocument rpt = new ReportDocument();
        rpt.Load(mvarRutaReporte);
        rpt.SetDataSource(clsReportes.dsReporte);
        rpt.PrintToPrinter(1, false, 1, 1);
    }
    private ReportDocument prepareReport()
    {
        Sections crSections;
        ReportDocument crReportDocument, crSubreportDocument;
        SubreportObject crSubreportObject;
        ReportObjects crReportObjects;
        ConnectionInfo crConnectionInfo;
        Database crDatabase;
        Tables crTables;
        TableLogOnInfo crTableLogOnInfo;
        crReportDocument = new ReportDocument();
        crReportDocument.Load(RutaReporte);
        crReportDocument.SetDataSource(clsReportes.dsReporte.Tables[0]);
        crDatabase = crReportDocument.Database;
        crTables = crDatabase.Tables;
        crConnectionInfo = new ConnectionInfo();
        crConnectionInfo.ServerName = NombreServidor ;
        crConnectionInfo.DatabaseName = NombreBD;
        crConnectionInfo.UserID = UsuarioBD;
        crConnectionInfo.Password = Clave;
        foreach (CrystalDecisions.CrystalReports.Engine.Table aTable in crTables)
        {
            crTableLogOnInfo = aTable.LogOnInfo;
            crTableLogOnInfo.ConnectionInfo = crConnectionInfo;
            aTable.ApplyLogOnInfo(crTableLogOnInfo);
        }
        // Para los reportes que poseen subreportes 
        // pongo el objeto seccion del la seccion actual del reporte 
        crSections = crReportDocument.ReportDefinition.Sections;
        // busco en todas las secciones el objeto reporte
        foreach (Section crSection in crSections)
        {
            crReportObjects = crSection.ReportObjects;
            //busco en todos los reportes por subreportes
            foreach (ReportObject crReportObject in crReportObjects)
            {
                if (crReportObject.Kind == ReportObjectKind.SubreportObject)
                {
                    crSubreportObject = (SubreportObject)crReportObject;
                    //abro el subreporte y me logeo con los datos del reporte general
                    crSubreportDocument = crSubreportObject.OpenSubreport(crSubreportObject.SubreportName);
                    crDatabase = crSubreportDocument.Database;
                    crTables = crDatabase.Tables;
                    foreach (CrystalDecisions.CrystalReports.Engine.Table aTable in crTables)
                    {
                        crTableLogOnInfo = aTable.LogOnInfo;
                        crTableLogOnInfo.ConnectionInfo = crConnectionInfo;
                        aTable.ApplyLogOnInfo(crTableLogOnInfo);
                    }
                }
            }
        }
        return crReportDocument;
    }

在crystal中,您可以指定是否在crystal Management Console(CMC)中的每个报告级别在报告生成时提示db登录。登录CMC,打开报告>进程>数据库。在页面底部,您可以指定“提示用户登录数据库”、“使用SSO上下文登录数据库”或“使用与运行报表时相同的数据库登录”。选择第三个选项以使用存储在服务器中的凭据。

您只需编写即可 SetDatabaseLogon(“用户名”、“pwd”、“服务器”、“数据库”);
提供登录信息后,在运行代码时,数据库登录框将不会出现。

我遇到了一个类似的问题,现在问题已经解决,因此我将添加此回复,以防在我的情况下对其他人有所帮助

为报表设置SQL Server登录信息时,请确保包含服务的名称。因此,例如,确保给Crystal的是“myserver\myservice”,而不仅仅是“myserver”


我的程序只需使用“myserver”就可以访问SQL Server中的数据,但Crystal需要获得“myserver\myservice”。

一些旧的Crystal报表文件是用以前版本的SQL原生客户端保存的(例如提供程序:SQLNCLI)如果客户端或服务器禁用相应的TLS协议版本,则将无法再登录。例如,如果报表是使用SQLServer2005(版本9.00.xx)保存的,则需要TLS1.0。如果禁用此协议,则不会出现直观错误,只会以编程方式显示“数据库登录失败”。客户端软件(包括在web浏览器中呈现)将被提示输入密码,即使该帐户可能具有适当的SQL权限

如果在IIS应用程序中呈现报告,请参阅Nartac软件中名为IISCrypto的工具,以轻松打开和关闭各种协议、密码、哈希和密钥交换


手动编辑报告文件并在与更现代的本机客户端连接时使用数据库集数据源位置是解决此问题的一种方法,这样过时和不安全的协议就不需要保持启用状态

最终的软件安装在没有CMCi的地方,也面临这个问题,如果你得到了解决方案,请在这里分享!。我也面临同样的问题,如果你有解决办法,请分享here@LajjaThaker我不得不以其他方式重建报告我现在也不记得我了。。。它不起作用。谁在这里投票,请告诉我你是否解决了这个问题。Lajja,我建议你好好看看这篇文章: