C# SqlDataReader错误:在<;空>;和';十进制';

C# SqlDataReader错误:在<;空>;和';十进制';,c#,C#,我正在开发一个C#桌面应用程序,有一个关于如何使用SqlDataReader从数据库检索值的问题。 当值为表中的varchar时,我使用以下命令将该值保存在实体中: if (dr.HasRows){ while (dr.Read()){ Empleado dato = new Empleado(); dato.DUIEmp = dr.IsDBNull(0) ? "No Info" : dr.GetString(0); ... 但我不知道如何从数据库中检索十进制值

我正在开发一个C#桌面应用程序,有一个关于如何使用SqlDataReader从数据库检索值的问题。 当值为表中的varchar时,我使用以下命令将该值保存在实体中:

if (dr.HasRows){
    while (dr.Read()){
    Empleado dato = new Empleado();
    dato.DUIEmp = dr.IsDBNull(0) ? "No Info" : dr.GetString(0);
    ...
但我不知道如何从数据库中检索十进制值,目前我正在使用它,但不起作用:

dato.Salario = dr.IsDBNull(4) ? (decimal?)null : Convert.ToDecimal(dr.GetDecimal(4)); 
而且日期值也有同样的问题

dato.FechaIngreso = dr.IsDBNull(6) ? "No Info" : dr.GetDateTime(6);

请您帮助我并告诉我如何使用SqlDatareader检索这些类型的数据?

默认情况下,
decimal
DateTime
不可为空。因此,在声明了
Salario
FechaIngreso
属性的类中,将这些属性设置为null

decimal? Salario {get;set;}
DateTime? FechaIngreso {get;set;}

如果类
Empleado
Salario
属性声明为Decimal(不可为null的Decimal),那么您应该检索您的值,并在null情况下指定一个默认值(就像您对字符串字段所做的那样)

还要注意,调用GetDecimal并不需要Convert.ToDecimal

因此,如果您有其他日期类型,那么您可以使用相同的方法

dato.FechaIngreso = dr.IsDBNull(6) ? default(DateTime) : dr.GetDateTime(6);

如果您的班级已经:

decimal? Salario {get;set;}
DateTime? FechaIngreso {get;set;}
这样:

null as decimal?

要在数据容器中容纳未分配的值,请使用可为空的字段:
decimal?
DateTime?
int?
等。谢谢。我做了小数点?Salario{get;set;}改变,这对我来说很好:dato.Salario=dr.IsDBNull(4)?(十进制?)null:Convert.ToDecimal(dr.GetDecimal(4));但是为什么它不能在字符串中工作,例如:公共字符串?名称我收到错误1类型“string”必须是不可为null的值类型,才能将其用作泛型类型或方法“System.nullable”中的参数“T”。。。顺便说一句,我正在将数据记录(许多Empleado实体)保存到IEnumerable类型
string
已经是可空类型。无需使用
string?
excelente。)m工作得很好,但是如果涉及到其他类型的数据,比如DateTime、double、float,该怎么办?我是否可以始终使用0m,还是应该使用另一个表达式,即0f(float)、0d(Datetime)…不,您需要使用适当的类型。或者更好地使用该类型的默认值。最新答案
null as decimal?