58

SQL Server データベースから lsit レコードを返す datareader があります。データベースに「Additional」というフィールドがあります。このフィールドは、50% の時間で空または null になります。

このフィールドがnullかどうかをチェックするコードを書こうとしています。この背後にあるロジックは次のとおりです。「追加」フィールドにテキストが含まれている場合は情報を表示し、そうでない場合はフィールドを非表示にします。

私が試してみました:

if (myReader["Additional"] != null)
{
    ltlAdditional.Text = "contains data";
}
else
{
     ltlAdditional.Text = "is null";
}

上記のコードでは、次のエラーが表示されます。

例外の詳細: System.IndexOutOfRangeException: 追加

どんな助けでも大歓迎です...


関連項目:

SqlDataReader オブジェクトの列名を確認する

4

12 に答える 12

81
if (myReader["Additional"] != DBNull.Value)
{
    ltlAdditional.Text = "contains data";
}
else
{
     ltlAdditional.Text = "is null";
}
于 2009-04-18T04:18:14.730 に答える
15
if (myReader.HasRows) //The key Word is **.HasRows**

{

    ltlAdditional.Text = "Contains data";

}

else

{   

    ltlAdditional.Text = "Is null Or Empty";

}
于 2013-08-23T08:11:18.537 に答える
11

DataReaders を 3 年以上使用していないので、記憶を確認したくて、これを見つけました。とにかく、私のようにこの投稿に遭遇し、序数の代わりに列名を使用して IsDBNull をテストするメソッドが必要で、VS 2008+ (& .NET 3.5 だと思います) を使用している場合は、拡張メソッドを作成できます。列名を渡すことができるように:

public static class DataReaderExtensions
{
    public static bool IsDBNull( this IDataReader dataReader, string columnName )
    {
        return dataReader[columnName] == DBNull.Value;
    }
}

ケビン

于 2010-10-20T20:39:12.383 に答える
9

これは正しいテスト済みのソリューションです

if (myReader.Read())
{

    ltlAdditional.Text = "Contains data";
}
else
{   
    ltlAdditional.Text = "Is null";
}
于 2011-03-08T23:54:42.137 に答える
7

OleDbDataReader.IsDBNull() も使用します

if ( myReader.IsDBNull(colNum) ) { retrievedValue = ""; }
else { retrievedValue = myReader.GetString(colNum); }
于 2011-11-27T17:58:40.417 に答える
2

まず第一にDBNull、通常の ではないをチェックしたいと思うでしょうNull

IsDBNullまたは、メソッドを見ることができます

于 2009-04-18T04:12:45.027 に答える
1

@ジョー・フィリップス

SQlDataReader.IsDBNull(int index) には列の序数が必要です。序数ではなく、列名を使用してnullをチェックする方法はありますか?

于 2010-06-25T22:27:05.947 に答える
1

与えられた提案に加えて、次のようにクエリから直接これを行うことができます-

SELECT ISNULL([Additional], -1) AS [Additional]

このようにして、フィールド値が < 0 または >= 0 であるかどうかを確認する条件を記述できます。

于 2009-04-18T04:22:15.580 に答える
1

この単純な同等の構文を試してください。

ltlAdditional.Text = (myReader["Additional"] == DBNull.Value) ? "is null" : "contains data";
于 2019-02-13T15:36:31.403 に答える
0

私もこの種の問題を経験していますが、私は DbDataReader を汎用リーダー (SQL、Oracle、OleDb など) として使用しています。DataTable を使用する場合、DataTable には次のメソッドがあります。

DataTable dt = new DataTable();
dt.Rows[0].Table.Columns.Contains("SampleColumn");

これを使用して、クエリの結果セットにその列が存在するかどうかを判断できます。DbDataReader にこの機能があるかどうかも調べています。

于 2011-10-16T03:01:33.417 に答える
-1

AMG - 申し訳ありませんが、ブロンドの瞬間を過ごしていました。最初にデータベースを設計した後、フィールド「Additional」がデータベースに追加されました。

この新しいフィールドを使用するようにすべてのコードを更新しましたが、データベース フィールドを選択する呼び出しを行っていた実際の datareader コードを更新するのを忘れていたため、「追加」を呼び出していませんでした。

于 2009-04-18T04:35:34.563 に答える