SQLite Forum

how to save results of
Login

how to save results of

(1.1) Originally by hitbuyi with edits by Richard Hipp (drh) on 2020-05-23 10:51:51 from 1.0 [link] [source]

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


const char *sql_query_tmp ="SELECT FrmNo,CapTime,CamTime from radar_1 WHERE FrmNo = %d ";
   char sql_query[200] = {0};
   sprintf(sql_query,sql_query_tmp,1);
   printf("query,radar_1,sql = %s\n",sql_query);

   rc = sqlite3_exec(db, sql_query, callback_query1, 0, &zErrMsg);
   if (rc != SQLITE_OK)
   {
      printf("sql inquery error, %s", sqlite3_errmsg(db));

      sqlite3_free(zErrMsg);
   }
    


the code inquire the table well, and the call back function print the correct data.

BUT,how do I save this results into array or file? since callback function have no interface in sqlite3_exec(),should I write in this way

rc = sqlite3_exec(db, sql_query, callback_query1(p1,p2,...,etc), 0, &zErrMsg);

I feel it is a bit hard for a newbie to learn sqlite3, since few examples are available from the office website,in fact,even a few examples are helpful for a starter, 

Any help will be appricated

(2) By anonymous on 2020-05-23 15:04:27 in reply to 1.1 [link] [source]

the call back function print the correct data.

BUT,how do I save this results into array or file

There is an argument to your callback function that you called void *NotUsed. Note that it is passed from the second-to-last argument to sqlite3_exec. You can use it to pass your callback a FILE* to fprintf into or a pointer to append data to.

Take a look at the implementation of the sqlite3_get_table() function (not recommended for use) for some inspiration on how to allocate a memory for an unknown number of rows while receiving them in the callback. Perhaps the usual sequence of sqlite3_prepare_v2() / sqlite3_bind_*() / loop on sqlite3_step() / sqlite3_finalize() will result in cleaner code?

(3) By Clemens Ladisch (cladisch) on 2020-05-23 15:04:41 in reply to 1.1 [source]

The easiest way to use sqlite3_exec() is to replace it with sqlite3_prepare_v2()/sqlite3_step()/sqlite3_column_*()/sqlite3_finalize() calls so that you can read the data in the same place where you actually need to handle it:

sqlite3_stmt *stmt;
const char *sql = "SELECT FrmNo,CapTime,CamTime from radar_1 WHERE FrmNo = ?";
int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (rc != SQLITE_OK) {
    print("error: ", sqlite3_errmsg(db));
    return;
}
sqlite3_bind_int(stmt, 1, 1);
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
    int frm_no           = sqlite3_column_int (stmt, 0);
    const char *cap_time = sqlite3_column_text(stmt, 1);
    // ...
}
if (rc != SQLITE_DONE) {
    print("error: ", sqlite3_errmsg(db));
}
sqlite3_finalize(stmt);