This works - ... just after database is opened, compile the SQL statement if (sqlite3_prepare(db, dbst_cart_wt_in_sel, -1, &dbcmp_cart_wt_in_sel, &dbend_cart_wt_in_sel) != SQLITE_OK) { errormet("908", (char *)sqlite3_errmsg(db)); /*Fatal DB Error.*/ return(TRUE); } /*if*/
... called to access SELECT, after a bind. /*Now we execute the SQL statement. Handle the possibility that sqlite is busy, but drop out after a number of attempts.*/ busy_count = 0; found = 0; while (TRUE) { rc = sqlite3_step(dbcmp_cart_wt_in_sel); switch (rc) { case SQLITE_BUSY: /*We must try again, but not forever.*/ if (busy_count++ > MAX_BUSY_TRIES) { sqlite3_reset(dbcmp_cart_wt_in_sel); errormet("908", "DB locked busy"); return(-1); } /*if*/ #if WIN32 sleep(0); /*Relinquish time slice for gentler polling.*/ #else yield(); /*Drop time slice*/ #endif break; case SQLITE_DONE: /*Success on multi row read.*/ sqlite3_reset(dbcmp_cart_wt_in_sel); /*Ready for next step.*/ return(found); case SQLITE_ROW: /*A row has been found.*/ .... extract your row data found++; break; case SQLITE_ERROR: /*Run time error, discard the VM.*/ sqlite3_reset(dbcmp_cart_wt_in_sel); sprintf(strg, "SQL SELECT error: %s\n", sqlite3_errmsg(db)); errormet("908", strg); return(-1); case SQLITE_MISUSE: /*VM should not have been used.*/ sqlite3_reset(dbcmp_cart_wt_in_sel); errormet("908", "SQLITE_MISUSE"); return(-1); break; default: sqlite3_reset(dbcmp_cart_wt_in_sel); errormet("908", "Unexpected return from sqlite3_step"); return(-1); } /*switch*/ } /*while*/ Terence MacDonald wrote:
The following code is part of a class member function that loads data from an existing database. The database has been opened and there IS data in the target table. I have had it working with callbacks, but using the prepare/step/finalise approach below I consistently get the log message: Step : ERROR - not an error i.e. the 'sqlite3_step' loop returns only once indicating an error but the error message says 'not an error'. Can anyone spot my silly error? -------------------------------------------------------------------- string sql = "SELECT name,value FROM setting;" ; sqlite3_stmt *pStmt ; LOGLN("SQL: "+sql) ; if( sqlite3_prepare( db, sql.c_str(), -1, &pStmt, 0 ) != SQLITE_OK ) { LOGLN(string("Prepare: ERROR -")+sqlite3_errmsg(db)) ; } else { int rc ; while( rc=sqlite3_step(pStmt) != SQLITE_DONE ) { if( rc == SQLITE_ROW ) { string name = (const char*)(sqlite3_column_text(pStmt,0)) ; string value = (const char*)(sqlite3_column_text(pStmt,1)) ; settings[name] = value.c_str() ? value : "" ; LOGLN(name+"="+value) ; } else if( rc == SQLITE_BUSY ) { LOGLN("Step: BUSY") ; continue ; } else if( rc == SQLITE_ERROR ) { LOGLN(string("Step : ERROR - ")+sqlite3_errmsg(db)) ; break ; } else if( rc == SQLITE_MISUSE ) { LOGLN("Step: MISUSE") ; break ; } } } sqlite3_finalize(pStmt) ;