Есть БД SQLite. В ней есть таблица Studios со следующей структурой:
CREATE TABLE Studios (
id INT PRIMARY KEY
UNIQUE
DEFAULT (0)
NOT NULL,
name STRING,
filtered_name STRING,
real BOOLEAN NOT NULL
DEFAULT true,
image STRING
);
Заполняется она корректно и без ошибок из List.
Взаимодействие через linq2db. Классы-сущности созданы по шаблону, который шёл с библиотекой.
public partial class FiltersDB : LinqToDB.Data.DataConnection
{
public ITable<Studio> Studios { get { return this.GetTable<Studio>(); } }
public FiltersDB()
{
InitDataContext();
}
public FiltersDB(string configuration)
: base(configuration)
{
InitDataContext();
}
partial void InitDataContext();
}
[Table("Studios")]
public partial class Studio
{
[PrimaryKey, NotNull ] public int id { get; set; } // int
[Column, Nullable] public string name { get; set; } // string(max)
[Column, Nullable] public string filtered_name { get; set; } // string(max)
[Column, NotNull ] public bool real { get; set; } // boolean
[Column, Nullable] public string image { get; set; } // string(max)
}
public static partial class TableExtensions
{
public static Studio Find(this ITable<Studio> table, int id)
{
return table.FirstOrDefault(t =>
t.id == id);
}
}
Получить значение таблицы пытаюсь следующим методом:
public static List<ShikiApiLib.Studio> GetStudiosFromDB()
{
using (var db = new FiltersDB("Filters"))
{
var response = new List<ShikiApiLib.Studio>();
var table = db.Studios.Select(x => x); //(!)для дебага
var table1 = table.ToList(); //(!)для дебага
foreach (var studio in db.Studios.Select(x => x).ToList())
{
response.Add(new ShikiApiLib.Studio()
{
id = studio.id,
name = studio.name,
filtered_name = studio.filtered_name,
real = studio.real,
image = studio.image
});
}
return response;
}
}
на строчке с table1 выскакивает ошибка System.InvalidCastException: "Заданное приведение является недопустимым."
Причём в table отображается следующее:
UPD: Если удалить из таблицы все строки, у которых в столбце image стоит null, то ошибка не появляется =/
Но это не решение проблемы, так как эти строки мне нужны =/
UPD2: С этим столбцом мистика какая-то. Ибо замена null на пустую строку или текст вроде "no_image" перед занесением в таблицу БД не помогает. а удаление этих строк, снова избавляет от ошибки =/
Строка [t1].[real] as [real1] тут ни при чем - это просто назначение псевдонима.
Настоящая проблема - в том, что в БД находятся данные, типы которых не соответствуют указанным. SQLite - нетипизированная СУБД, и типы колонок в ее таблицах - не более чем подсказка (ну и еще они задают порядок колонок).
Проверьте, не лежит ли в вашей базе в колонках id или real вместо числа или булева типа маскирующаяся под них строка.
Также возможно, что тип id на самом деле не int, а long. Проверьте этот вариант тоже. Кстати, в SQLite для первичного ключа использовать long предпочтительнее, это немного ускоряет доступ и уменьшает занимаемое место.
Еще один возможный вариант - в real на самом деле лежит число, а не булев тип. Попробуйте int или long.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости