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

我建议反对基于对象的 getter,如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 回答