我正在使用 SqlDataReader
从 SQL 表中获取值并将它们分配给各自的变量。但是在我的表中,int
和 double
类型的列具有空值。因此,当我尝试读取 null
int
并将其分配给 int
变量时,它崩溃了。
以下是值的分配方式:
public int ID { get; set; }
public int Map { get; set; }
public int TypeID { get; set; }
这是阅读它们的地方:
while (objSqlDataReader.Read())
{
data= new data();
emissiondata.ID = (int)objSqlDataReader["EFID"];
emissiondata.Map = (int)objSqlDataReader["EFMappingID"];
emissiondata.TypeID =(SqlInt32)objSqlDataReader["MobileTypeID"];
因此,如果其中任何一个为 null
,即使我正在调试它,它也会崩溃并且不会继续。
我如何处理 SQL 中的 null
值,如果 int
为 null
,我如何将空值分配给它?
最佳答案
DBNull.Value 适用于 DataTable 行,我不确定 SqlDataReader:
bool isNull = objSqlDataReader.GetOrdinal("EFID") == DBNull.Value;
如果使用 SqlDataReader 的 GetSqlInt32,GetSqlDateTime, etc例如,它们是开箱即用的 null 感知。
而不是拆箱:
emissiondata.ID = (int)objSqlDataReader["EFID"];
您改为这样做:
SqlInt32 emissionId = objSqlDataReader.GetSqlInt32(emissionIdOrdinal);
然后你可以直接测试null:
if (emissionId.IsNull) ...
但是,这些方法需要列的序号才能访问值。您可以在循环之前设置这些序数
int emissionIdOrdinal = rdr.GetOrdinal("EFID");
但是如果你真的想要 C# 的 null,你可以为它创建一个辅助函数:
public static int? ToNullable(this SqlInt32 value)
{
return value.IsNull ? (int?) null : value.Value;
}
使用可空变量访问它:
int? emissionId = objSqlDataReader.GetSqlInt32(emissionIdOrdinal).ToNullable();
您现在可以直接测试 null 了:
if (emissionId == null)
一个建议,尝试将类的属性更改为可空类型,从而排除使用其他变量的需要:
public int? ID { get; set; }
public int? Map { get; set; }
public int? TypeID { get; set; }
最终代码:
data= new data();
emissiondata.ID = objSqlDataReader.GetSqlInt32(emissionIdOrdinal).ToNullable();
emissiondata.Map = objSqlDataReader.GetSqlInt32(emissionMapOrdinal).ToNullable();
关于c# - 在 C# 中处理来自 SQL 的 Null 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10441291/