2

次のコードがありますが、問題が発生しました。私のWhile内で、r["Varandas"]がnullでないかどうかをテストする必要があります。特定のimovel_idでは、r ["Varandas"]はnullですが、コードを通過し、nullのために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

データベースからのnull値には、独自の特殊なタイプがあります。

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

よりエレガントにするために、DataRowクラスの単純な関数または拡張機能を作成することもできます。

于 2012-04-10T12:50:25.590 に答える
1

正しいこれらの素晴らしい答えに加えて、nullとDBNullに関するいくつかのことを追加したいと思います。

  • nullはnot、任意のタイプのインスタンスです。DBnullはのインスタンスです System.DBnull

  • nullは無効な参照を表し、DbNull
    はDBに存在しない値を表します。

  • DBnullは、dbプロバイダーがテーブルに存在しない値を提供するものです。

于 2012-04-10T13:19:37.667 に答える
1

チェックする必要がありますDbNull.Value

 if (r["Varandas"] != DBNull.Value)
于 2012-04-10T12:51:48.683 に答える
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 に答える
0

これを試して:

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

ADbNull.Valueは。と同じではありませんnull

于 2012-04-10T12:51:59.873 に答える
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 に答える