为什么System.Data.SQLite总是从bool列上的查询返回False?

时间:2013-03-03 23:23:29

标签: c# sqlite system.data.sqlite

这是我的代码:

        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。知道我做错了什么吗?

2 个答案:

答案 0 :(得分:1)

对于布尔值,SQLite似乎返回0或1。 C#(与C ++不同)不会从整数转换为布尔值。 因此,重写测试可能会更好:

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

作为

if((int)reader["in_lineup"] == 1)

答案 1 :(得分:1)

我建议在Reader["colName"]中使用基于对象的getter。 我总是使用强类型的getter知道列索引,如

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);
    }