2012-08-14 60 views
3

C++的SQLite3如何知道是否选择返回0行C++的SQLite3如何知道是否选择返回0行

我有sqlite3的select语句,我怎么知道,如果执行SQL语句后,结果是0行,找不到匹配等。

我该如何修改我的代码,以便如果找到0行,它将不会执行将结果放入向量中的部分。

我下面的代码:

sqlstatement = "SELECT * from abe_account where department="+quotesql(department)+" AND name="+quotesql(name)+";"; 


    std::vector< std::vector < std:: string > > result; 
    for(int i = 0; i < 4; i++) 
    result.push_back(std::vector<std::string>()); 


    sqlite3_prepare(db, sqlstatement.c_str() , -1, &stmt2, NULL);//preparing the statement 
    sqlite3_step(stmt2);//executing the statement 

    while(sqlite3_column_text(stmt2, 0)) 
{ 
    for(int i = 0; i < 4; i++) 
    result[i].push_back(std::string((char *)sqlite3_column_text(stmt2, i))); 
    sqlite3_step(stmt2); 
    counter ++; 
} 
+2

只需检查'sqlite3_step'的返回码...和RTFM。 – 2012-08-14 16:09:36

+0

我在找什么返回代码?我知道101成功执行 – 2012-08-14 16:13:02

+0

你指的是“SQLITE_EMPTY” – 2012-08-14 16:13:46

回答

4

sqlite3_step返回SQLITE_DONE当没有(更多)行的过程:

int stat = sqlite3_step(stmt2); 
if (stat == SQLITE_DONE) { 
    // no rows to process 
} 

记住要检查错误,以及,例如:

if (stat != SQLITE_DONE && stat != SQLITE_ROW) { 
    // there's probably a problem 
} 

您可以找到complete list of result codes in the manual

最后,您应该在使用SQLite3时使用“v2”接口。 From the manual

对于所有新程序,建议使用sqlite3_prepare_v2()和sqlite3_prepare16_v2()接口。为保持向后兼容,保留了两个较旧的接口,但不鼓励使用它们。

+0

我只想检查SQLite是否发现任何行,如果没有行,返回布尔值success = false else success = true – 2012-08-14 16:30:51

+0

@baokychen:你读过答案了吗?我写的第一句话正是你需要的。 – netcoder 2012-08-14 16:36:06

+0

谢谢。是工作。 – 2012-08-14 17:24:43

0

做一个SQL计数第一,如果返回0,你可以只是停止执行,而不需要查询的select语句。

+0

如何执行SQL计数并检查其返回值是否为0 – 2012-08-14 16:14:40

+0

查询的结果应该将int作为结果。那个int将会是count。如果(结果[0]> 0){//继续} – Walls 2012-08-14 16:18:54