数据集不支持System.Nullable <>实体框架

问题描述

我需要我的属性允许空值,所以我将其声明为

id BIGINT PRIMARY KEY AUTO_INCREMENT

但是这样做时,我会收到此错误

DataSet不支持System.Nullable 。

这是我的代码,用于调用存储过程并将表传递给Crystal Report

Nullable<double> Nat_Salary

这是我的课程

if (Report_Number == "2")
{
   var Employee_Data = db.Database.SqlQuery<SR1_Result>("SR1").ToList();
   bs.DataSource = Employee_Data;
}

ReportDocument rpt = new ReportDocument();
rpt.Load(Application.StartupPath + "\\Report\\Arabic\\" + "R" + Report_Number + ".rpt");

rpt.SetDataSource(bs);

这是存储过程:

public partial class SR1_Result
{
    public int EmployeeCode { get; set; }
    public string EmployeeName { get; set; }
    public string JobName { get; set; }
    public System.DateTime Date_Hiring { get; set; }
    public Nullable <double> Nat_Salary { get; set; }
    public string AdministrationName { get; set; }
    public string DepartmentName { get; set; }
    public string BranchName { get; set; }
}

如何在不从ALTER PROCEDURE [dbo].[SR1] AS BEGIN SELECT EmployeeCode,EmployeeName,JobName,Date_Hiring,Nat_Salary,AdministrationName,DepartmentName,BranchName FROM Employee_List_Code_Name_Jop_DateHiring s END 删除可空值的情况下解决此错误?

解决方法

猜测,由于您显示的代码实际上根本没有提及或使用DataSet / DataTable,因此Crystal Reports在内部将List<SR1_Result>拆包为DataTable,并自动创建列,但是盲目地将Nullable<double> SR1_Result.Nat_Salary传递给datatable.Columns.Add("Nat_Salary",typeof(Nat_Salary))(或它的反射等效项),并且DataTable反对将一列声明为Nullable

您必须修复传入的对象的形状,并且最明智的做法是,它看起来像您创建的DataTable,而不是交给CR来做

丢弃ToList调用,并编写一个循环/一些代码,该代码创建一个数据表并将其填充以传递给CR。该列可以声明为具有typeof(double),也可以声明为AllowDbNull = true,然后在填充时,如果Nat_Salary为null,则不要为该列设置值

简单地说:

var dt = new DataTable();
...
dt.Column.Add("Nat_Salary",typeof(double)).AllowDbNull = true;
...

foreach(var x in db.Database.SqlQuery<SR1_Result>("SR1"))
  var ro = dt.Rows.NewRow();
  ...
  if(x.Nat_Salary.HasValue)
    ro["Nat_Salary"] = x.Value;
  ...
}

或者,如果将Nat_Salary明智地转换为不可为空的类型,则可以.Select使用CR的匿名类型进行转换,以使用Nat_Salary的替代值

var r = db.Database.SqlQuery<SR1_Result>("SR1").Select(x =>
  ...,Nat_Salary = x.Nat_Salary.GetValueOrDefault(0),...
);

这会将SR1_Result更改为具有Nat_Salary的匿名类型,该类型不再是Nullable<double>,而是普通的double,并且在内部转换为数据表时CR不会爆炸>


在这两个代码示例中,...是您在SR1_Result中的其他列。您将必须列出它们,除非您想要进行同样的反思“查看对象,列出其属性名称和类型,并将其变成数据表,但如果该属性为可空,则应用一些自定义逻辑”过程


或者,也许CR已经遇到了这种破坏行为,并推出了一个版本的CR,以检查该属性是否可为空,并创建一列以允许Nullable包装的类型为null的列-检查更新/与CR对话(谁现在拥有他们)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...