単純なクエリを使用して、データベースからユーザー情報を取得しています。
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列のインデックスがわからず、知りたくないため、これは私のケースでは機能しません。列名を使用したい。
データリーダーのインデクサープロパティから返される値はオブジェクト型ですが、格納されているデータ型にキャストできます。
これを試して:
bool isConfirmed = (bool)sqlDataReader["IsConfirmed"]
使用できる列名を使用する場合
bool isConfirmed = sqlDataReader.GetBoolean(sqlDataReader.GetOrdinal("IsConfirmed"));
列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;
これを試してください:Convert.ToBoolean(reader["Columnname"])
またはOrdinalの例:Convert.ToBoolean((3))