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);