gcogco10 Ответов: 1

System.notsupportedexception: 'dataset не поддерживает system.nullable<>.'


Привет Команда

Я получаю ошибку броска для создания отчета crystal и не знаю, как ее решить. Пожалуйста, помогите, что я могу упустить?

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

public ActionResult Download_XMLReport()
      {
          eNtsaRegistration context = new eNtsaRegistration();

          ReportDocument rpt = new ReportDocument();
          rpt.Load(Path.Combine(Server.MapPath("~/Reports"), "AcademyReports.rpt"));
          rpt.SetDataSource(context.TrainingRegs.Select(c => new
          {

             id= c.Id
          }).ToList());
          Response.Buffer = false;
          Response.ClearContent();
          Response.ClearHeaders();

          rpt.PrintOptions.PaperOrientation = CrystalDecisions.Shared.PaperOrientation.Landscape;
          rpt.PrintOptions.ApplyPageMargins(new CrystalDecisions.Shared.PageMargins(5, 5, 5, 5));
          rpt.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperA5;

          Stream stream = rpt.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
          stream.Seek(0, SeekOrigin.Begin);




          return File(stream, "application/xml", "eNtsaReportTrainingForm.xml");
      }


// Модель
public class eNtsaRegistration:DbContext
    {

        public eNtsaRegistration() : base("eNtsaRegistration")
        {
        }  public DbSet<TrainingRegForm> TrainingRegs { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            Database.SetInitializer<eNtsaRegistration>(null);
            base.OnModelCreating(modelBuilder);
        }
    }


public class TrainingRegForm
   {
       [Key]
       public Guid? Id { get; set; }
       public string Title { get; set; }
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public string Position { get; set; }
       public string Company { get; set; }

       public string StreetAddress { get; set; }

       public string StreetAddressLine { get; set; }

       public string City { get; set; }
       public string StateProvince { get; set; }

       public int ZipCode { get; set; }

       public string Email { get; set; }

       [Required(ErrorMessage = "This field is required")]
       [DataType(DataType.PhoneNumber)]
       public string CellNumber { get; set; }
       public string DietaryRequirement { get; set; }
   }

1 Ответов

Рейтинг:
0

Richard Deeming

Ваш Id свойство может принимать значение null Guid, который не поддерживается Crystal's SetDataSource метод.

Если идентификаторы всегда имеют значение, то выберите его:

rpt.SetDataSource(context.TrainingRegs.Select(c => new
{
    id = c.Id.Value
}).ToList());
Если вы хотите игнорировать идентификаторы, которые не имеют значения, то отфильтруйте их:
rpt.SetDataSource(context.TrainingRegs.Where(c => c.Id != null).Select(c => new
{
    id = c.Id.Value
}).ToList());
Если вам нужно сохранить нули, то вам нужно будет преобразовать значение в a SqlGuid[^]:
rpt.SetDataSource(context.TrainingRegs.AsEnumerable().Select(c => new
{
    id = c.Id == null ? SqlGuid.Null : new SqlGuid(c.Id.Value)
}).ToList());


gcogco10

Ричард, я не получаю недействительный индекс, что я могу упустить. Да, в таблице ID есть некоторые значения, которые не пусты.

Richard Deeming

Вы определили свою Id собственность того, чтобы быть Nullable<Guid>:
Типы значений с возможностью обнуления - Справочник по C# | Microsoft Docs[^]

Эта функция не поддерживается системой DataSet именно это Crystal Reports использует за кулисами.

Используйте один из вариантов из моего решения, чтобы удалить ошибку.

gcogco10

Ричард я определил его в своей модели как [ключ]
публичный Guid? Id { get; set; }. этот идентификатор содержит значение в таблице из базы данных.

Richard Deeming

Да - как я все время говорю, вы определили его как идентификатор GUID, допускающий значение null .

Если вы прочтете ссылку из моего предыдущего комментария, то увидите, что добавление ? после Guid делает его недействительным. Это короткий путь для Nullable<Guid>.

Эта функция была добавлена в .NET 2.0 и не поддерживается DataSet.