以下の関数は、特定のエントリがテーブルに存在するかどうかをチェックすることを想定しています。エントリが存在する場合は1を返し、0の場合は0を返します。SQLクエリから返される結果は常に0です
使用テーブル:Database(ID int Primary Key, char(100) Place, char(100) Room)
すべてがNULLではありません。 以下の結果に示されているクエリはすべて、データベースにあります。
//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;
}
結果:
place1, venue1 evals to 0
place2, venue2 evals to 0
place3, venue3 evals to 0
'sqlite3_prepare_v2'の戻り値をチェックする必要があります。 (しかしこれはあなたが探している問題ではありません) –
明白な答えは、これらの値を持つ行が実際には存在しないということです。 –
@ CL。私はそれを事前にチェックしました。 stmtに生成される列は1で、sqlite3_column_type()で評価したときに表示される型は1(整数フラグ)でした。また、表示されたエントリは、データベーステーブルにあります。 – Steve