Измените источник данных Crystal Reports с MSACCESS на SQLSERVER во время выполнения - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть приложение winforms, которое подключается к базе данных MSACCESS, расположенной в сети.Я очень хочу изменить базовую базу данных на базу данных sqlserver на нашем локальном сервере.Я могу преобразовать базу данных и запустить приложение (все имена таблиц, поля и т. Д. Сохраняются).

Приложение имеет более 300 отчетов Crystal, настроенных для подключения к источнику данных доступа.Я действительно не хочу вручную перенастраивать каждый отчет ... поэтому я ищу способ изменить источник данных во время выполнения

1 Ответ

0 голосов
/ 20 ноября 2018

спасибо за помощь, мне кажется, что это решение работает:

 private void getConnectionInfo(string serverName, string databaseName, string userID, string password)
    {

        connectionInfo.ServerName = serverName;
        connectionInfo.DatabaseName = databaseName;
        connectionInfo.UserID = userID;
        connectionInfo.Password = password;

    }

    private TableLogOnInfo GetSQLTableLogOnInfo(string serverName, string databaseName, string userID, string password)
    {
        CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag connectionAttributes = new CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag();
        connectionAttributes.EnsureCapacity(11);
        connectionAttributes.Add("Connect Timeout", "15");
        connectionAttributes.Add("Data Source", serverName);
        connectionAttributes.Add("General Timeout", "0");
        connectionAttributes.Add("Initial Catalog", databaseName);
        connectionAttributes.Add("Integrated Security", false);
        connectionAttributes.Add("Locale Identifier", "1033");
        connectionAttributes.Add("OLE DB Services", "-5");
        connectionAttributes.Add("Provider", "SQLOLEDB");
        connectionAttributes.Add("Tag with column collation when possible", "0");
        connectionAttributes.Add("Use DSN Default Properties", false);
        connectionAttributes.Add("Use Encryption for Data", "0");

        DbConnectionAttributes attributes = new DbConnectionAttributes();
        attributes.Collection.Add(new NameValuePair2("Database DLL", "crdb_ado.dll"));
        attributes.Collection.Add(new NameValuePair2("QE_DatabaseName", databaseName));
        attributes.Collection.Add(new NameValuePair2("QE_DatabaseType", "OLE DB (ADO)"));
        attributes.Collection.Add(new NameValuePair2("QE_LogonProperties", connectionAttributes));
        attributes.Collection.Add(new NameValuePair2("QE_ServerDescription", serverName));
        attributes.Collection.Add(new NameValuePair2("SSO Enabled", false));

        getConnectionInfo(serverName, databaseName, userID, password);
        connectionInfo.Attributes = attributes;
        connectionInfo.Type = ConnectionInfoType.SQL;

        TableLogOnInfo tableLogOnInfo = new TableLogOnInfo();
        tableLogOnInfo.ConnectionInfo = connectionInfo;
        return tableLogOnInfo;
    }

    public ReportDocument GenerateReport(string reportPath, string report, string folder, List<ReportParameters> parameters)
    {

        ReportDocument crReport = new ReportDocument();
        TableLogOnInfo crTableLogoninfo = new TableLogOnInfo();
        Tables crTables;
        string path = reportPath + folder;
        crReport.Load(path + report);



            crTables = crReport.Database.Tables;
            TableLogOnInfo tableLogonInfo = this.GetSQLTableLogOnInfo(this.serverName, this.databaseName, this.userName, this.password );
            foreach (Table table in crTables)
            {
                table.LogOnInfo.ConnectionInfo = connectionInfo;
                table.ApplyLogOnInfo(table.LogOnInfo);
            }

            foreach (ReportDocument subrep in crReport.Subreports)
            {
                foreach (Table table in subrep.Database.Tables)
                {
                    table.LogOnInfo.ConnectionInfo = connectionInfo;
                    table.ApplyLogOnInfo(table.LogOnInfo);
                }
            }

        crReport.Refresh();
        foreach (ReportParameters r in parameters)
            crReport.SetParameterValue(r.parameter, r.value);
        return crReport;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...