Sqlite3: невозможно закрыть из-за незавершенных операторов

У меня есть два подключения к sqlite, и я выполняю их, как показано ниже (CMyDatabase является производным классом sqlite3):

CMyDatabase* dbConnection1 = new CMyDatabase;
dbConnection1->OpenDataBase(CQCommon::GetModulePath() + L"test.db");

CMyDatabase* dbConnection2 = new CMyDatabase;
dbConnection2->OpenDataBase(CQCommon::GetModulePath() + L"test.db");

dbConnection2->BeginTrans();
CString updateStr("update ImageAlbumEntry set ImageID = 2 where ID = 1;");
dbConnection2->ExecNoQuery(updateStr);
CString queryStr("select ImageID from ImageAlbumEntry where ID = 1;");
CppSQLite3Query queryResult;
dbConnection2->ExecQuery(queryStr, queryResult);
cout<<queryResult.getIntField(0)<<endl;
dbConnection2->EndTrans(TRUE);

dbConnection2->CloseDataBase();
dbConnection1->CloseDataBase();

Теперь, когда я вызываю dbConnection1-> CloseDataBase (). Я столкнулся с ошибкой: «Невозможно закрыть из-за незавершенных заявлений». Может ли кто-нибудь объяснить причину и способ решения проблемы? Спасибо!

Пожалуйста, переформатируйте свой вопрос с помощью ваших команд в блоке кода, чтобы улучшить читаемость.

Noah 30.01.2009 09:29
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
3
1
13 491
1

Ответы 1

Зависит от того, какую оболочку вы используете. Я предполагаю, что вы используете такой же, как cppSQLite3

Если это правда, то вам нужно выполнить команду CppSQLite3Query :: finalize, чтобы сообщить sqlite3, что вы закончили свой запрос.

Из документации sqlite3 здесь

sqlite3_finalize ()
Эта процедура уничтожает подготовленный оператор, созданный предыдущим вызовом sqlite3_prepare (). Каждый подготовленный оператор должен быть уничтожен с помощью вызова этой подпрограммы, чтобы избежать утечки памяти.

Другие вопросы по теме