На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела C/C++: Базы данных
Модераторы: B.V.
  
    > Работа с SQLite
      Здравствуйте!
      Изучая работу с SQLite с помошью С++ не понял, как определить, что не удалось открыть базу данных. В простой программе:
      ExpandedWrap disabled
        #include <iostream>
        #include <string>
        #include "sqlite3.h"
         
        using namespace std;
         
        namespace fs = filesystem;
         
        void DisplayMessage(const string& sMes)
        {
          cout << sMes << endl;
          cin.get();
          exit(EXIT_FAILURE);
        }
         
        int main()
        {
          sqlite3* db;
          //string sqlName = "SQLiteTest.db";
          string sqlName = "Test.db";
          int rs = sqlite3_open(sqlName.c_str(), &db);
          if(rs != SQLITE_OK)
            DisplayMessage("The database could not be opened!");
          sqlite3_close(db);
          cin.get();
          return 0;
        }
      У меня база SQLiteTest.db, но если имя базы данных указано неправильно, то sqlite3_open создает новую пустую базу данных. Т.е. получается, что дальнейшая работа с базой данной (добавление, удаление и чтение из базы данных) бессмысленна, поскольку нужная структура базы данных отсуствует. Правильно ли я понимаю:
      1. При открытии базы данных нужно проверить наличие файла с нужным именем, а не анализировать код возврата функции?
      2. Проверять значение кода возврата нужно при работе с уже открытой базой?
        Попробуй использовать другую функцию - sqlite3_open_v2, поиграйся с флагами. По идее этот вариант тебе поможет выявить ошибки: файл БД отсутствует или файл БД есть, но невалидного формата. Но если функция вернет ок - тебе останется самостоятельно проверять наличие в файле БД правильных таблиц (нужного тебе формата). Ну я так вижу решение этого вопроса.
          Спасибо, получмлось. Возник еще вопрос. В процессе экспериментов по добавлению (удалению) записей в базу с автоинкрeментным индексом последний индекс запоминается и после удаления всех записей и последующем добавлении индекс не становится индексом с номером 1, а становится увеличенным на 1 последним запомненным индексом. Можно ли после удаления всех записей из базы как-то скинуть индекс в 0, чтобы при добавлении индексы записей начинались с 1?
          Сообщение отредактировано: tumanovalex -
            Цитата tumanovalex @
            Спасибо, получмлось. Возник еще вопрос. В процессе экспериментов по добавлению (удалению) записей в базу с автоинкрeментным индексом последний индекс запоминается и после удаления всех записей и последующем добавлении индекс не становится индексом с номером 1, а становится увеличенным на 1 последним запомненным индексом. Можно ли после удаления всех записей из базы как-то скинуть индекс в 0, чтобы при добавлении индексы записей начинались с 1?

            Попробуй после удаления всех записей выполнить запрос:

            ExpandedWrap disabled
              UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = 'имя_таблицы';
              Спасибо, помогло. А где Вы об этом прочитали? Я найти не смог. Подскажите, пожалуйста, чтобы я смог в будущем найти нужную информацию.
                Цитата tumanovalex @
                Спасибо, помогло. А где Вы об этом прочитали? Я найти не смог. Подскажите, пожалуйста, чтобы я смог в будущем найти нужную информацию.

                Ну документацию нужно читать внимательнее. Что касается автоинкремента - инфа есть в разделе "2.6.3. The sqlite_sequence table". Самого запроса там нет, но есть структура таблицы. Как обновить инфу - догадаться не сложно.
                  Спасибо, понял.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0234 ]   [ 16 queries used ]   [ Generated: 21.02.24, 08:17 GMT ]