MinionsVino Ответов: 1

Программно проверьте, изменен ли набор данных crystal report или нет.


У меня есть несколько отчетов crystal, и если таблица или столбец базы данных изменены, то мне нужно знать, что набор данных этих отчетов изменен или не используется код c#. Например, я могу вручную щелкнуть правой кнопкой мыши набор данных отчета, а затем нажать кнопку "Проверить базу данных". Там будет написано: "база данных обновлена". То же самое действие я хочу выполнить с помощью кода c#. Пожалуйста, поделитесь своими идеями. Возможно ли это с помощью кода c#.

Что я уже пробовал:

Я использовал метод VerifyDatabase,

var analysisSuccess = true;
          var reportDocumentRc = new ReportDocument();

          try
          {
              this.Cursor = Cursors.WaitCursor;
              reportDocumentRc.Load(reportFileFullName);
              -----> reportDocumentRc.VerifyDatabase();


но он выбрасывает исключение типа "вход в систему не удался".

1 Ответов

Рейтинг:
0

an0ther1

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

ReportDocument rptDoc = new ReportDocument();
rptDoc.Load("Path and Filename of the Report");
// Create a Crystal ConnectionInfo object
CrystalDecisions.Shared.ConnectionInfo conRpt = new ConnectionInfo();
conRpt.ServerName = "DB Server";
conRpt.DatabaseName = "DB Name";
// use the below for SQL authentication
conRpt.IntegratedSecurity = false;
conRpt.UserID = "SQL Username";
conRpt.Password = "SQL Password";
// use the below if using Windows Authentication
// conRpt.IntegratedSecurity = true;

// Apply the connection information to the report tables
CrystalDecisions.CrystalReports.Engine.Tables tblsRpt = rptDoc.Database.Tables;
for(int i = 0; i < tblsTRpt.Count; i++)
{
    CrystalDecisions.CrystalReports.Engine.Table tblRpt = tblsRpt[i];
    CrystalDecisions.Shared.TableLogOnInfo infoTbl = tblRpt.LogOnInfo;
    infoTbl.ConnectionInfo = conRpt;
    tblRpt.ApplyLogOnInfo(infoTbl);
}
// If the Report contains sub reports you need to loop through each sub-report and apply the LogOnInfo to each Sub Report table

// you should now be able to Verify the database
rptDoc.VerifyDataBase();


Пожалуйста, обратите внимание; VerifyDatabase не возвращает значение, поэтому я ожидаю, что вам нужно будет обернуть оператор в try/catch/finally & обрабатывать ошибки самостоятельно

Надеюсь, это поможет


MinionsVino

Большое вам спасибо за ваши ценные комментарии, разве это единственный способ проверить набор данных в crystal report с помощью кода c#? Потому что причина, по которой я спрашиваю, у меня много хрустальных отчетов. Если я буду перебирать каждый из них, то это займет много времени.

an0ther1

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

с уважением

MinionsVino

Он пуст, поэтому он не вернет никакого значения, тогда не могли бы вы сказать мне, какова цель "rptDoc.VerifyDataBase" ?

an0ther1

Привет Миниос,

Я проверил VerifyDatabase & он не делает ничего, что я могу видеть - даже если я изменяю схему, он ничего не возвращает и не выдает ошибку.

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

с уважением

MinionsVino

Спасибо.