1

我正在使用SqlDataReader从 SQL 表中获取值并将它们分配给它们各自的变量。但在我的表中,int类型double列具有空值。因此,当我尝试读取 anull 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,我如何为我的值分配空值?intnull

4

5 回答 5

2

DBNull.Value works on DataTable rows, I'm not sure with SqlDataReader:

bool isNull = objSqlDataReader.GetOrdinal("EFID") == DBNull.Value;

If you use SqlDataReader's GetSqlInt32,GetSqlDateTime, etc for example, they are null-aware out-of-the-box.

Instead of unboxing:

emissiondata.ID = (int)objSqlDataReader["EFID"];

You do this instead:

SqlInt32 emissionId = objSqlDataReader.GetSqlInt32(emissionIdOrdinal);

Then you can test for null directly:

if (emissionId.IsNull) ...

However, those methods need the column's ordinal to access value. You can setup those ordinals before your loop

int emissionIdOrdinal = rdr.GetOrdinal("EFID");

But if you really want C#'s null, you make a helper function for it instead:

public static int? ToNullable(this SqlInt32 value)
{
    return value.IsNull ? (int?) null : value.Value;
}

To access it with your nullable variable:

int? emissionId = objSqlDataReader.GetSqlInt32(emissionIdOrdinal).ToNullable();

You can now test null directly:

if (emissionId == null)

An advice, try to change your class' properties to nullable types, precluding the need for you to use another variable:

public int? ID { get; set; }
public int? Map { get; set; }
public int? TypeID { get; set; }

Final code:

data= new data();
emissiondata.ID = objSqlDataReader.GetSqlInt32(emissionIdOrdinal).ToNullable();
emissiondata.Map = objSqlDataReader.GetSqlInt32(emissionMapOrdinal).ToNullable();
于 2012-05-04T08:43:24.120 回答
1

现在无法测试它,但您可以尝试使用int?, 可空的int. 它是 的简写Nullable<Int32>。如果objSqlDataReader可以强制转换为int?,请将您的字段更改为int?并向属性设置器添加额外的逻辑,如果您必须在值为空时执行某些操作。

于 2012-05-04T08:39:03.767 回答
1

因此,为了找到可能的答案,我查看了您正在谈论的课程的文档:http: //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx 有一个 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
   }
}
于 2012-05-04T02:09:51.607 回答
1

我意识到这很旧,但是如果您在 2016 年 7 月 14 日之后需要这个答案:当 SQL 类型为 int 时,null 使用 int?作为数据类型。

诠释?是一个“可为空”的 int - 因此当 SQL 为列返回 NULL 时,属性值将接收到 null 值。

于 2016-07-14T16:59:03.327 回答
0

您可以在查询本身中执行此操作。在 Oracle 中,函数是NVL(). 看起来您正在使用 MS Sql Server,它使用:

ISNULL(YOUR_FIELD,0)

其他 RDBMS 的用法和语法在这里:http ://www.w3schools.com/sql/sql_isnull.asp

于 2012-05-04T00:51:19.650 回答