Хорошо, так что dotjoe дал мне все подсказки, которые мне нужны, чтобы решить это.Следующий код можно использовать для извлечения текста команды из отчета Crystal.
public string getCommandText(ReportDocument rd)
{
if (!rd.IsLoaded)
throw new ArgumentException("Please ensure that the reportDocument has been loaded before being passed to getCommandText");
PropertyInfo pi = rd.Database.Tables.GetType().GetProperty("RasTables", BindingFlags.NonPublic | BindingFlags.Instance);
return ((dynamic)pi.GetValue(rd.Database.Tables, pi.GetIndexParameters()))[0].CommandText;
}
Это выглядит немного грязно, но это имеет какой-то смысл, когда вы начинаете пробираться через него.По сути, он использует отражение, чтобы получить значение свойства CommandText, с небольшой добавленной динамикой, чтобы обойти динамические свойства в ReportDocument.
Это тянет за собой текст команды, но у меня не было времени для каких-либо тестов кода.Я уверен, что сделаю некоторые изменения, как только у меня будет время поработать с этим.Я понятия не имею, что происходит с отчетами, в которых не используются «команды SQL».Я отправлю комментарий, как только я проверю это дальше.
PS Для этого необходимо сослаться на стандартные библиотеки отражений / динамиков, а также следующие библиотеки Crystal Report:
crystaldecisions.reportappserver.datadefmodel
crystaldecisions.crystalreports.engine
crystaldecisions.shared