2008-12-17 5 views
3

J'ai deux connexions SQLite et exécuter comme ci-dessous (CMyDatabase est une classe dérivée de sqlite3):sqlite3: Impossible de fermer en raison de déclarations non finalisés

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(); 

Maintenant, quand j'invoquez dbConnection1-> CloseDatabase(). J'ai rencontré l'erreur "Incapable de fermer en raison d'instructions non finalisées". Quelqu'un peut-il expliquer la raison et résoudre la méthode du problème? Je vous remercie!

+0

Veuillez reformater votre question avec vos commandes dans un bloc de code pour améliorer la lisibilité – Noah

Répondre

6

Dépend de l'emballage que vous utilisez. Je suppose que vous utilisez un semblable à cppSQLite3

Si cela est vrai, alors vous devez publier un CppSQLite3Query :: finaliser commande pour dire que sqlite3 vous avez terminé votre requête.

De la documentation sqlite3 here

sqlite3_finalize()
Cette routine détruit une déclaration préparée créée par un appel avant sqlite3_prepare(). Chaque instruction préparée doit être détruite à l'aide d'un appel à cette routine afin d'éviter les fuites de mémoire.

Questions connexes