Как корректно получить данные из SqliteDataReader?

Ссылка на документацию SqliteDataReader
https://learn.microsoft.com/en-us/dotnet/api/micro...

Работаю с БД SQLite. Там 4 типа данных integer, text, real, blob.
Нужно получить данные хотя бы из полей integer, text.
Вот рабочий код. Данные получаю, но по моему такие преобразования (Convert ToString) не корректны.
Есть же методы у SqliteDataReader?
string sqlCommandText;
SqliteDataReader sqliteDataReader;

sqlCommandText = "SELECT * FROM table WHERE id='"+Id+"'"; // Смущает +Id+, так вроде не пишут, нужно @?
sqliteDataReader = SQLiteData.GetSqliteDataReader(pathToBase, sqlCommandText);

// Тут много данных - 2 переменных ниже, для примера.
while (sqliteDataReader.Read())
{
int myint = Convert.ToInt32(sqliteDataReader["id"]); // А есть метод у SqliteDataReader? GetInt64(Int32)?
string mystring = sqliteDataReader["answer"].ToString(); // GetString(Int32)?
}

Как корректно получить данные из SqliteDataReader? Можно привести пример кода?
  • Вопрос задан
  • 202 просмотра
Пригласить эксперта
Ответы на вопрос 1
vabka
@vabka Куратор тега C#
Токсичный шарпист

sqlCommandText = "SELECT * FROM table WHERE id='"+Id+"'"; // Смущает +Id+, так вроде не пишут, нужно @?


Правильно, что смущает.
1. SELECT * лучше не писать. Лучше писать конкретные поля, которые тебе нужны
2. Вместо конкатенации следует использовать параметризованные запросы. При использовании EF Core и Dapper их можно делать через интерполяцию, но тут придётся ручками добавлять параметры в свойство Parameters

using var command = new SqliteCommand
{
    CommandText = "SELECT id, txt, floating_point, raw_bytes FROM table WHERE id=$id",
    Parameters = {
      new SqliteParameter("$id", 123)
    },
    Connection = new SqliteConnection() // Тут стоит подставить настоящий connection
};

using var reader = await command.ExecuteReaderAsync(); // Вместо async-await можно использовать и синхронные методы
var data = new List<(int id, string text, double floatingPoint, byte[] blob>(); // Вместо кортежа можно нормальный тип
while (await reader.ReadAsync())
{
  var id = await reader.GetFieldValueAsync<int>(0); //integer
  var text = await reader.GetFieldValueAsync<string>(1); //text
  var value = await reader.GetFieldValueAsync<double>(2); // real
  var blob = await reader.GetFieldValueAsync<byte[]>(3); // blob
  data.Add((id, text, value, blob));
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы