我有以下代码,但我遇到了问题。在我的While中,必须测试r [“Varandas”]是否为空。在一个特定的imovel_id中,r [“Varandas”]为空,但仍然通过我的代码,然后我得到一个异常错误因为无法解析为r [“Varandas”]因为是null,但为什么他通过通过我在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";
}
}
}
答案 0 :(得分:7)
null 值有自己的特殊类型:
if (r["Varandas"] != DBNull.Value && r["Varandas"] != null)
为了使它更优雅,你可以为DataRow类编写一些简单的函数甚至扩展。
答案 1 :(得分:1)
需要查看DbNull.Value
if (r["Varandas"] != DBNull.Value)
答案 2 :(得分:1)
除了这些正确的精彩答案之外,我想补充一些关于null和DBNull的事情。
null是not
任何类型的实例。 DBnull是。的实例
System.DBnull
。
null表示无效引用,其中DbNull表示
DB中不存在的值。
DBnull是数据库提供程序在表中提供的不存在的值。
答案 3 :(得分:0)
它的值可能为DbNull.Value
答案 4 :(得分:0)
尝试将其与DBNull.Value
进行比较http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx
答案 5 :(得分:0)
试试这个:
while(r.Read())
{
object o = r["Varandas"];
if ((o != null) && (o != DbNull.Value))
{
// rest of your code
}
}
DbNull.Value
与null
不同。
答案 6 :(得分: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";
}
}
}
答案 7 :(得分: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);
}
我已为所有数据类型制作了这些。