2013-03-03 2 views
2

Вот мой код:Почему System.Data.SQLite всегда возвращает False из запросов в столбцах bool?

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

     }   

Проблемы я имею с последним, если заявлением. «in_lineup» - это логический столбец, и некоторые записи имеют значение true, но оператор if никогда не вводится, а reader ["in_lineup"] всегда является ложным. Любая идея, что я делаю неправильно?

+0

Изменил образец кода, чтобы сделать мою проблему более ясной. – Ben313

+2

- это ваш teanmID законное значение, и ваш запрос возвращает любые значения? установить точку останова и посмотреть результаты. –

+2

Хорошо, тогда я не уверен. Извините, мне пришлось бы пройти через код. Поместите в var inLineup = reader ["in_lineup"] на строку раньше и посмотрите, что там происходит. Удачи. –

ответ

1

Похоже, что SQLite возвращает 0 или 1 для логического значения. C# (в отличие от C++) не конвертирует из целого числа в логическое. Это может быть, таким образом, лучше переписать тест:

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

в

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

Я рекомендовал бы против геттер на основе объектов, как в Reader["colName"]. Я всегда использовал сильно типизированных геттеры, зная индекс столбца, как в

Reader.GetBoolean(3) 

Это имеет дополнительное преимущество обнаружения ошибок в сродства макета таблицы/типа.

EDIT: В качестве дополнительной заметки мы добавили методы расширения для работы с возвратом 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); 
    } 
+0

Полезно знать это Возможно. – Ben313

Смежные вопросы