web-dev-qa-db-ja.com

DBからブール値を読み取りますか?

C#では、SqlDataReaderを使用して、DBからブール値を読み取る方法はありますか?

while (reader.Read())
{
    destPath = reader["destination_path"].ToString();
    destFile = reader["destination_file"].ToString();
    createDir = reader["create_directory"].ToString();
    deleteExisting = Convert.ToBoolean(reader["delete_existing"]);
    skipIFolderDate = reader["skipifolderdate"].ToString();
    useTempFile = reader["useTempFile"].ToString();
    password = reader["password"].ToString();
}

上記のコードでは、delete_existingはDB内で常に1または0です。 Convert.ToBoolean()が有効な入力として1または0を受け入れないことをMSDNで読みました。 trueまたはfalseのみを受け入れます。 DB値をboolに変換する別の方法はありますか?または、SqlDataReaderの外部でこれを行う必要がありますか?

また、DB値を変更することはできませんので、「DB値を1と0からtrueとfalseに変更してください」と答えないでください。

ありがとう!

15
Mr. Ant

delete_existingの型がsqlserverの「ビット」型である場合、次のことができます。

var i = reader.GetOrdinal("delete_existing"); // Get the field position
deleteExisting = reader.GetBoolean(i);

または(ただし、delete_existingDBNullになる可能性がある場合はクラッシュします)

deleteExisting = (bool)reader["delete_existing"];

以上の場合、以下はDBNull証明であり、列がDBNullの場合はfalseを返します。

deleteExisting = reader["delete_existing"] as bool? ?? false;

それ以外の場合、データベースタイプがintの場合:

deleteExisting = (reader["delete_existing"] as int? == 1) ? true : false;

またはそれがvarcharの場合

deleteExisting = (reader["delete_existing"] as string == "1") ? true : false;
37
Larry

キャストは機能します:myVar =(bool)dataReader ["myColumn"];

3
donkz

SELECTでCASEを使用していて、GetBooleanを使用する場合は、CASTを使用して列をビットに変更してから読み取ります。

例:

SELECT CAST((CASE WHEN [Condition] THEN 1 ELSE 0 END) as bit) FROM Table_Name

その後、あなたは使用することができます

reader.GetBoolean(0)
1
sree

これはどう?

deleteExisting = (reader["delete_existing"] as int?) == 1;

ブール値は、おそらく何かを変換するのに最も簡単なタイプです。これが「Y」、「N」バージョンです。

deleteExisting = string.Equals(reader["delete_existing"] as string, "Y", StringComparision.OrdinalIgnoreCase);
1