reports net mvc crystal create asp and admite c# asp.net-mvc-4 dataset export-to-excel nullable

c# - net - DataSet no es compatible con System.Nullable<> en Export



export to excel mvc 4 c# (3)

Intentaba generar un Informe usando Exportar a Excell, PDF, TextFile. Bueno, estoy haciendo esto en MVC. Tengo una clase que denominé SPBatch (que es el nombre exacto de mi Procedimiento almacenado en mi SQL) y contiene lo siguiente:

public string BatchNo { get; set; } public string ProviderName { get; set; } public Nullable<System.Int32> NoOfClaims { get; set; } public Nullable<System.Int32> TotalNoOfClaims { get; set; } public Nullable<System.Decimal> TotalBilled { get; set; } public Nullable<System.Decimal> TotalInputtedBill { get; set; } public Nullable<System.DateTime> DateCreated { get; set; } public Nullable<System.DateTime> DateSubmitted { get; set; } public Nullable<System.DateTime> DueDate { get; set; } public string Status { get; set; } public string RefNo { get; set; } public string BatchStatus { get; set; } public string ClaimType { get; set; }

como puede ver, algunas de mis Columnas se declaran nulables. Pasó sin problemas de buscar y mostrar los resultados en una tabla. Tengo varios botones debajo de los cuales están los botones de imagen para exportar y cada vez que trato de exportar en Excel, siempre aparece el problema " DataSet no admite System.Nullable <> " en esta parte de mi código:

foreach (MemberInfo mi in miArray) { if (mi.MemberType == MemberTypes.Property) { PropertyInfo pi = mi as PropertyInfo; dt.Columns.Add(pi.Name, pi.PropertyType); //where the error pop''s up. } else if (mi.MemberType == MemberTypes.Field) { FieldInfo fi = mi as FieldInfo; dt.Columns.Add(fi.Name, fi.FieldType); } }

el error aparece en el que tiene un comentario. ¿Me puedes ayudar qué hacer? Traté de agregar DBNull en mi código, pero todavía obtengo el mismo error. Traté de eliminar Nullable en mi SPBatch, pero me da un error que algunas tablas deben declararse como Nullable.

¿Que debería hacer?


Gracias a una versión de C # de generar una tabla de datos y algunas intrusiones, puedo ofrecer esta respuesta en VB. La puse aquí porque me costó mucho conseguir un conjunto de datos filtrables de un proceso almacenado mientras usaba una simple capa de datos. ¡Espero que ayude a alguien más!

Nota: El caso de uso es donde desea utilizar BindingSource.Filter = "alguna cadena de consulta":

Imports System.Reflection Public Module Extenders <System.Runtime.CompilerServices.Extension> Public Function ToDataTable(Of T)(collection As IEnumerable(Of T), tableName As String) As DataTable Dim tbl As DataTable = ToDataTable(collection) tbl.TableName = tableName Return tbl End Function <System.Runtime.CompilerServices.Extension> Public Function ToDataTable(Of T)(collection As IEnumerable(Of T)) As DataTable Dim dt As New DataTable() Dim tt As Type = GetType(T) Dim pia As PropertyInfo() = tt.GetProperties() ''Create the columns in the DataTable For Each pi As PropertyInfo In pia Dim a = If(Nullable.GetUnderlyingType(pi.PropertyType), pi.PropertyType) dt.Columns.Add(pi.Name, If(Nullable.GetUnderlyingType(pi.PropertyType), pi.PropertyType)) Next ''Populate the table For Each item As T In collection Dim dr As DataRow = dt.NewRow() dr.BeginEdit() For Each pi As PropertyInfo In pia dr(pi.Name) = If(Nullable.GetUnderlyingType(pi.PropertyType) Is GetType(DateTime), DBNull.Value, pi.GetValue(item, Nothing)) Next dr.EndEdit() dt.Rows.Add(dr) Next Return dt End Function End Module


Yo buscaría las etiquetas y las reemplazaré con una cadena que puede ser nula a diferencia de DateTime.

foreach (PropertyInfo pi in properties) { if (pi.PropertyType.Name.Contains("Nullable")) myDataType = typeof(String); else myDataType = pi.PropertyType; }

Aquí hay una versión completa:

private DataTable CreateDataTable(PropertyInfo[] properties) { DataTable dt = new DataTable(); DataColumn dc = null; foreach (PropertyInfo pi in properties) { dc = new DataColumn(); dc.ColumnName = pi.Name; if (pi.PropertyType.Name.Contains("Nullable")) dc.DataType = typeof(String); else dc.DataType = pi.PropertyType; // dc.DataType = pi.PropertyType; dt.Columns.Add(dc); } return dt; }


prueba con

dt.Columns.Add(pi.Name, Nullable.GetUnderlyingType( pi.PropertyType) ?? pi.PropertyType);