Frage

Ich habe einen Bericht gemacht mit Crystal Reports 2008, die ich brauche ein Produktionssystem zu implementieren, das bedeutet, dass ich die Datenbankverbindung zur Laufzeit ändern können. Die Datenbank ist PostgreSQL 8.3.0 und die Verbindung I für die Erstellung des ersten Berichts verwenden ist eine ODBC-Verbindung.

Ich habe verschiedene Wege gefunden, die Datenbankverbindung einschließlich der folgenden Änderungen:

reportDoc.Load(report);
reportDoc.DataSourceConnections[0].SetConnection("server", "database", "user", "pwd");
reportDoc.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, path);

Dies ist jedoch nicht immer mit der folgenden Fehlermeldung.

  

konnte nicht die Verbindung öffnen.

Ich habe den Verbindungsparameter validiert, indem sie erfolgreich mit pgAdmin III in die Datenbank zu verbinden, so weiß ich, die Verbindungsparameter korrekt sind. Darüber hinaus, wenn ich die SetConnection (...) Linie entfernen, so der Code sieht wie folgt aus:

reportDoc.Load(report);
reportDoc.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, path);

dann der Bericht läuft gut die Verbindungsparameter verwenden, die in dem Bericht gespeichert werden. Ist es möglich, dass diese Methode nicht für ODBC-Verbindungen funktioniert?

Wie kann ich einen Crystal Report ODBC-Datenbankverbindung zur Laufzeit ändern?

War es hilfreich?

Lösung

Nach dem noch Forschung fand ich, dass es eine zweiteilige Antwort war.

TEIL 1

Wenn Sie PostgreSQL über ODBC verbinden (die einzige Möglichkeit, Crystal Reports Daten von PostgreSQL ab dem Zeitpunkt des Schreibens dieses Artikels ziehen kann) unter Verwendung der Dateneigner Sie dann können Sie den folgenden Code verwenden:

reportDoc.Load(report);
reportDoc.DataSourceConnections[0].SetConnection("Driver={PostgreSQL ANSI};Server=myServer;Port=5432;", "myDatabase", "myUser", "myPassword");
reportDoc.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, path);
// Depending on your application you may have more than one data source connection that needs to be changed.

Diese Methode funktioniert nur, wenn Sie als Benutzer eine Verbindung herstellen, die die Daten besitzt, die Sie berichten über, weil der Schemaname nicht angegeben werden muss.

TEIL 2

Wenn Sie mit einem anderen Benutzer als Eigentümer der Daten zu PostgreSQL über ODBC verbinden, dann müssen Sie manuell die Schemanamen liefern. Dies wird mit dem folgenden Code erreicht.

reportDoc.Load(report);

ConnectionInfo connInfo = new ConnectionInfo();
connInfo.ServerName = "Driver={PostgreSQL ANSI};Server=myServer;Port=5432;";
connInfo.DatabaseName = "myDatabase";
connInfo.UserID = "myUser";
connInfo.Password = "myPassword";

TableLogOnInfo tableLogOnInfo = new TableLogOnInfo();
tableLogOnInfo.ConnectionInfo = connInfo;

foreach (Table table in reportDoc.Database.Tables)
{
    table.ApplyLogOnInfo(tableLogOnInfo);
    table.LogOnInfo.ConnectionInfo.ServerName = connInfo.ServerName;
    table.LogOnInfo.ConnectionInfo.DatabaseName = connInfo.DatabaseName;
    table.LogOnInfo.ConnectionInfo.UserID = connInfo.UserID;
    table.LogOnInfo.ConnectionInfo.Password = connInfo.Password;

    // Apply the schema name to the table's location
    table.Location = "mySchema." + table.Location;
}

reportDoc.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, path);

Zusammenfassung

Es gibt zwei kritische Informationen hier, wenn zu einer PostgreSQL-Datenbank von Crystal Reports zu verbinden versuchen.

  1. Der Treiber, Server und Portnummer muss alle im Servernamen Eigenschaft angegeben werden.
  2. Wenn als Benutzer den Anschluss anderer als der Dateneigentümer Sie den Schemanamen für jede Tabelle angeben, müssen Sie Daten aus ziehen.

Quellen

Es gab mehrere Quellen verwendet, die keine Antwort hatten, die in meinem speziellen Szenario gearbeitet, aber das führte mich in der richtigen Richtung. Diese Quellen sind unten aufgeführt.

Andere Tipps

Ich gehe gerade durch diese gleiche Tortur.

Ich habe meine Verbindungen wie folgt aus (wo sDataSource etc ... String mit den Informationen sind)

    Dim myConnectionInfo As ConnectionInfo = New ConnectionInfo()
    myConnectionInfo.ServerName = sDataSource
    myConnectionInfo.DatabaseName = sInitialCatalog
    myConnectionInfo.UserID = sUserID
    myConnectionInfo.Password = sPassword

    Dim myTables As Tables = report.Database.Tables
    Dim myTableLogonInfo As TableLogOnInfo = New TableLogOnInfo()
    myTableLogonInfo.ConnectionInfo = myConnectionInfo
    For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In myTables
        myTable.ApplyLogOnInfo(myTableLogonInfo)

        myTable.LogOnInfo.ConnectionInfo.DatabaseName = myTableLogonInfo.ConnectionInfo.DatabaseName
        myTable.LogOnInfo.ConnectionInfo.ServerName = myTableLogonInfo.ConnectionInfo.ServerName
        myTable.LogOnInfo.ConnectionInfo.UserID = myTableLogonInfo.ConnectionInfo.UserID
        myTable.LogOnInfo.ConnectionInfo.Password = myTableLogonInfo.ConnectionInfo.Password

    Next

