2010-11-23 57 views
0

我有我的水晶報告文件從msaccess數據庫訪問數據。如何在crystal report和ms訪問中動態更改登錄信息?

現在加載報告時,我需要傳遞msaccess數據庫的登錄信息以及來自vb.net的數據庫名稱。

我嘗試使用

Dim ConnInfo As ConnectionInfo = New ConnectionInfo() 

    CRpt.ReportOptions.EnableSaveDataWithReport = False 

    ConnInfo.IntegratedSecurity = False 
    ConnInfo.ServerName = "" 
    ConnInfo.UserID = "" 
    ConnInfo.Password = "" 
    ConnInfo.DatabaseName = OLEDBLayer.GetDBLocation() 
    ConnInfo.Type = ConnectionInfoType.DBFile 

    'CCINFo.ServerName = 
    For Each CTable As Table In CRpt.Database.Tables 
     CTableLogInfo = CTable.LogOnInfo 
     CTableLogInfo.ConnectionInfo = ConnInfo 
     'CTable.Location = OLEDBLayer.GetDBLocation 
     CTable.ApplyLogOnInfo(CTableLogInfo) 
    Next 

但不工作。我錯過了什麼?

回答

1

我搜索了很多,最後通過使用靜態數據創建新報告測試我的自我後,我得到了動態的解決方案。

我的測試程序:
1)創建新的Crystal Report文件:
2)創建新的數據庫連接到.ACCDB Access 2007文件
3)創建新表
4)新增水晶報表查看器控件的形式
5.)將報表文檔分配給以前創建的報表。
6.)在表格加載時設置中斷點
7.)閱讀所有設置
8.)複製報表文檔的設置,文檔表登錄信息。
9.)粘貼讀取到我的項目設置。
10)工作得很好... :)

我的代碼:

//here crpt is a sample report document 
    Dim CTableLogInfo As TableLogOnInfo 
    Dim ConnInfo As CrystalDecisions.Shared.ConnectionInfo = New ConnectionInfo() 
    ConnInfo.Type = ConnectionInfoType.CRQE 
    ConnInfo.ServerName = DBLayer.GetAbsoluteDBPath() 
    ConnInfo.DatabaseName = "" 
    ConnInfo.UserID = "Admin" 
    ConnInfo.AllowCustomConnection = False 
    ConnInfo.IntegratedSecurity = False 

    For Each CTable As Table In CRpt.Database.Tables 
     CTable.LogOnInfo.ConnectionInfo = ConnInfo 
     CTableLogInfo = CTable.LogOnInfo 
     CTableLogInfo.ReportName = CRpt.Name 
     CTableLogInfo.TableName = CTable.Name 
     CTable.ApplyLogOnInfo(CTableLogInfo) 
    Next 

    CrystalReportViewer1.ReportSource = CRpt 
    CrystalReportViewer1.RefreshReport() 

我得到的數據庫路徑設置爲服務器名將解決

1

您可以使用以下代碼在運行時爲報表應用某些連接詳細信息。
對不起,在c#中的代碼。
請在加載報告rpt文件之後以及打印/導出/查看之前使用該方法。

public static void CrystalReportLogOn(ReportDocument reportParameters, 
              string serverName, 
              string databaseName, 
              string userName, 
              string password) 
    { 
     TableLogOnInfo logOnInfo; 
     ReportDocument subRd; 
     Sections sects; 
     ReportObjects ros; 
     SubreportObject sro; 

     if (reportParameters == null) 
     { 
      throw new ArgumentNullException("reportParameters"); 
     } 

     try 
     { 
      foreach (CrystalDecisions.CrystalReports.Engine.Table t in reportParameters.Database.Tables) 
      { 
       logOnInfo = t.LogOnInfo; 
       logOnInfo.ReportName = reportParameters.Name; 
       logOnInfo.ConnectionInfo.ServerName = serverName; 
       logOnInfo.ConnectionInfo.DatabaseName = databaseName; 
       logOnInfo.ConnectionInfo.UserID = userName; 
       logOnInfo.ConnectionInfo.Password = password; 
       logOnInfo.TableName = t.Name; 
       t.ApplyLogOnInfo(logOnInfo); 
       t.Location = t.Name; 
      } 
     } 
     catch 
     { 
      throw; 
     } 

     sects = reportParameters.ReportDefinition.Sections; 
     foreach (Section sect in sects) 
     { 
      ros = sect.ReportObjects; 
      foreach (ReportObject ro in ros) 
      { 
       if (ro.Kind == ReportObjectKind.SubreportObject) 
       { 
        sro = (SubreportObject)ro; 
        subRd = sro.OpenSubreport(sro.SubreportName); 
        try 
        { 
         foreach (CrystalDecisions.CrystalReports.Engine.Table t in subRd.Database.Tables) 
         { 
          logOnInfo = t.LogOnInfo; 
          logOnInfo.ReportName = reportParameters.Name; 
          logOnInfo.ConnectionInfo.ServerName = serverName; 
          logOnInfo.ConnectionInfo.DatabaseName = databaseName; 
          logOnInfo.ConnectionInfo.UserID = userName; 
          logOnInfo.ConnectionInfo.Password = password; 
          logOnInfo.TableName = t.Name; 
          t.ApplyLogOnInfo(logOnInfo); 
         } 
        } 
        catch 
        { 
         throw; 
        } 
       } 
      } 
     } 
    } 
+0

對不起,它不能正常工作... – KoolKabin 2011-01-11 16:11:46

+0

哪一部分完全不工作? – Ahmed 2011-01-11 18:52:15

1

嘗試了這一點的點:

 Dim CTableLogInfo As TableLogOnInfo 
     Dim ConnInfo As CrystalDecisions.Shared.ConnectionInfo = New ConnectionInfo() 
     Dim CRpt As New ReportDocument 
     String filename = "rptSales.rpt" 

     ConnInfo.Type = ConnectionInfoType.CRQE 
     ConnInfo.ServerName = AppSettings("server") 
     ConnInfo.DatabaseName = AppSettings("dbNm") 
     ConnInfo.UserID = AppSettings("username") 
     ConnInfo.Password = AppSettings("pas") 
     ConnInfo.AllowCustomConnection = False 
     ConnInfo.IntegratedSecurity = False 

     CRpt.Load(AppSettings("reppath") & filename) 

     For Each CTable As Table In CRpt.Database.Tables 
      CTable.LogOnInfo.ConnectionInfo = ConnInfo 
      CTableLogInfo = CTable.LogOnInfo 
      CTableLogInfo.ReportName = CRpt.Name 
      CTableLogInfo.TableName = CTable.Name 
      CTable.ApplCTableLogInfo) 
     Next 
相關問題