2

我有以下代码,但我遇到了问题。在我的 While 中,必须测试 r["Varandas"] 是否不为空。在特定的 imovel_id 中,r["Varandas"] 为空,但仍然通过我的代码,然后我收到异常错误,因为无法解析为 int r["Varandas"] 因为为空,但为什么他通过通过我的 While 循环中的第一个 IF ?

        string s = "SELECT * "
            + "FROM San_Imovel_Caracteristica "
            + "WHERE Imovel_Id = " + imovel_id + " ";

        SqlConnection c = new SqlConnection(conn.Con);
        SqlCommand cmd = new SqlCommand(s, c);
        c.Open();
        SqlDataReader r = cmd.ExecuteReader();

        while (r.Read())
        {
            if (r["Varandas"] != null)
            {
                if (Convert.ToInt32(r["Varandas"].ToString()) > 0)
                {
                    XmlElement itemImovel1 = doc.CreateElement("itemImovel");
                    caracteristicasImovel.AppendChild(itemImovel1);
                    itemImovel1.InnerText = "varanda";
                }
            }
         }
4

8 回答 8

7

来自数据库的空值有它自己的特殊类型:

if (r["Varandas"] != DBNull.Value && r["Varandas"] != null)

为了使它更优雅,您可以为 DataRow 类编写一些简单的函数甚至扩展。

于 2012-04-10T12:50:25.590 回答
1

需要检查DbNull.Value

 if (r["Varandas"] != DBNull.Value)
于 2012-04-10T12:51:48.683 回答
1

除了这些正确的精彩答案之外,我还想补充一些关于 null 和 DBNull 的内容。

  • null 是not任何类型的实例。DBnull 是 的实例 System.DBnull

  • null 表示无效引用,其中 DbNull 表示
    DB 中不存在的值。

  • DBnull 是 db 提供程序为表中不存在的值提供的。

于 2012-04-10T13:19:37.667 回答
0

试试这个:

string s = "SELECT * "
        + "FROM San_Imovel_Caracteristica "
        + "WHERE Imovel_Id = " + imovel_id + " ";

    SqlConnection c = new SqlConnection(conn.Con);
    SqlCommand cmd = new SqlCommand(s, c);
    c.Open();
    SqlDataReader r = cmd.ExecuteReader();

    int outint;

    while (r.Read())
    {
        Object o = r["Varandas"];
        if (o != null && o != DbNull.Value)
        {
            if (int.TryParse(o.ToString(), out outint))
            {
                XmlElement itemImovel1 = doc.CreateElement("itemImovel");
                caracteristicasImovel.AppendChild(itemImovel1);
                itemImovel1.InnerText = "varanda";
            }
        }
    }
于 2012-04-10T12:55:38.480 回答
0

这样的事情应该可以解决问题:

/// <summary>
/// This function tries to cast the input object to a integer or returns the default value
/// </summary>
/// <param name="objInput">object to check</param>
/// <param name="intDefault">optional default value</param>
/// <returns>Object cast to string or default value</returns>
public static int ValueOrDefaultForInteger(object objInput, int intDefault = 0)
{ 
 if (objInput == DBNull.Value | objInput == null)
    return intDefault;
 return Convert.ToInt32(objInput);
}

我已经为所有数据类型制作了这些。

于 2012-04-10T12:56:51.160 回答
0

尝试这个:

while(r.Read())
{
  object o = r["Varandas"];
  if ((o != null) && (o != DbNull.Value))
  {
    // rest of your code
  }
}

ADbNull.Value与 a 不同null

于 2012-04-10T12:51:59.873 回答
0

它的价值可能为 DbNull.Value

于 2012-04-10T12:50:32.987 回答
0

尝试将其与 DBNull.Value 进行比较

http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx

于 2012-04-10T12:51:20.950 回答