C# 数据集不支持System.Nullable<>';实体框架
我需要我的属性允许null,所以我将其声明为C# 数据集不支持System.Nullable<>';实体框架,c#,sql,entity-framework,crystal-reports,C#,Sql,Entity Framework,Crystal Reports,我需要我的属性允许null,所以我将其声明为 Nullable<double> Nat_Salary 如果不从Nat_Salary中删除空值,我如何修复此错误?猜测一下,因为您显示的代码实际上根本没有提到或使用数据集/数据表,Crystal Reports正在内部将您的列表解压缩到数据表中,并自动创建列,但盲目地将可为null的SR1_结果.Nat_Salary传递给数据表.columns.Add(“Nat_Salary”,typeof(Nat_Salary))(或其反射等效项),
Nullable<double> Nat_Salary
如果不从
Nat_Salary
中删除空值,我如何修复此错误?猜测一下,因为您显示的代码实际上根本没有提到或使用数据集/数据表,Crystal Reports正在内部将您的列表解压缩到数据表中,并自动创建列,但盲目地将可为null的SR1_结果.Nat_Salary
传递给数据表.columns.Add(“Nat_Salary”,typeof(Nat_Salary))
(或其反射等效项),并且datatable反对将列声明为可为null
您必须调整传入对象的形状,最明智的做法是,它可能看起来像您创建的数据表,而不是让CR来完成
放弃ToList
调用,编写一个循环/一些代码,创建一个数据表并填充它以传递给CR。可以将该列声明为具有typeof(double)
和AllowDbNull=true
,然后在填充时,如果Nat\u 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;
...
}
这会将SR1_结果更改为匿名类型,该类型的Nat_薪水不再是可为空的
,而是普通的双精度
,并且CR在内部转换为datatable时不会爆炸
在这两个代码示例中,…
是您在SR1\u Result
中的其他列。您必须列出它们,除非您想执行相同的反射“查看对象,列出其属性名称和类型,并将其转换为数据表,但如果属性可为空,则应用一些自定义逻辑”过程
或者,CR可能已经遇到了这种错误行为,并推出了CR的一个版本来检查属性是否可为Null,并生成一个列,允许nullable包装的类型为Null-检查更新/与CR对话(现在拥有它们的人)我再运行一遍;这和数据集有什么关系?@CaiusJard我把从存储过程返回的数据集放在数据集中..并在Crystal Report中加载数据集您的帖子中没有提到数据集的代码?错误显示在这里--(rpt.SetDataSource(bs);)我猜bs
是绑定源(这并不是真的相关),在您展示的代码中,您对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
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;
...
}
var r = db.Database.SqlQuery<SR1_Result>("SR1").Select(x =>
...,
Nat_Salary = x.Nat_Salary.GetValueOrDefault(0),
...
);