Получить строковые данные, хранящиеся в целочисленном поле, из базы данных sqlite 3 с помощью C #

У меня есть база данных sqlite3 с несколькими таблицами. Одно из них имеет два поля: s_id и user_id, первое целочисленное, второе - целочисленный первичный ключ. Я могу просматривать содержимое таблицы с помощью браузера данных SQLite, и в таблице есть две строки.

Значения user_id - 1 и 2.

Однако значения s_id являются строками (например, «user1» и «user2»), и браузер данных sqlite показывает эти строки.

Я пытаюсь получить информацию с помощью System.Data.SQLite и следующего кода на C #:

using (SQLiteConnection connection = new SQLiteConnection(string.Format(@"Data Source={0};Legacy Format=True;", path)))
{
  connection.Open();
  using (SQLiteCommand command = new SQLiteCommand("SELECT * FROM users", connection))
  {
    using (SQLiteDataReader reader = command.ExecuteReader())
    {
      while (reader.Read())
      {
       string user = reader["s_id"].ToString();
      }
    }
  }
}

Я поискал в Интернете и обнаружил, что sqlite может хранить строковые данные в полях типа int. Но я не могу прочитать эти строки с помощью C #. Результат всегда «0». Даже если я разверну читатель в Watch, пока не смогу видеть объекты, значение там тоже будет 0. (Второй объект, соответствующий user_id, имеет значение, как и должно быть, 1 или 2).

Вы знаете, как это строковое значение в целочисленном поле можно получить в C #?

Спасибо.


person rayonnante    schedule 13.02.2012    source источник
comment
если вы проверяете только s_id, почему вы выбираете * для начала ... 2-й, где вы храните строку подключения ... если она в файле .config ... почему бы просто не передать это значение в свой объект подключения ...? 3-й .. оберните этот код вокруг Try Catch {}, чтобы, если у вас есть исключение ... вы также можете опубликовать его здесь ...   -  person MethodMan    schedule 14.02.2012
comment
Вы можете искать в сохраненных значениях данных .. Мне интересно, для чего вы используете строковую пользовательскую переменную .. если вы хотите ее сохранить, то вы переопределяете ее, потому что вы устанавливаете строку user = ..... в цикл while .. если вы хотите сохранить его в 2 разных переменных, вам нужно добавить вторую переменную, чтобы сохранить ее в цикле while   -  person MethodMan    schedule 14.02.2012
comment
@DJKRAZE: проблема здесь не в исключении, а в том, что C # не может преобразовать user1 (и другие строки) в int, что с радостью делает sqlite, и поэтому возвращаемое значение всегда равно 0   -  person Nuffin    schedule 14.02.2012
comment
@DJKRAZE Я разместил только код, который касается проблемы, которую мне нужно решить. Конечно, я не объявляю строкового пользователя внутри цикла в моем реальном коде, я просто не вижу смысла усложнять размещенный здесь код.   -  person rayonnante    schedule 14.02.2012
comment
@Tobias Спасибо, вы абсолютно правы. У меня нет исключений.   -  person rayonnante    schedule 14.02.2012


Ответы (1)


Перво-наперво: если вы собираетесь хранить TypeX в столбце базы данных, не объявляйте его как TypeY только потому, что вы можете. Сохранение только значений соответствующего типа (что касается sqlite) необходимо для обеспечения независимости от технологии (как вы можете видеть).

Если по какой-то странной причине вы не можете изменить саму базу данных, вам следует указать значение в своем запросе, например:

SELECT CAST(s_id AS VARCHAR(255)) AS s_id FROM users;
person Nuffin    schedule 13.02.2012
comment
Если бы это была моя база данных, я бы, конечно, не использовал целочисленное поле для хранения строки. Но это не мое. Спасибо, это решает проблему - я вообще-то не думал об использовании другой строки запроса. - person rayonnante; 14.02.2012