. net Crystal Report «Не удалось открыть соединение» и «Ошибка входа» - PullRequest
0 голосов
/ 22 февраля 2020

Это ад, который сообщает SAP и Crystal и. net. Я прочесал inte rnet и попробовал некоторые решения, даже здесь, в стеке, но я все равно публикую это, поскольку не было недавней проблемы.

Очевидно, я получаю сообщение «Не удалось открыть» Соединение »и возможная ошибка« Ошибка входа ». проблема, с которой я столкнулся, заключается в том, что я получаю его из унаследованного кода, который работал в производстве, но мы переходим к облачной службе, и наши соединения с БД изменились. что я сделал.

на новом сервере установлена ​​самая последняя версия Crystal Reports (CR) с 2013 года. Я обновил свою среду разработки VS2017 до 2013 года.

Нам удалось получить отчет по адресу выполняется правильно в CR на автономном сервере, что означает вне. net.

Сбой при использовании того же отчета, той же информации о соединении для нового сервера в программе. net.

Сбой (см. Ошибки выше), когда я пытаюсь сделать это на моем блоке разработки в VS2017, хотя, если я открою rpt в VS и просматриваю, он работает.

Это устаревший код, то есть он работает в настоящее время. с CR на нашей существующей системе и код, которым я поделюсь, работает. единственное, что мне нужно изменить, - это данные, указывающие на другую систему.

Я подтвердил, что могу получить доступ к физическому серверу. Я могу подключиться к БД, используя комбинацию ИД пользователя / Пароль, и схема и база данных верны.

Я создал записи ODB C в 32-битной системе, которые соответствуют расположению данных отчета на сервере. и мой ящик Deve, и когда я запускаю отчет в CR 2013, он работает.

Теперь код (и, пожалуйста, на данный момент это не обзор кода).

        private static string setReport(string ReportPath, int dock = 0)
    {

        cryRpt = new ReportDocument();

        string reportName = ConfigurationManager.AppSettings["ReportName"].ToString();

        if (dock == 10)
            reportName = ConfigurationManager.AppSettings["GCReportName"].ToString();

        ReportPath = ConfigurationManager.AppSettings["ReportPath"].ToString() + reportName;

        try
        {
            cryRpt.Load(ReportPath);
        }
        catch (Exception ex)
        {
            throw new Exception("There is no such report on the server: " + ex.ToString());
        }

        // Set the database logon parameters
        string user = ConfigurationManager.AppSettings["ReportDBUser"].ToString(); 
        string pwd = ConfigurationManager.AppSettings["ReportDBPassword"].ToString();  
        string server = ConfigurationManager.AppSettings["ReportDBServer"].ToString();
        string database = ConfigurationManager.AppSettings["ReportDBDatabase"].ToString();
        string schema = ConfigurationManager.AppSettings["ReportDBSchema"].ToString();

        try
        {
            TableLogOnInfo logoninfo = new TableLogOnInfo();

            foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in cryRpt.Database.Tables)
            {
                logoninfo = CrTable.LogOnInfo;

                Debug.WriteLine(CrTable.Name);

                crtableLogoninfo = CrTable.LogOnInfo;
                crtableLogoninfo.ReportName = cryRpt.Name;
                crtableLogoninfo.ConnectionInfo.ServerName = server;
                crtableLogoninfo.ConnectionInfo.DatabaseName = database;
                crtableLogoninfo.ConnectionInfo.UserID = user;
                crtableLogoninfo.ConnectionInfo.Password = pwd;
                crtableLogoninfo.TableName = CrTable.Name;
                CrTable.ApplyLogOnInfo(crtableLogoninfo);
                //CrTable.Location = CrTable.Name;
                try
                {
                    //log.Info("fTop Level, full Table name: " + database + "." + schema + "." + CrTable.Name);
                    CrTable.Location = database + "." + schema + "." + CrTable.Name;
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("Error: " + ex.Message + "| full Table name: " + database + "." + schema + "." + CrTable.Name);
                }
            }

            if (!cryRpt.IsSubreport)
            {
                foreach (ReportDocument subreport in cryRpt.Subreports)
                {
                    foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in subreport.Database.Tables)
                    {
                        logoninfo = CrTable.LogOnInfo;

                        Debug.WriteLine(CrTable.Name);

                        crtableLogoninfo = CrTable.LogOnInfo;
                        crtableLogoninfo.ReportName = cryRpt.Name;
                        crtableLogoninfo.ConnectionInfo.ServerName = server;
                        crtableLogoninfo.ConnectionInfo.DatabaseName = database;
                        crtableLogoninfo.ConnectionInfo.UserID = user;
                        crtableLogoninfo.ConnectionInfo.Password = pwd;
                        crtableLogoninfo.TableName = CrTable.Name;
                        CrTable.ApplyLogOnInfo(crtableLogoninfo);
                        //CrTable.Location = CrTable.Name;
                        try
                        {
                            //log.Info("sub Level, full Table name: " + database + "." + schema + "." + CrTable.Name);
                            //RaiseAllocLog(-1, "REPORT", "sub Level, full Table name: " + database + "." + schema + "." + CrTable.Name, false);
                            CrTable.Location = database + "." + schema + "." + CrTable.Name;
                        }
                        catch (Exception ex)
                        {
                            string a = "1";
                            //log.Error("Error: " + ex.Message + "| full Table name: " + database + "." + schema + "." + CrTable.Name);
                        }
                    }
                    subreport.SetDatabaseLogon(user, pwd, server, database);
                }

                // now that we've setup the report, we can perform the actual database logon
                cryRpt.SetDatabaseLogon(user, pwd, server, database);

                cryRpt.VerifyDatabase();
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message, ex.InnerException);
        }
        return string.Format("Report ({0}) has been loaded and connected to database {1}", ReportPath, ConfigurationManager.AppSettings["ReportDBDatabase"].ToString());

    }

Отчет сложный, имеет подотчет, но это не имеет значения. Когда я пытаюсь установить местоположение таблицы:

CrTable.Location = database + "." + schema + "." + CrTable.Name;

я получаю сообщение об ошибке подключения. Нет смысла, что, когда я передаю действительное соединение (проверено), оно не может установить соединение. Что, черт возьми, мне не хватает.

В конце я пробую метод setdatabaselogon, и он завершается неудачно с Log on Failed (нет, да), но я не пропускаю ничего, что неправильно.

Пожалуйста, это на основе ODB C, DLL? Что еще я могу проверить, потому что он работает в нашей текущей производственной системе, и меняются только две вещи: местоположение базы данных и версия Crystal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...