2

これが私のコードです:

        string sql = "SELECT * FROM rosters WHERE team_id = " + teamID;
        SQLiteCommand command = new SQLiteCommand(sql, db.GetConnection());
        SQLiteDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {

            if ((bool)reader["in_lineup"])
            {
                lineup.Add(player);
            }

        }           

私が抱えている問題は、最後の if ステートメントにあります。「in_lineup」はブール列で、一部のレコードでは true に設定されていますが、if ステートメントは入力されず、reader["in_lineup"] は常に false です。私が間違っていることは何ですか?

4

2 に答える 2

1

のようなオブジェクトベースのゲッターに対してお勧めしReader["colName"]ます。私は常に、次のように列インデックスを知っている強く型付けされたゲッターを使用してきました

Reader.GetBoolean(3)

これには、テーブル レイアウト/タイプ アフィニティのエラーを検出するという追加の利点があります。

編集: 補足として、DBNull リターンを処理する拡張メソッドを追加しました。例えば:

/// <summary>
    /// Returns a string from a column
    /// This extension exists because SQLite doesn't recognize null as a valid string but C# does
    /// </summary>
    /// <param name="Source"></param>
    /// <param name="Column"></param>
    /// <returns></returns>
    public static String xGetString(this System.Data.Common.DbDataReader Source, Int32 Column)
    {
        if (Source.IsDBNull(Column))
            return null;

        if (Source.GetFieldType(Column) != typeof(String))
            throw new Core.DatabaseException(
                String.Format("Column `{0}` ({1}) is not of type String. Type is {2}.",
                Source.GetName(Column), Column, Source.GetFieldType(Column).Name));

        return Source.GetString(Column);
    }
于 2013-03-27T21:39:59.793 に答える
1

SQLite はブール値に対して 0 または 1 を返すようです。C# は (C++ とは異なり) 整数からブール値に変換しません。したがって、テストを書き直したほうがよい場合があります。

if ((bool)reader["in_lineup"])

なので

if((int)reader["in_lineup"] == 1)
于 2013-03-04T06:36:50.330 に答える