【问题标题】:How to dynamically change crystal report database connection如何动态更改水晶报表数据库连接
【发布时间】:2014-05-05 10:39:16
【问题描述】:

我是水晶报告的新手。我尝试使用报表向导 Visual Studio 2012 在我的 win form c# 应用程序中实现水晶报表,所以不知道反手会发生什么。在我的计算机上一切正常,但是当我尝试在另一台计算机上安装它时,连接字符串发生变化并出现错误。

我尝试了许多链接,例如 Dynamic Connection string Change,但由于我使用报告向导进行设置,所以不知道在哪里使用它。

我还尝试了报告向导中连接字符串的所有选项,但没有找到在运行时更改连接字符串的任何内容。

我有什么选择可以attach connection String from app config at run time

【问题讨论】:

    标签: c# visual-studio-2012 reporting-services crystal-reports database-connection


    【解决方案1】:

    试试这样的:

    strServer= ConfigurationManager.AppSettings["ServerName"].ToString();
    strDatabase= ConfigurationManager.AppSettings["DataBaseName"].ToString();
    strUserID= ConfigurationManager.AppSettings["UserId"].ToString();
    strPwd= ConfigurationManager.AppSettings["Password"].ToString();
    
    report.DataSourceConnections[0].SetConnection(strServer, strDatabase, strUserID, strPwd);
    

    【讨论】:

    • 请注意,我必须将 strServer 指定为我的 odbc DNS 连接的名称。
    • @RubberDuck 你的意思是而不是索引 0 在最后一行 report.DataSourceConnections[0].SetConnection(strServer, strDatabase, strUserID, strPwd); ?因为我收到错误消息,上面写着Invalid report file path
    • @sam 已经很久了,所以我不记得了,但我相信我的意思正是我所说的。我必须使用 ODBC DNS 连接名称作为 strServer 的值。
    • 我收到错误Invalid report file path 任何想法都可以帮忙吗?
    【解决方案2】:
    strServer= ConfigurationManager.AppSettings["ServerName"].ToString();
    strDatabase= ConfigurationManager.AppSettings["DataBaseName"].ToString();
    strUserID= ConfigurationManager.AppSettings["UserId"].ToString();
    strPwd= ConfigurationManager.AppSettings["Password"].ToString();
    
    //may be you need to set the integrated security to false, first.
    report.DataSourceConnections[o].IntegratedSecurity = False;
    
    report.DataSourceConnections[0].SetConnection(strServer, strDatabase, strUserID, strPwd);
    

    【讨论】:

      【解决方案3】:

      这是一个将所有主报告表和所有子报告表更改为新指定的具有集成身份验证的 TargetServer 和 TargetDatabase 的示例:

      using CrystalDecisions.CrystalReports.Engine;
      using CrystalDecisions.Shared;
      
      // using CrystalDecisions.ReportAppServer.CommLayer; // not used directly, but this is needed in Project References.
      //
      // be sure to set "copy local" = true in the Project:
      // see https://stackoverflow.com/questions/38025601/could-not-load-file-or-assembly-crystaldecisions-reportappserver-commlayer-ver
      
      
              static ReportDocument crReportDocument;
              static ConnectionInfo crConnectionInfo = new ConnectionInfo();
              static public string TargetServer { get; set; }
              static public string TargetDatabase { get; set; }
      
              static void crAssignConnectionInfo()
              {
                  crConnectionInfo.UserID = "";
                  crConnectionInfo.Password = "";
                  crConnectionInfo.DatabaseName = TargetDatabase;
                  crConnectionInfo.ServerName = TargetServer;
                  crConnectionInfo.IntegratedSecurity = true; // in case the report was saved with SQL authentication, switch to Integrated
              }
      
              static void SetSubreportLoginInfo(CrystalDecisions.CrystalReports.Engine.Sections objSections)
              {
                  foreach (Section section in objSections)
                  {
                      foreach (ReportObject reportObject in section.ReportObjects)
                      {
                          SubreportObject crSubreportObject;
                          switch (reportObject.Kind)
                          {
                              case ReportObjectKind.SubreportObject:
                                  crSubreportObject = (SubreportObject)reportObject;
                                  ReportDocument subRepDoc = crSubreportObject.OpenSubreport(crSubreportObject.SubreportName);
                                  if (subRepDoc.ReportDefinition.Sections.Count > 0) {
                                      SetSubreportLoginInfo(subRepDoc.ReportDefinition.Sections);
                                  }
                                  Tables crTables = subRepDoc.Database.Tables;
                                  foreach (Table table in crTables)
                                  {
                                      TableLogOnInfo tableLogOnInfo = new TableLogOnInfo();
                                      tableLogOnInfo.ConnectionInfo.UserID = crConnectionInfo.UserID;
                                      tableLogOnInfo.ConnectionInfo.Password = crConnectionInfo.Password;
                                      tableLogOnInfo.ConnectionInfo.DatabaseName = crConnectionInfo.DatabaseName;
                                      tableLogOnInfo.ConnectionInfo.ServerName = crConnectionInfo.ServerName;
                                      tableLogOnInfo.ConnectionInfo.IntegratedSecurity = crConnectionInfo.IntegratedSecurity;
      
                                      table.ApplyLogOnInfo(tableLogOnInfo);
                                  }
                                  break;
                              case ReportObjectKind.FieldObject:
                              case ReportObjectKind.TextObject:
                              case ReportObjectKind.LineObject:
                              case ReportObjectKind.BoxObject:
                              case ReportObjectKind.PictureObject:
                              case ReportObjectKind.ChartObject:
                              case ReportObjectKind.CrossTabObject:
                              case ReportObjectKind.BlobFieldObject:
                              case ReportObjectKind.MapObject:
                              case ReportObjectKind.OlapGridObject:
                              case ReportObjectKind.FieldHeadingObject:
                              case ReportObjectKind.FlashObject:
                              default:
                                  // none of the other objects need to have login assigned
                                  break;
                          }
                      }
                  }
              }
      
              static void SetCrystalDocumentLogon()
              {
                  crAssignConnectionInfo();
                  TableLogOnInfo crTableLogonInfo = new TableLogOnInfo();
                  foreach (Table crTable in crReportDocument.Database.Tables)
                  {
                      try
                      {
                          crConnectionInfo.Type = crTable.LogOnInfo.ConnectionInfo.Type;
                          crTableLogonInfo.ConnectionInfo = crConnectionInfo;
                          crTableLogonInfo.ReportName = crTable.LogOnInfo.ReportName;
                          crTableLogonInfo.TableName = crTable.LogOnInfo.TableName;
      
                          crTable.ApplyLogOnInfo(crTableLogonInfo);
                      }
                      catch (Exception ex)
                      {
                          Console.WriteLine("Error during SetCrystalDocumentLogon " + ex.Message);
                          throw;
                      }
                      SetSubreportLoginInfo(crReportDocument.ReportDefinition.Sections);
                  }
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-28
        相关资源
        最近更新 更多