2016-04-07 16 views
1

以下の関数は、特定のエントリがテーブルに存在するかどうかをチェックすることを想定しています。エントリが存在する場合は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 
+0

'sqlite3_prepare_v2'の戻り値をチェックする必要があります。 (しかしこれはあなたが探している問題ではありません) –

+0

明白な答えは、これらの値を持つ行が実際には存在しないということです。 –

+0

@ CL。私はそれを事前にチェックしました。 stmtに生成される列は1で、sqlite3_column_type()で評価したときに表示される型は1(整数フラグ)でした。また、表示されたエントリは、データベーステーブルにあります。 – Steve

答えて

0

私は理由や方法がわかりませんが、実際にコンピュータを再起動しても問題は解決したようです。この関数は現在、完全にうまく機能しています。みんなの時間を無駄にして申し訳ありません。

0
 "Select EXISTS(Select * From Database " 

ザがクエリをEXISTS(彼らが行う場合)(そのような行(複数可)が存在しない場合)または1を返し0。それは0を返すので、そのような行は存在しませんでした。

+1

彼は行が存在すると言います。 – Barmar

+0

@Barmarよく、次にa)実際にはそうではない、またはb)他の何かが問い合わせをしないと思うようにする。その場合の0を返すと、そのような行が存在しないことを意味します – Magisch

関連する問題