Как я могу проверить, открыта ли база данных SQLite на C / C

#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, во время ее открытия может произойти что-то вроде сбоя библиотеки или файл будет изменен другим приложением (это не должно быть возможно, но вы никогда не знаете …)