web-dev-qa-db-ja.com

SqlDataReaderでビット値を取得してboolに変換する方法は?

単純なクエリを使用して、データベースからユーザー情報を取得しています。

select * from dbo.[User] u where u.Email = @email

次に、IsConfirmedという名前の列(データベースではビット型の列として表されます)の値を取得し、boolに変換しようとします。

bool isConfirmed = int.Parse(sqlDataReader["IsConfirmed"].ToString()) == 1;

次に、「入力文字列が正しい形式ではありませんでした」というFormatExceptionエラーが表示されます。

私はこのコードを提供する答えと同様の質問を見ました:

bool isConfirmed = sqlDataReader.GetBoolean(0);

しかし、IsConfirmed列のインデックスがわからず、知りたくないため、これは私のケースでは機能しません。列名を使用したい。

18
Yulian

データリーダーのインデクサープロパティから返される値はオブジェクト型ですが、格納されているデータ型にキャストできます。

これを試して:

bool isConfirmed = (bool)sqlDataReader["IsConfirmed"]
20
Slade

使用できる列名を使用する場合

bool isConfirmed = sqlDataReader.GetBoolean(sqlDataReader.GetOrdinal("IsConfirmed"));
11
dotnetom

IsConfirmedにnull値がなければ、コードは機能するはずです。
通常、これらのビット列にはNOT NULLプロパティやデフォルト値0がありますが、たまたまNULL値が含まれている可能性があり、この場合、コードは前述のエラーで失敗します。

この方法で修正できます(ただし、このチェックには列の位置が必要です)

int colPos = sqlDataReader.GetOrdinal("IsConfirmed");
bool isConfirmed = sqlDataReader.IsDBNull(colPos) ? false : sqlDataReader.GetBoolean(colPos));

列の位置を見つけるための呼び出しが本当に嫌いな場合は、hideを呼び出すことができる拡張メソッドを作成できます

public static class ReaderExtensions
{
    public static bool IsDBNull(this SqlDataReader reader, string colName)
    {
        int colPos = reader.GetOrdinal(colName);
         return reader.IsDBNull(colPos);
    }
}

そしてそれを呼び出す

bool isConfirmed = int.Parse((sqlDataReader.IsDBNull("IsConfirmed") 
                    ? "0" : sqlDataReader["IsConfirmed"].ToString())) == 1;
4
Steve

これを試してください:Convert.ToBoolean(reader["Columnname"])またはOrdinalの例:Convert.ToBoolean((3))

0