2016-06-10 576 views
2

我刚从sqlite开始,需要一些快速帮助。我有以下代码正在工作。在最后一个查询中,例如"Select * from company where id = 2"。我只想检查是否存在一排有id = 2。而已。但我无法做到这一点。回调方法对于所有查询都很常见,因此无法对其进行修改,也不希望为上次查询编写特定回调。如何检查sqlite中是否存在记录C

对于最后一个查询,我可以只获得0/1False/True吗? 我试过的是,使用,计数行,但再次回调它打印结果,但不是0/1。

static int callback(void *NotUsed, int argc, char **argv, char **azColName){ 
int i; 
for(i=0; i<argc; i++){ 
     printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); 
} 
printf("\n"); 
return 0; 
} 

int main() 
{ 
    sqlite3 *db; 
    char *zErrMsg = 0; 
    int rc; 
    char *sql; 

    /* Open database */ 
    rc = sqlite3_open("test.db", &db); 
    if(rc){ 
     fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); 
     exit(0); 
    }else{ 
     fprintf(stderr, "Opened database successfully\n"); 
    } 

    sql = "CREATE TABLE COMPANY(" \ 
     "ID INT PRIMARY KEY  NOT NULL," \ 
     "NAME   TEXT NOT NULL," \ 
     "AGE   INT  NOT NULL," \ 
     "ADDRESS  CHAR(50)," \ 
     "SALARY   REAL);"; 

    /* Execute SQL statement */ 
    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); 
    if(rc != SQLITE_OK){ 
    fprintf(stderr, "SQL error: %s\n", zErrMsg); 
     sqlite3_free(zErrMsg); 
    }else{ 
     fprintf(stdout, "Table created successfully\n"); 
    } 

     /* Create SQL statement */ 
    sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \ 
     "VALUES (1, 'Paul', 32, 'California', 20000.00); " \ 
     "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \ 
     "VALUES (2, 'Allen', 25, 'Texas', 15000.00); "  \ 
     "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \ 
     "VALUES (3, 'Teddy', 23, 'Norway', 20000.00);" \ 
     "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \ 
     "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00);"; 

    /* Execute SQL statement */ 
    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); 
    if(rc != SQLITE_OK){ 
     fprintf(stderr, "SQL error: %s\n", zErrMsg); 
     sqlite3_free(zErrMsg); 
    }else{ 
     fprintf(stdout, "Records created successfully\n"); 
    } 

    sql = "Select * from COMPANY where id = 2"; 

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); 
    if(rc != SQLITE_OK){ 
     fprintf(stderr, "SQL error: %s\n", zErrMsg); 
     sqlite3_free(zErrMsg); 
    }else{ 
     fprintf(stdout, "Records created successfully\n"); 
    } 

    sqlite3_close(db); 
    return 0; 
} 
+0

为什么不能你写这一个单独的回调函数? –

+0

但我希望tor在rc中返回1或0,表示是否存在行。或者我如何获得回调函数的返回值? – impossible

+0

回调函数的返回值指示是否发生错误,就像'sqlite3_exec'的返回值一样。 –

回答

3

你可以Exec的查询不同

sql = "Select * from COMPANY where id = 2"; 
    struct sqlite3_stmt *selectstmt; 
    int result = sqlite3_prepare_v2(db, sql, -1, &selectstmt, NULL); 
    if(result == SQLITE_OK) 
    { 
     if (sqlite3_step(selectstmt) == SQLITE_ROW) 
     { 
      // record found 
     } 
     else 
     { 
      // no record found 
     } 
    } 
    sqlite3_finalize(selectstmt); 
+0

我越来越核心愚蠢的__pthread_mutex_lock错误:断言'互斥 - > __数据.__所有者== 0'失败。我们可以使用其他类似SELECT EXISTS的东西吗? – impossible

+0

不确定我得到你:看看[在这个手册页](http://www.techonthenet.com/sqlite/exists.php) – LPs

+1

我改变了你的答案,现在它为我工作。请接受编辑。我接受了答案。感谢您的回答。 – impossible