DataSet不支持System.Nullable<>

时间:2011-06-06 11:35:02

标签: frameworks crystal-reports dataset entity nullable

我有一个应用程序,它有btn预览水晶报告中的报告。我添加了数据集作为报表的数据源,并从工具箱中拖动了数据表,并添加了我需要的字段作为列。我从此链接获得了指示 http://aspalliance.com/2049_Use_LINQ_to_Retrieve_Data_for_Your_Crystal_Reports.2 。这是我的第二个报告第一个工作,并没有遇到任何问题,这就是为什么我很困惑,更不用说它也有可空列。错误说: DataSet不支持System.Nullable<>。

  private void ShowReportView()
    {

        string reportFile = "JudgeInfoFMReport.rpt";
        ObservableCollection<tblJudgeFileMaint> judgeFileMaintList;

        judgeFileMaintList = GenerateReport();

        if (judgeFileMaintList.Count > 0)
        {
            CrystalReportViewerUC crview2 = new CrystalReportViewerUC();
            crview2.SetReportPathFile(reportFile, judgeFileMaintList);
            crview2.ShowDialog();
        }
        else
        {
            System.Windows.MessageBox.Show("No record found.", module, MessageBoxButton.OK, MessageBoxImage.Information);
        }
    }

private ObservableCollection<tblJudgeFileMaint> GenerateReport()
    {
        var result = FileMaintenanceBusiness.Instance.GetAllJudgeInfoList();
        return new ObservableCollection<tblJudgeFileMaint>(result);
    }

错误发生在我设置数据源report.SetDataSource

的部分
 public bool SetReportPathFile(string reportPathFile, IEnumerable enumerable)
    {

            string reportFolder = @"\CrystalReportViewer\Reports\";
            string filename = System.Windows.Forms.Application.StartupPath + reportFolder + reportPathFile;  // "\\Reports\\CrystalReports\\DateWiseEmployeeInfoReport.rpt";
            ReportPathFile = filename;
            report.Load(ReportPathFile);
            report.SetDataSource(enumerable);
            report.SetDatabaseLogon("sa", "admin007");
            bRet = true;
       }

        _IsLoaded = bRet;

        return bRet;
    }

我读了一些答案并说我应该将空值设置为DBNUll,如果它可以为空,我会在每列的属性窗口中进行设置。有人可以帮我吗?感谢

4 个答案:

答案 0 :(得分:4)

你的问题可以在这篇文章中看到,但是以通用的方式......你可以通过这种方式将一个Object传递给一个输入的DataSet!

.NET - Convert Generic Collection to DataTable

答案 1 :(得分:0)

想通了。通过使用collectionextention,复制到某处,我忘记了链接。不管是谁造的,都要归功于你。

类方法看起来像这样。

public statis class CollectionExtension {
      public static DataSet ToDataSet<T>(this IEnumerable<T> collection, string dataTableName)
    {
        if (collection == null)
        {
            throw new ArgumentNullException("collection");
        }

        if (string.IsNullOrEmpty(dataTableName))
        {
            throw new ArgumentNullException("dataTableName");
        }

        DataSet data = new DataSet("NewDataSet");
        data.Tables.Add(FillDataTable(dataTableName, collection));
        return data;
    }
 }

然后您可以通过执行此操作来获取报告来源:

 private DataSet GenerateNeutralContEducReport(string dsName)
    {
        var contEduHistoryList = FileMaintenanceBusiness.Instance.GetManyNeutralFMContEducHistoryInfobyKeyword(CurrentNeutralFM.NeutralID, "NeutralID").ToList();
       return CollectionExtensions.ToDataSet<tblContinuingEducationHistory>(contEduHistoryList, dsName);
    }

答案 2 :(得分:0)

我从其他建议的答案中几乎找不到帮助,但是此解决方案有效。 解决此问题的另一种方法是使数据列可为空。

 DataColumn column = new DataColumn("column", Type.GetType("System.Int32"));
 column.AllowDBNull = true;
 dataTable.Columns.Add(column);

https://docs.microsoft.com/en-us/dotnet/api/system.data.datacolumn.allowdbnull?view=netcore-3.1

答案 3 :(得分:-1)

foreach (PropertyDescriptor property in properties)
{
    dt.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType);
}