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分配给变量。它崩溃了