Как изменить подключение к базе данных Crystal Report ODBC во время выполнения? - PullRequest
10 голосов
/ 23 марта 2009

У меня есть отчет, составленный с помощью Crystal Reports 2008, в котором мне необходимо развернуть производственную систему, что означает, что мне нужно иметь возможность изменять соединение с базой данных во время выполнения. База данных - PostgreSQL 8.3.0, а соединение, которое я использую для создания исходного отчета, - это соединение ODBC.

Я нашел несколько способов изменить соединение с базой данных, включая следующие:

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

Однако, это всегда терпит неудачу со следующим сообщением об ошибке.

Не удалось открыть соединение.

Я проверил параметры соединения, успешно подключившись к базе данных с помощью pgAdmin III, поэтому я знаю, что параметры соединения верны. Кроме того, если я удалю строку SetConnection (...), код будет выглядеть так:

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

тогда отчет работает нормально, используя параметры соединения, которые хранятся в отчете. Возможно ли, что этот метод не работает для соединений ODBC?

Как изменить подключение к базе данных Crystal Report ODBC во время выполнения?

Ответы [ 6 ]

16 голосов
/ 23 марта 2009

После еще больше исследований я обнаружил, что был ответ из двух частей.

ЧАСТЬ 1

Если вы подключаетесь к PostgreSQL через ODBC (единственный способ, которым Crystal Reports может извлекать данные из PostgreSQL на момент написания этой статьи), используя владельца данных, вы можете использовать следующий код:

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.

Этот метод работает, только если вы подключаетесь как пользователь, которому принадлежат данные, о которых вы сообщаете, поскольку имя схемы указывать не нужно.

ЧАСТЬ 2

Если вы подключаетесь к PostgreSQL через ODBC с пользователем, отличным от владельца данных, вам нужно вручную указать имя схемы. Это достигается с помощью следующего кода.

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);

Резюме

При попытке подключиться к базе данных PostgreSQL из Crystal Reports есть две важные части.

  1. Драйвер, сервер и номер порта должны быть указаны в свойстве имени сервера.
  2. Если вы подключаетесь как пользователь, отличный от владельца данных, вы должны указать имя схемы для каждой таблицы, из которой вы извлекаете данные.

Источники

Было несколько источников, которые не имели ответа, который работал в моем конкретном сценарии, но который привел меня в правильном направлении. Эти источники перечислены ниже.

2 голосов
/ 07 января 2010

Обновление ODBC в файле отчета Crystal.

Мы используем ODBC с MSSQL, мы не смогли найти, как обновить ODBC в кристаллических файлах в проекте C sharp.

Используя приведенный здесь пример, мы смогли найти способ обновления ODBC в MSSQL, и это так просто:

       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;

При этом ODBC в кристаллическом файле автоматически обновляется.

2 голосов
/ 28 декабря 2009

Прежде всего спасибо за эту информацию !!!

Я использую MySQL / C # / Crystal Reports. После настройки ODBC / DSN у меня сработало нечто такое простое, как это.

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;

}
2 голосов
/ 23 марта 2009

Я только что прошел через то же испытание.

Я устанавливаю свои соединения следующим образом (где sDataSource и т. Д. ... являются строкой с информацией)

    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
0 голосов
/ 07 февраля 2014

Эта работа для Sql Server 2008 R2 для подключения без DSN.

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
0 голосов
/ 20 октября 2009
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
            {
            }






        }
...