Подтвердить что ты не робот

DataSet не поддерживает System.Nullable <> в экспорте

Я пытался создать отчет с помощью Export to Excell, PDF, TextFile. Ну, я делаю это в MVC. У меня есть класс, который я назвал SPBatch (который является точным именем моей хранимой процедуры в моем SQL) и содержит следующее:

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

как вы можете видеть, некоторые мои столбцы объявлены как Nullable. Он прошел гладко из поиска и отображения результатов в таблице. У меня есть несколько кнопок ниже, которые являются кнопками изображения для экспорта, и каждый раз, когда я пытаюсь экспортировать в Excel, я всегда получаю проблему " DataSet не поддерживает System.Nullable < > " в этой части моего кода

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 up.

    }
    else if (mi.MemberType == MemberTypes.Field)
    {
        FieldInfo fi = mi as FieldInfo;
        dt.Columns.Add(fi.Name, fi.FieldType);
    }
}

появляется ошибка с комментарием. Можете ли вы помочь мне, что делать? Я попытался добавить DBNull в свой код, но все равно получаю ту же ошибку. Я попытался удалить Nullable в моей SPBatch, но я получаю сообщение об ошибке, что некоторые таблицы должны быть объявлены как Nullable.

Что мне делать?

4b9b3361

Ответ 1

попробуйте

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

Ответ 2

Благодаря версии С# для генерации данных и некоторого взлома, я могу предложить этот ответ в VB - я включил его здесь, потому что у меня просто было много хлопот, желающих получить фильтруемый набор данных из сохраненного proc, используя простой datalayer. Я надеюсь, что это поможет кому-то еще!

Примечание. Вариант использования - это то, где вы хотите использовать BindingSource.Filter = "строка запроса":

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

Ответ 3

Я бы искал nullable и заменил его на строку, которая может быть нулевой, в отличие от DateTime.

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

Вот полная версия:

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