2016-12-01 1 views
0

Auch die Tabelle sqlite_master für DB und registrierte Funktionen scheint noch verfügbar zu sein. Ist dies nur ein Fall des Zugriffs auf den Speicher, der noch nicht überschrieben wurde, oder schreibt der Prepare Details in den stmt, was bedeutet, dass er später die sqlite3 * Struktur nicht benötigt.SQLite DB geschlossen nach Vorbereitung, aber stmt funktioniert noch?

#include "sqlite3.h" 
//--------------------------------------------------------------------------- 
void Odd(sqlite3_context *ctx,int nargs,sqlite3_value **values) 
{ 
    sqlite3_result_int(ctx,sqlite3_value_int(values[0])%2); 
} 
//--------------------------------------------------------------------------- 
int _tmain(int argc,_TCHAR* argv[]) 
{ 
    sqlite3 *DB; 
    if (sqlite3_open_v2("c:/SQLiteData/MyDB.db",&DB,SQLITE_OPEN_READWRITE,NULL)!=SQLITE_OK) 
     return 1; 
    sqlite3_create_function_v2(DB,"Odd",-1,SQLITE_UTF16 | SQLITE_DETERMINISTIC,NULL, 
    &Odd,NULL,NULL,NULL); 
    sqlite3_stmt *stmt; 
    if (sqlite3_prepare16_v2(DB,L"select * from sqlite_master where Odd(rowid)", 
    -1,&stmt,NULL)!=SQLITE_OK) return 2; 
    if (sqlite3_close_v2(DB)!=SQLITE_OK) return 3; 
    int Count=0; 
    while (sqlite3_step(stmt)==SQLITE_ROW) Count++; 
    return 0; 
} 

Antwort

0

The documentation sagt:

Wenn die Datenbankverbindung mit entfinalisiert vorbereiteten Anweisungen verbunden ist ... dann sqlite3_close() wird die Datenbankverbindung geöffnet und das Rück SQLITE_BUSY verlassen. Wenn sqlite3_close_v2() mit nichtfinalisierten vorbereiteten Anweisungen ... aufgerufen wird, wird die Datenbankverbindung zu einem unbrauchbaren "Zombie", der automatisch freigegeben wird, wenn die letzte vorbereitete Anweisung abgeschlossen ist oder der letzte sqlite3_backup beendet ist. Die Schnittstelle sqlite3_close_v2() ist für die Verwendung mit Hostsprachen gedacht, die als Garbage Collected erfasst werden und bei denen die Reihenfolge, in der Destruktoren aufgerufen werden, willkürlich ist.

Aber Sie verwenden eine solche Sprache nicht. Sie sollten nicht versuchen, auf den Zombie zuzugreifen; Ihre Anwendung

sollten alle vorbereiteten Anweisungen abschließen, die dem Objekt sqlite3 zugeordnet sind, bevor Sie versuchen, das Objekt zu schließen.

+0

Danke CL. Ich hatte das nicht gelesen und wurde von der Tatsache geworfen, dass SQLITE_OK zurückgegeben wurde. – NoComprende

Verwandte Themen