2016-07-27 14 views
0

Ich entwickle eine Anwendung in WPF, die Bericht von diesem bekommen muss, ich beende es und in meinem PC ist alles in Ordnung, kein Datenbankanmeldedialog erscheint, und total ist es ok . Aber wenn ich es auf einem Client-PC veröffentliche, wenn der Bericht über den Crystal Report Viewer angezeigt werden soll, erscheint der Datenbankanmeldedialog! Ich habe alles gemacht, was mir in den Sinn kam und überall im Internet gesucht und mein Bestes gegeben, aber das konnte ich nicht lösen. Dies ist mein Code:Crystal Report bitten um Datenbankanmeldung, während es veröffentlicht wird

ReportDocument CryRpt1 = new ReportDocument(); 
string Path1 = System.Windows.Forms.Application.StartupPath + "\\CryReportSendItems.rpt"; 
CryRpt1.Load(Path1, OpenReportMethod.OpenReportByDefault); 
AssignConnection(CryRpt1); 
CryRpt1.Refresh(); 
Crv.ViewerCore.ReportSource = CryRpt1; 

Und das ist AssignConnection Methode:

private void AssignConnection(ReportDocument rpt) 
     { 
      ConnectionInfo connection = new ConnectionInfo();   
      connection.ServerName = "*ServerName*"; 
      connection.DatabaseName = "*DBName*"; 
      connection.UserID = "*User*"; 
      connection.Password = "*Password*"; 

      foreach (CrystalDecisions.CrystalReports.Engine.Table table in rpt.Database.Tables) 
      { 
       AssignTableConnection(table, connection); 
      } 

      foreach (CrystalDecisions.CrystalReports.Engine.Section section in rpt.ReportDefinition.Sections) 
      { 

       foreach (CrystalDecisions.CrystalReports.Engine.ReportObject reportObject in section.ReportObjects) 
       { 
        if (reportObject.Kind == ReportObjectKind.SubreportObject) 
        { 
         SubreportObject subReport = (SubreportObject)reportObject; 
         ReportDocument subDocument = subReport.OpenSubreport(subReport.SubreportName); 

         foreach (CrystalDecisions.CrystalReports.Engine.Table table in subDocument.Database.Tables) 
         { 
          AssignTableConnection(table, connection); 
         } 

         subDocument.SetDatabaseLogon(connection.UserID, connection.Password, connection.ServerName, connection.DatabaseName); 
        } 
       } 
      } 
      rpt.SetDatabaseLogon(connection.UserID, connection.Password, connection.ServerName, connection.DatabaseName); 
     } 

     private void AssignTableConnection(CrystalDecisions.CrystalReports.Engine.Table table, ConnectionInfo connection) 
     { 
      // Cache the logon info block 
      TableLogOnInfo logOnInfo = table.LogOnInfo; 

      connection.Type = logOnInfo.ConnectionInfo.Type; 

      // Set the connection 
      logOnInfo.ConnectionInfo = connection; 

      // Apply the connection to the table! 

      table.LogOnInfo.ConnectionInfo.DatabaseName = connection.DatabaseName; 
      table.LogOnInfo.ConnectionInfo.ServerName = connection.ServerName; 
      table.LogOnInfo.ConnectionInfo.UserID = connection.UserID; 
      table.LogOnInfo.ConnectionInfo.Password = connection.Password; 
      table.LogOnInfo.ConnectionInfo.Type = connection.Type; 
      table.ApplyLogOnInfo(logOnInfo); 
     } 

* Hinweis: Meine Windows-Version ist 10 (x64) und Client-Windows-Version 7 (x64).

Könnten mir einige bitte helfen?

+0

ist Ihre Datenbank in Ihrem WINDOWS 7 Rechner? oder andere Maschine? –

+0

Überprüfen Sie die Verbindungszeichenfolge auch .. –

+0

@reds Ja, wir sind im Netzwerk. Ich habe es gerade gefunden, muss die Datenquelle füllen. lies bitte die Antwort. – Hamed

Antwort

0

fand ich die Antwort, dies jemand verwenden kann:

den Bericht erneut im Code, geben Sie bitte Entity Framework.

 using (var db = new DatabaseContext()) 
     { 
      CryRpt1.SetDataSource(db.VwSendItems); 
     } 

und vor diesem:

 SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder("Data Source=*Server*;Initial Catalog=*DBCenter*;Persist Security Info=True;User ID=*User*;password=*Password*"); //from config.xml 
     crConnectionInfo.ServerName = builder.DataSource; 
     crConnectionInfo.DatabaseName = builder.InitialCatalog; 
     crConnectionInfo.IntegratedSecurity = true; 

     CrTables = CryRpt1.Database.Tables; 
     foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in CrTables) 
     { 
      crtableLogoninfo = CrTable.LogOnInfo; 
      crtableLogoninfo.ConnectionInfo = crConnectionInfo; 
      CrTable.ApplyLogOnInfo(crtableLogoninfo); 
     } 

     //AssignConnection(CryRpt1); 
     ConnectionInfo connection = new ConnectionInfo 
     { 
      ServerName = "10.20.1.41", 
      DatabaseName = "DBCenterMostafavi", 
      UserID = "site", 
      Password = "[email protected]#a" 
     }; 
     CryRpt1.SetDatabaseLogon(connection.UserID, connection.Password, connection.ServerName, connection.DatabaseName); 

     foreach (CrystalDecisions.CrystalReports.Engine.Table table in CryRpt1.Database.Tables) 
     { 
      AssignTableConnection(table, connection); 
     } 

das war es.