Почему select из базы данных sqlite показывает ошибку «Указанное приведение недопустимо». в формах Xamarin?

#c# #sqlite #xamarin.forms

#c# #sqlite #xamarin.forms

Вопрос:

Получаю единственное значение из базы данных SQLite, но получаю системную ошибку.Исключение InvalidCastException: «Указанное приведение недопустимо». Мне нужно только первое значение результатов выбора, пробовал как First(), так и ElementAtOrDefault(0), но происходит то же самое.

Ошибка обнаруживается при попытке проверки переменной IDPromoMainPage, не раньше.

В основном так я называю значение:

 private void GetPromoLocal()
        {
            try
            {
                var databasePath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "LocalDB.db3");
                var db = new SQLiteConnection(databasePath);
                IEnumerable<T_Promo> resultado = SELECT_WHERE(db);
                if (resultado.Count() > 0)
                {
                    IDPromoMainPage = Convert.ToInt32(resultado.First()); // ElementAtOrDefault(0));
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
        public static IEnumerable<T_Promo> SELECT_WHERE(SQLiteConnection db)
        {
            return db.Query<T_Promo>("SELECT IDPromo FROM T_Promo");
        }
  

Здесь также происходит та же ошибка, точно в строке «PisterosLista = resultado.Cast().ToList();»

 List<Pisteros> PisterosLista = new List<Pisteros>();

public void GetPisterosLocal()
        {
            try
            {
                var databasePath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "LocalDB.db3");
                var db = new SQLiteConnection(databasePath);
                IEnumerable<T_Pisteros> resultado = SELECT_WHERE_Pist(db);
                if (resultado.Count() > 0)
                {
                    PisterosLista = resultado.Cast<Pisteros>().ToList();
                    //Console.WriteLine("content :: "   content);
                    Console.WriteLine("Data :: "   PisterosLista);
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
        public static IEnumerable<T_Pisteros> SELECT_WHERE_Pist(SQLiteConnection db)
        {
            return db.Query<T_Pisteros>("SELECT * FROM T_Pisteros");
        }
  

Ответ №1:

если столбец IDPromo является int, то просто сделайте это

     IEnumerable<int> resultado = SELECT_WHERE(db);

    public static IEnumerable<int> SELECT_WHERE(SQLiteConnection db)
    {
        return db.Query<int>("SELECT IDPromo FROM T_Promo");
    }
  

Комментарии:

1. Не работает, даже не возвращает данные из базы данных, хотя да, поле IDPromo является целым числом

2. Первый раз было исключением, теперь я попробовал еще раз и сработало. Но я использую IDPromoMainPage = resultado. First(); присваивает значение и всегда возвращает 0, когда значение должно быть 1.

3. Я бы проверил ваши данные, чтобы убедиться, что это так. И этот запрос не гарантируется для сортировки в каком-либо определенном порядке

4. Должна существовать только 1 строка, поэтому сортировка не является проблемой. При вставке данных я использую « private SQLiteAsyncConnection _conn; _conn. InsertAsync(DatosRegistro); « и для этого запроса я использую « var DatabasePath = System.IO.Path. Объединить (Environment. GetFolderPath(Среда. Специальная папка. Personal), «LocalDB.db3»); var db = new SQLiteConnection(DatabasePath); « но я не знаю, нормально ли это

5. Является ли DatosRegistro типом T_promo?