#c #c #sqlite
#c #c #sqlite
Вопрос:
Я хочу иметь возможность проверить, открыта ли данная база данных SQLite или нет. Как я могу это сделать на C / C ? Я просмотрел API SQLite C / C и не увидел ничего очевидного для этой цели.
Комментарии:
1. Ваш вопрос нуждается в уточнении или подготовке к шквалу вопросов «Что
sqlite3_open()
вернулось?».2. Ну, вы уже звонили
sqlite3_open
, не так ли? Затем вы должны были проверить, что база данных была открыта тогда и там, в противном случае вам следует корректно обработать ошибку (и если база данных критична для функционирования вашего приложения, обработка ошибки, вероятно, заключалась бы в выходе из программы).3. @WhozCraig и Joachim Pileborg: ссылка на список рассылки из приведенного ниже ответа Николаса отвечает на мой вопрос.
Ответ №1:
Как впервые упомянул WhozCraig, вам нужно проверить возвращаемое значение sqlite3_open
. Если код возврата равен SQLITE_OK, база данных была открыта. Вероятно, вы также захотите проверить, что параметру pointer не было присвоено значение null.
Это задокументировано в интерфейсе для этой функции.
Вот сообщение из списка рассылки, в котором кто-то объясняет, почему нет функции isOpen:
Приложение не может использовать дескриптор sqlite3, если открытие не выполнено успешно, поэтому нет необходимости в функции is-opened. Это не может сработать, потому что sqlite3_open() выделяет дескриптор sqlite3, что означает, что клиент не может получить действительный дескриптор до тех пор, пока sqlite3_open() не завершится успешно. Чтобы узнать, открыта ли она, проверьте указатель на то, имеет ли он значение NULL (которым вы, конечно, должны его инициализировать, иначе оно имеет неуказанное значение).
…
После того, как вы закроете ее, снова присвоите ей значение NULL, и появится ваш флаг «открыто».
Кстати, настоятельно рекомендуется создать класс DatabaseHandle с использованием RAII. Таким образом, ваша программа обязательно вызовет sqlite3_close
с sqlite3
объектом, когда вы закончите. Из документации sqlite3_open
:
Независимо от того, возникает ли ошибка при ее открытии, ресурсы, связанные с дескриптором подключения к базе данных, должны быть освобождены путем передачи его в sqlite3_close(), когда это больше не требуется.
Комментарии:
1. Я не согласен с тем, что нет необходимости в функции isopen, во время ее открытия может произойти что-то вроде сбоя библиотеки или файл будет изменен другим приложением (это не должно быть возможно, но вы никогда не знаете …)