Это ад, который сообщает 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.