Aktualisieren der ODBC in einem Crystal Report-Datei.

Wir ODBC mit MSSQL verwenden, konnten wir nicht finden, wie die ODBC innerhalb der Kristall-Dateien innerhalb eines Cis-Projekt zu aktualisieren.

Mit dem Beispiel hier zur Verfügung gestellten konnten wir den Weg finden, die ODBC innerhalb MSSQL zu aktualisieren, und es ist so einfach wie folgt aus:

       Cursor.Current = Cursors.WaitCursor;

        CrystalDecisions.Windows.Forms.CrystalReportViewer CR_Viewer;
        CR_Viewer = new CrystalDecisions.Windows.Forms.CrystalReportViewer();
        this.Controls.Add(CR_Viewer);

        ConnectionInfo connInfo = new ConnectionInfo();
        connInfo.ServerName = "YOUR ODBC NAME"; 

        TableLogOnInfo tableLogOnInfo = new TableLogOnInfo();
        tableLogOnInfo.ConnectionInfo = connInfo;

         //THIS IS A CRYSTAL RPT FILE DIFINE AS A CLASS
        Facturation_Nord_Ouest.Reports.Facture_Français CrystalReportFr;


       CrystalReportFr = new Facturation_Nord_Ouest.Reports.Facture_Français();

            for (int i = 0; i < CrystalReportFr.Database.Tables.Count; i++)
            {
                CrystalReportFr.Database.Tables[i].ApplyLogOnInfo(tableLogOnInfo);
            }
            CR_Viewer.ReportSource = CrystalReportFr;

        CR_Viewer.ActiveViewIndex = 0;
        CR_Viewer.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
        CR_Viewer.Dock = System.Windows.Forms.DockStyle.Fill;
        CR_Viewer.Location = new System.Drawing.Point(0, 0);
        CR_Viewer.Size = new System.Drawing.Size(545, 379);
        CR_Viewer.TabIndex = 0;
        CR_Viewer.Name = "Invoice";
        CR_Viewer.Zoom(100);
        CR_Viewer.Show();

        Cursor.Current = Cursors.Default;

Damit die ODBC in dem Kristall-Datei wird automatisch aktualisiert.

Zunächst einmal vielen Dank für diese Informationen !!!

Ich bin mit MySQL / C # / Crystal Reports. Nach dem Einstellen der ODBC / DSN etwas so Einfaches wie das funktionierte für mich.

using CrystalDecisions.CrystalReports.Engine;

using CrystalDecisions.Shared;

using MySql.Data.MySqlClient;

.
.
.

ConnectionInfo connInfo = new ConnectionInfo();

connInfo.ServerName = "Driver={MySQL ODBC 3.51 Driver};DSN=MyODBCDatasourceName";

TableLogOnInfo tableLogOnInfo = new TableLogOnInfo();

tableLogOnInfo.ConnectionInfo = connInfo;

// rpt is my Crystal Reports ReportDocument

// Apply the schema name to the table's location

foreach (Table table in rpt.Database.Tables)

{

    table.ApplyLogOnInfo(tableLogOnInfo);

    table.Location = table.Location;

}
protected void Page_Load(object sender, EventArgs e)
        {
            try
            {

                ReportDocument cryRpt = new ReportDocument();
                TableLogOnInfos crtableLogoninfos = new TableLogOnInfos();
                TableLogOnInfo crtableLogoninfo = new TableLogOnInfo();
                ConnectionInfo crConnectionInfo = new ConnectionInfo();
                cryRpt.Load(@"D:\tem\WebAppReport\WebAppReport\CrystalReport1.rpt");
                crConnectionInfo.ServerName = "misserver";
                crConnectionInfo.DatabaseName = "testAccountability_data";
                crConnectionInfo.UserID = "RW";
                crConnectionInfo.Password = "RW";


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

                CrystalReportViewer1.ReportSource = cryRpt;
                CrystalReportViewer1.RefreshReport();
            }
            catch
            {
            }






        }

Diese Arbeit für SQL Server 2008 R2 für DSN weniger Verbindung.

Dim myConnectionInfo As CrystalDecisions.Shared.ConnectionInfo = New CrystalDecisions.Shared.ConnectionInfo()

    myConnectionInfo.ServerName = "Driver={SQL Server Native Client 10.0};Server=P03\sqlrs1;"
    myConnectionInfo.DatabaseName = "RS1DB"
    myConnectionInfo.UserID = "user"
    myConnectionInfo.Password = "pwd"

    For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In mboReportDocument.Database.Tables

        Dim myTableLogonInfo As TableLogOnInfo = myTable.LogOnInfo
        myTableLogonInfo.ConnectionInfo = myConnectionInfo
        myTable.ApplyLogOnInfo(myTableLogonInfo)

    Next
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top