2017-06-07 4 views
1

Ich benutze vs2012 asp.net MVC und Crystal Reports v.13.Dataset unterstützt nicht System Nullable in Crystal Reports

ich habe diesen Fehler, wenn ich versuche, den Crystal Report

DataSet unterstützen> System.Nullable < nicht zu exportieren.

an dieser Linie

rd.SetDataSource (cn.Customers.Select (c => new

public ActionResult Index() 
    { 
     ViewBag.listCustomers = cn.Customers.ToList(); 
     return View(); 
    } 
    public ActionResult Export() 
    { 
     ReportDocument rd = new ReportDocument(); 
     rd.Load(Path.Combine(Server.MapPath("~/Reports/CustomerReport.rpt"))); 
     rd.SetDataSource(cn.Customers.Select(c => new 
     { 
      CustomerID = c.CustomerID , 
      CustomerName = c.CustomerName , 
      CustomerEmail = c.CustomerEmail , 
      CustomerZipCode = c.CustomerZipCode , 
      CustomerCountry = c.CustomerCountry , 
      CustomerCity = c.CustomerCity, 
     }).ToList()); 

     Response.Buffer = false; 
     Response.ClearContent(); 
     Response.ClearHeaders(); 
     Stream stream = rd.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat); 
     stream.Seek(0, SeekOrigin.Begin); 

     return File(stream, "application/pdf", "CustomerList.pdf"); 
    } 

Dies ist die Ansicht:

<table> 
 
    <tr> 
 
     <td>CustomerID</td> 
 
     <td>CustomerName</td> 
 
     <td>CustomerEmail</td> 
 
     <td>CustomerZipCode</td> 
 
     <td>CustomerCountry</td> 
 
     <td>CustomerCity</td> 
 
    </tr> 
 
    @foreach (var cust in ViewBag.listCustomers) 
 
    { 
 
     <tr> 
 
      <td>@cust.CustomerID</td> 
 
      <td>@cust.CustomerName</td> 
 
      <td>@cust.CustomerEmail</td> 
 
      <td>@cust.CustomerZipCode</td> 
 
      <td>@cust.CustomerCountry</td> 
 
      <td>@cust.CustomerCity</td> 
 
     </tr> 
 
    } 
 
    <br /> 
 
    <br /> 
 
    <a href="@Url.Action("Export","Customer")">Export report</a> 
 

 
</table>

Antwort

2

Ich verstehe, dass "cn.Customers.Select" einen anonymen Typ zurückgibt, in dem seine Attribute Typen eingegeben haben.

Dann übernimmt "rd.SetDataSource" das Objekt dieses anonymen Typs und erstellt ein DataSet für das ReportDocument.

Sobald der anonyme Typ über einen Inferenztyp verfügt, der keine NULL-Werte zulässt (aufgrund der Attribute Ihrer Customer-Klasse), versucht das Framework, eine DataColumn mit diesem NULL-Typ zu erstellen. So bekommst du den Fehler erwähnt.

So können Sie versuchen, den anonymen Typ zu steuern, um Nullwerttypen für seine Attribute zu vermeiden. Versuchen Sie Folgendes, um das zu tun. Aber da ich Ihre Kundenklasse nicht kenne, werde ich das Szenario vereinfachen und annehmen, dass es nur eine Eigenschaft hat und dass es nullfähig ist.

class Customer { public int? CustomerID; } 

Dann könnte man dies versuchen:

rd.SetDataSource(cn.Customers.Select(c => new 
{ 
    CustomerID = c.CustomerID == null ? 0 : c.CustomerID 
}).ToList()); 

Sie so etwas für alle Ihre Nullable-Attribute.

0

fand ich die Lösung, in der Modellklasse erzeugen Sie Ihre Klasse Costumers mehrere System.Nullable Felder haben, wie Datetime, Doppel-, ...

Sie die Definitionen finden, dass alle müssen sich ändern Ihrer Felder von System.Nullable zu normalen

Nullable<DateTime> date_exemple; 

zu

DateTime date_exemple; 

Hoffnung dies Ihr Problem zu lösen und glücklich Codierung