C# 在C中处理SQL中的空类型#
我正在使用C# 在C中处理SQL中的空类型#,c#,sql,null,C#,Sql,Null,我正在使用SqlDataReader从SQL表中获取值,并将它们分配给各自的变量。但是在我的表中,int和double类型列具有空值。因此,当我试图读取nullint并将其分配给int变量时,它崩溃了 以下是如何将值分配给: public int ID { get; set; } public int Map { get; set; } public int TypeID { get; set; } 这就是他们被解读的地方: while (objSqlDataReader.Read()) {
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
,如何将空值分配给它?您可以在查询本身中执行此操作。在Oracle中,函数是NVL()
。看起来您正在使用MS Sql Server,它使用:
ISNULL(YOUR_FIELD,0)
其他RDBMS的用法和语法如下:您可以在查询本身中执行此操作。在Oracle中,函数是
NVL()
。看起来您正在使用MS Sql Server,它使用:
ISNULL(YOUR_FIELD,0)
其他RDBMS的用法和语法如下:因此,为了找到可能的答案,我查看了您所讨论的类的文档: 有一个IsDBNull方法。在没有C#的情况下,这应该是可行的:
while (objSqlDataReader.Read())
{
data= new data();
if (!objSqlDataReader.IsDBNull(objSqlDataReader.GetOrdinal("EFID")))
{
emissiondata.ID = (int)objSqlDataReader["EFID"];
} else {
// Whatever you want to do when it is null
}
if (!objSqlDataReader.IsDBNull(objSqlDataReader.GetOrdinal("EFMappingID")))
{
emissiondata.Map = (int)objSqlDataReader["EFMappingID"];
} else {
// Whatever you want to do when it is null
}
if (!objSqlDataReader.IsDBNull(objSqlDataReader.GetOrdinal("MobileTypeID")))
{
emissiondata.TypeID = (int)objSqlDataReader["MobileTypeID"];
} else {
// Whatever you want to do when it is null
}
}
因此,为了找到一个可能的答案,我查看了您所谈论的课程的文档: 有一个IsDBNull方法。在没有C#的情况下,这应该是可行的:
while (objSqlDataReader.Read())
{
data= new data();
if (!objSqlDataReader.IsDBNull(objSqlDataReader.GetOrdinal("EFID")))
{
emissiondata.ID = (int)objSqlDataReader["EFID"];
} else {
// Whatever you want to do when it is null
}
if (!objSqlDataReader.IsDBNull(objSqlDataReader.GetOrdinal("EFMappingID")))
{
emissiondata.Map = (int)objSqlDataReader["EFMappingID"];
} else {
// Whatever you want to do when it is null
}
if (!objSqlDataReader.IsDBNull(objSqlDataReader.GetOrdinal("MobileTypeID")))
{
emissiondata.TypeID = (int)objSqlDataReader["MobileTypeID"];
} else {
// Whatever you want to do when it is null
}
}
现在无法测试它,但您可以尝试使用
int?
,可以为空的int
。这是Nullable
的缩写。如果可以将objSqlDataReader
强制转换为int?
,请将字段更改为int?
,如果必须在值为null时执行某些操作,请向属性setter添加额外的逻辑。现在无法测试它,但可以尝试使用int?
,即可为null的int
。这是Nullable
的缩写。如果可以将objSqlDataReader
强制转换为int?
,请将字段更改为int?
,如果必须在值为null时执行某些操作,请向属性setter添加额外的逻辑。DBNull.value对数据表行有效,我不确定是否使用SqlDataReader:
bool isNull = objSqlDataReader.GetOrdinal("EFID") == DBNull.Value;
例如,如果您使用SqlDataReader,那么它们是现成的空感知的
不要拆箱:
emissiondata.ID = (int)objSqlDataReader["EFID"];
您可以这样做:
SqlInt32 emissionId = objSqlDataReader.GetSqlInt32(emissionIdOrdinal);
然后您可以直接测试空值:
if (emissionId.IsNull) ...
if (emissionId == null)
但是,这些方法需要列的序号来访问值。可以在循环之前设置这些序号
int emissionIdOrdinal = rdr.GetOrdinal("EFID");
但是如果你真的想要C#的null,你可以为它创建一个helper函数:
public static int? ToNullable(this SqlInt32 value)
{
return value.IsNull ? (int?) null : value.Value;
}
要使用可为空的变量访问它,请执行以下操作:
int? emissionId = objSqlDataReader.GetSqlInt32(emissionIdOrdinal).ToNullable();
public int? ID { get; set; }
public int? Map { get; set; }
public int? TypeID { get; set; }
您现在可以直接测试null:
if (emissionId.IsNull) ...
if (emissionId == null)
建议您尝试将类的属性更改为可为null的类型,避免使用其他变量:
int? emissionId = objSqlDataReader.GetSqlInt32(emissionIdOrdinal).ToNullable();
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();
DBNull.Value适用于DataTable行,我不确定是否使用SqlDataReader:
bool isNull = objSqlDataReader.GetOrdinal("EFID") == DBNull.Value;
例如,如果您使用SqlDataReader,那么它们是现成的空感知的
不要拆箱:
emissiondata.ID = (int)objSqlDataReader["EFID"];
您可以这样做:
SqlInt32 emissionId = objSqlDataReader.GetSqlInt32(emissionIdOrdinal);
然后您可以直接测试空值:
if (emissionId.IsNull) ...
if (emissionId == null)
但是,这些方法需要列的序号来访问值。可以在循环之前设置这些序号
int emissionIdOrdinal = rdr.GetOrdinal("EFID");
但是如果你真的想要C#的null,你可以为它创建一个helper函数:
public static int? ToNullable(this SqlInt32 value)
{
return value.IsNull ? (int?) null : value.Value;
}
要使用可为空的变量访问它,请执行以下操作:
int? emissionId = objSqlDataReader.GetSqlInt32(emissionIdOrdinal).ToNullable();
public int? ID { get; set; }
public int? Map { get; set; }
public int? TypeID { get; set; }
您现在可以直接测试null:
if (emissionId.IsNull) ...
if (emissionId == null)
建议您尝试将类的属性更改为可为null的类型,避免使用其他变量:
int? emissionId = objSqlDataReader.GetSqlInt32(emissionIdOrdinal).ToNullable();
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();
我知道这很古老,但如果您在2016-07-14之后需要此答案: 当SQL类型为int时,为null 使用int?作为数据类型
智力?是一个“可为NULL”的int-因此,当SQL为列返回NULL时,属性值将接收NULL值。我知道这是旧的,但如果您在2016-07-14之后需要此答案: 当SQL类型为int时,为null 使用int?作为数据类型
智力?是一个“可为NULL”的int-因此,当SQL为列返回NULL时,属性值将接收NULL值。这会将我的变量赋值为空还是0?如果是空的,我希望将其保留为空null@TannyFgh,我不确定您使用的是哪种编程语言,但通常不能将null强制转换为
int
原语。@TannyFgh,如果需要为空,则需要使用字符串数据类型。它不会像您将null强制转换为int
那样工作int
是一个数字。总是。我在查询中尝试了ISNULL(您的_字段,0),但它仍然没有将0分配给变量。这会将我的变量赋值为空还是0?如果是,我希望它保持为空null@TannyFgh,我不确定您使用的是哪种编程语言,但通常不能将null强制转换为int
原语。@TannyFgh,如果需要它为空,则需要使用字符串数据类型。它不会像您将null强制转换为int
那样工作int
是一个数字。总是。我在查询中尝试了ISNULL(您的_字段,0),但它仍然没有将0分配给变量。它崩溃了