Проблема с изменением источника данных Crystal Report в коде

#c# #.net #crystal-reports

#c# #.net #crystal-отчеты

Вопрос:

У меня есть приложение .net 3.5 SP1, в котором есть несколько встроенных отчетов Crystal reports (версия 10.5). Отчеты будут нормально работать в моей среде разработки, но когда я переношу код в рабочую среду, пользователи получают окно с запросом учетных данных для входа.

Теперь я знаю, что вопрос о том, как изменить источник данных во время выполнения, задавался и отвечал много раз на SO. Мой вопрос не в том, как это сделать, а в том, что я делаю не так?

Что происходит, так это то, что появится окно входа со всей информацией, но поле базы данных пустое, а редактирование в поле отключено. Когда я просматриваю код с помощью отладчика, ConnectionInfo содержит всю правильную информацию, включая имя базы данных.

 //InvoiceHistory is the crystral report that is an embedded resource
InvoiceHistory billingHistoryReport = new InvoiceHistory();

ConnectionInfo info = ReportUtilities.GetConnectionInfo();
ReportUtilities.ConfigureLogonInfo(billingHistoryReport,info);

crystalReportViewer1.DisplayToolbar = true;
crystalReportViewer1.ReportSource = billingHistoryReport;
crystalReportViewer1.Refresh();


//Static Function Code

public static void ConfigureLogonInfo(ReportDocument _report, ConnectionInfo _conn)
{
    Tables ts = _report.Database.Tables;
    TableLogOnInfo li = new TableLogOnInfo();

    foreach (Table t in ts)
    {
        li = t.LogOnInfo;
        li.ConnectionInfo = _conn;
        t.ApplyLogOnInfo(li);
    }

    for (int i = 0; i < _report.Subreports.Count; i  )
    {
        Tables tbs = _report.Subreports[i].Database.Tables;
        TableLogOnInfo sli = new TableLogOnInfo();

        foreach (Table t in tbs)
        {
            sli = t.LogOnInfo;
            sli.ConnectionInfo = _conn;
            t.ApplyLogOnInfo(li);
        }
    }
}


public static ConnectionInfo GetConnectionInfo()
{
    ConnectionInfo conn = new ConnectionInfo();
    conn.Type = ConnectionInfoType.SQL;
    conn.UserID = GlobalSettings.Default.DatabaseUser;
    conn.ServerName = GlobalSettings.Default.ServerName;
    conn.Password = GlobalSettings.Default.DatabasePassword;
    conn.IntegratedSecurity = GlobalSettings.Default.UseIntegratedSecurity;
    conn.DatabaseName = GlobalSettings.Default.DatabaseName;

    return conn;
}
  

Когда я просматриваю VS 2008 и иду Crystal Reports -> База данных -> Эксперт по базе данных -> Свойства

 Database Type: OLE DB(ADO)
Provider : SQLNCLI10
Data Source: {My dev SQL SERVER SERVER Instance}
Initial Catalog: {My dev DB NAME}
User ID: {My dev User ID}
Integrated Security: false
  

Редактировать:
После снятия флажка «Проверять при каждой печати» проблема по-прежнему возникает

Ответ №1:

Просто установите объект ConnectionInfo непосредственно после очистки текущих подключений к источникам данных. Измените свой метод ConfigureLogonInfo на приведенный ниже:

 public static void ConfigureLogonInfo(ReportDocument _report, ConnectionInfo _conn)
    {
        _report.DataSourceConnections.Clear();
        foreach(Table tbl in _report.Database.Tables)
        {
            tbl.LogOnInfo.ConnectionInfo = _conn;
        }

        for(int i = 0; i < _report.Subreports.Count; i  )
        {
            var sub = _report.Subreports[i];
            sub.DataSourceConnections.Clear();                
            foreach(Table tbl in sub.Database.Tables)
            {
                tbl.LogOnInfo.ConnectionInfo = _conn;
            }
        }
    }
  

Комментарии:

1. Джастин, это не сработало. Все еще представляет мне экран входа в базу данных.

2. Джастин, ты был прав с DataSourceConnections. Очистить (). Однако ваш код неверен. Вы должны вызывать ApplyLogOnInfo (ConnectionInfo), иначе новая информация о соединении никогда не сохраняется; Мне также пришлось установить собственный клиент sql на клиентском компьютере. Если вы знаете какой-либо способ, которым я могу связать это с программой, я хотел бы это услышать.