追加 - ビット フラグ c#
SqlDataReaderでビット値を取得してboolに変換する方法 (3)
IsConfirmed
列にnull値がない場合は、コードが機能するはずIsConfirmed
。
通常、これらのビット列はNOT NULLプロパティまたはデフォルト値0を持ちますが、null値を持つ可能性があります。この場合、エラーが発生した場合、コードは失敗します。
この方法で修正することができます(ただし、このチェックでは列の位置が必要です)
int colPos = sqlDataReader.GetOrdinal("IsConfirmed");
bool isConfirmed = sqlDataReader.IsDBNull(colPos) ? false : sqlDataReader.GetBoolean(colPos));
列の位置を見つけるための呼び出しが本当に嫌な場合は、呼び出しを非表示にする拡張メソッドを作成することができます
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;
私は簡単なクエリを使用してデータベースからユーザー情報を取得しています。
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列のインデックスを知らず、それを知りたくないので、これは私のケースでは機能しません。 列名を使用したいと思います。
これを試してください: Convert.ToBoolean(reader["Columnname"])
またはConvert.ToBoolean(reader["Columnname"])
使って、たとえば: Convert.ToBoolean((3))
使用できる列名を使用する場合は
bool isConfirmed = sqlDataReader.GetBoolean(sqlDataReader.GetOrdinal("IsConfirmed"));