2016-12-30 40 views
1

我想测试SQL是否返回结果。如果没有结果,我想发送一条消息。问题是,当我做这个测试时,当我想要执行我的过程时(当发现行时),第一行被跳过。我想知道如何测试sqlite中的compiledStatement是否返回一个答案或不错过第一行

NSString *selectSQL = [NSString stringWithFormat:@"SELECT z_pk, zpostcode, zname, zfirstname, zstreetname, zstreetnumber, zcity FROM ZTAB_PARTICULIER where UPPER(ZNAME) like \'\%%%@%%\' and ZPOSTCODE like \'\%%%@%%\'", [self.name.text uppercaseString], self.postcode.text]; 

const char *query_stmt = [selectSQL UTF8String]; 

sqlite3_stmt *compiledStatement; 


//Compilation de la requete et verification du succes 
if (sqlite3_prepare_v2(database, query_stmt, -1, &compiledStatement, NULL) == SQLITE_OK) 
{ 
    NSLog(@"Prepare Database OK"); 

    int stat = sqlite3_step(compiledStatement); 
    if (stat == SQLITE_DONE) 
    { 
     NSLog(@"NO ROWS!"); 
    } 
    while (sqlite3_step(compiledStatement) == SQLITE_ROW) 
    { 
    ... 

在此先感谢

+2

不相关,但不要使用'stringWithFormat'将文本值插入到SQL语句中。例如。尝试搜索“Joe's Bar”的代码,并且“sqlite3_prepare_v2”将失败。相反,在SQL (不包括引号)中使用'?'占位符,并使用['sqlite3_bind_text'](http://sqlite.org/c3ref/bind_blob.html)。或者使用像[FMDB](https://github.com/ccgus/fmdb)这样的库来简化绑定过程。 – Rob

+0

谢谢你的提示,我打算使用它。 :D – Claudio

回答

2

删除第一次调用sqlite3_step。只需要在while循环中增加一个计数器,并在while循环之后,查看该计数器是否为零。

例如,你可以这样做:

if (sqlite3_prepare_v2(database, query_stmt, -1, &compiledStatement, NULL) == SQLITE_OK) { 
    NSLog(@"Prepare Database OK"); 

    // int stat = sqlite3_step(compiledStatement); 
    // if (stat == SQLITE_DONE) 
    // { 
    //  NSLog(@"NO ROWS!"); 
    // } 

    NSInteger rows = 0; 
    int rc; 

    while ((rc = sqlite3_step(compiledStatement)) == SQLITE_ROW) { 
     rows++; 

     ... 
    } 

    if (rc != SQLITE_DONE) { 
     NSLog(@"Some error %s (%ld)", sqlite3_errmsg(), (long)rc); 
    } 

    if (rows == 0) { 
     NSLog(@"NO ROWS!"); 
    } 

    ... 

类似的东西检查不仅是“无行”的局面,同时也检查错误。

+0

噢好吧,我要去使用它。我相信有一种方法与“SQLITE_DONE”。谢谢。 – Claudio

相关问题