Start Debugging
2023-09-01 Обновлено 2023-11-05 sqlite Edit on GitHub

SQLite-net No parameterless constructor defined for this object в ExecuteQuery

Как исправить ошибку 'no parameterless constructor defined' в SQLite-net при использовании ExecuteQuery с примитивными типами вроде string или int.

Скорее всего, вы пытаетесь получить один столбец из таблицы базы данных, передавая что-то вроде SELECT <column_name> FROM <table_name> в ExecuteQuery<string> или ExecuteQuery<int>.

Проблема в том, что ExecuteQuery<string> ожидает тип с конструктором без параметров, а string под это требование не подходит.

Есть два возможных решения:

Решение 1: используйте тип таблицы

Оставьте SQL-запрос как есть — выбираете один столбец, но при вызове ExecuteQuery обязательно укажите тип, ассоциированный с вашей таблицей. О производительности сильно беспокоиться не стоит: будет извлечён и заполнен в объектах только этот конкретный столбец; остальные свойства будут проигнорированы.

После этого можно с помощью LINQ выбрать ваш string.

cmd.ExecuteQuery<MyTableType>().Select(t => t.MyColumnName).ToArray();

Решение 2: используйте отдельный DTO под запрос

Если не хочется использовать тип таблицы, всегда можно определить отдельное DTO под этот запрос и использовать его. Помните: у него должен быть публичный конструктор без параметров.

public class MyQueryDto
{
    public string MyColumnName { get; set; }
}

Затем передайте его в метод ExecuteQuery и при необходимости выберите столбец в массив строк уже после.

cmd.ExecuteQuery<MyQueryDto>().Select(t => t.MyColumnName).ToArray();

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Назад