这是我的代码:
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。知道我做错了什么吗?
答案 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);
}