Aşağıdaki işlev, tabloda belirli bir giriş olup olmadığını kontrol etmelidir. Giriş varsa, bir 1 döndürür. Olmazsa, 0 döndürür. Ancak, yalnızca 0 olan birSQL sorgusundan döndürülen sonuç her zaman 0
Tablo kullanılır: Database(ID int Primary Key, char(100) Place, char(100) Room)
, tümü NULL değil. Aşağıdaki sonuçlarda gösterilen tüm sorgular Veritabanındadır.
//database is already open at this point
int searchForRoom(sqlite3 *db, char *place, char *room){
int result = 1;
sqlite3_stmt *stmt;
//Create SQL statement
char * sql = sqlite3_mprintf(
"Select EXISTS(Select * From Database "
"Where Place = '%q' and Room = '%q');"
, place, room);
sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, NULL);
if (sqlite3_step(stmt) != SQLITE_ROW) {
printf("ERROR 1 reading data: %s\n", sqlite3_errmsg(db));
}
//only this line of code does not output the correct result
result = sqlite3_column_int(stmt, 0);
if (sqlite3_step(stmt) != SQLITE_DONE) {
printf("ERROR 2 reading data: %s\n", sqlite3_errmsg(db));
}
printf("%s, %s evals to %d\n", place, room, result);
sqlite3_finalize(stmt);
return result;
}
Sonuç: (bunu yaptıklarında)
place1, venue1 evals to 0
place2, venue2 evals to 0
place3, venue3 evals to 0
'sqlite3_prepare_v2'ün dönüş değerini kontrol etmelisiniz. (Ama bu aradığınız sorun değil.) –
Açık cevap, bu değerlere sahip bir satırın mevcut olmamasıdır. –
@CL. Önceden kontrol ettim. Stmt için üretilen sütunlar 1'dir ve sqlite3_column_type() ile değerlendirildiğinde gösterilen tür 1'dir (tamsayı bayrağı). Ayrıca, gösterilen girişler Veritabanı tablosundaydı. – Steve