数据集不支持 System.Nullable<>。' Entity Framework
DataSet does not support System.Nullable<>.' Entity Framework
我需要我的 属性 允许 null,所以我将其声明为
Nullable<double> Nat_Salary
但是这样做时,我得到了这个错误
DataSet does not support System.Nullable<>.
这是我调用存储过程并将 table 传递给 Crystal 报告的代码
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);
这是我的class
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
如何在不从 Nat_Salary
中删除可为 null 的情况下修复此错误?
据推测,因为您显示的代码实际上根本没有提及或使用 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
调用并编写 loop/some 代码来创建数据表并填充它以传递给 CR。该列可以声明为具有 typeof(double)
和 AllowDbNull = true
,然后在填充时,如果 Nat_Salary 为空,则不要为该列设置值
简单地说:
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[= 的替代值23=]
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
中的其他列。你必须将它们列出来,除非你想进行相同的反射“查看对象,列出其 属性 名称和类型并将其转换为数据表,但如果 属性 可以为 null" 过程
或者,也许 CR 已经 运行 进入这种损坏的行为,并推出一个 CR 版本来检查 属性 是否可为空,并创建一个允许 Nullable 类型的空值的列包装 - 检查 updates/speak 到 CR(现在拥有它们的人)
我需要我的 属性 允许 null,所以我将其声明为
Nullable<double> Nat_Salary
但是这样做时,我得到了这个错误
DataSet does not support System.Nullable<>.
这是我调用存储过程并将 table 传递给 Crystal 报告的代码
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);
这是我的class
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
如何在不从 Nat_Salary
中删除可为 null 的情况下修复此错误?
据推测,因为您显示的代码实际上根本没有提及或使用 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
调用并编写 loop/some 代码来创建数据表并填充它以传递给 CR。该列可以声明为具有 typeof(double)
和 AllowDbNull = true
,然后在填充时,如果 Nat_Salary 为空,则不要为该列设置值
简单地说:
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[= 的替代值23=]
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
中的其他列。你必须将它们列出来,除非你想进行相同的反射“查看对象,列出其 属性 名称和类型并将其转换为数据表,但如果 属性 可以为 null" 过程
或者,也许 CR 已经 运行 进入这种损坏的行为,并推出一个 CR 版本来检查 属性 是否可为空,并创建一个允许 Nullable 类型的空值的列包装 - 检查 updates/speak 到 CR(现在拥有它们的人)