Typed data retrieval is not supported by the callback method of execution. You must use the prepare/step/finalize execution method.
Check out: http://www.sqlite.org/capi3.html in particular, the sqlite3_step and related functions in section 2.2 "Executing SQL statements." This section gives the functions to retrieve typed data from a row. Sorry, no sample code as I've yet to dive headlong into v3 yet. My work for the moment is v2 only. Christian On Sun, 25 Jul 2004, Al Danial wrote: >Since SQLite v2 was 'typeless', one had to call atoi() and atof() on terms >of the array *azArg to convert the text strings returned by a query into >integers and doubles. > >As I understand it SQLite v3 stores integers and doubles in their native >binary format so one should be able to get at the numeric data without >text string conversions via atoi()/atof(). Does anyone have C code that >demonstrates how this could be done? > >Here's a sample database and corresponding query + callback I'm currently >using: > > create table people ( name text, age integer , lat float, lon float ); > insert into people values ( 'Alice' , 43 , 1.1 , -3.4e-3 ); > insert into people values ( 'Bob' , 28 , 5.5 , -3.1e+3 ); > insert into people values ( 'Cindy' , 21 , 8.8 , 3.2e+5 ); > >The query: > > rc = sqlite3_exec_printf(sql_db, > "select * from people order by age asc " > , a1_i1_d2_cb, > &sql_data, > &zErrMsg); > >The callback: > > int a1_i1_d2_cb(void *pArg, int nFields, char **azArg, char **azCol) { > /* return array of [string, integer, double, double] */ > callback_data *p = (callback_data*) pArg; > > if (!azArg) > return 0; > strncpy(p->a[p->nRows][0], azArg[0], SQL_STR_SIZE); > p->i[p->nRows][0] = atoi(azArg[1]); > p->x[p->nRows][0] = atof(azArg[2]); > p->x[p->nRows][1] = atof(azArg[3]); > ++(p->row_index); > ++(p->nRows); > > return 0; > } > >The callback variable 'sql_data' has type 'callback_data' defined like this: > > #define SQL_BLOCK_SIZE 1000 > #define SQL_STR_SIZE 200 > #define SQL_MAX_COLUMNS 20 > > typedef struct { > sqlite3 *db; /* database handle */ > FILE *out; /* output file handle */ > char nullvalue[SQL_MAX_COLUMNS]; /* string to display for NULL's */ > char zDbFilename[SQL_STR_SIZE]; /* db filename */ > int nRows; /* size of a[]/i[]/x[] with valid data */ > int row_index; /* pointer to current row within table */ > char a[SQL_BLOCK_SIZE][SQL_MAX_COLUMNS][SQL_STR_SIZE];/* string */ > int i[SQL_BLOCK_SIZE][SQL_MAX_COLUMNS]; /* integer */ > double x[SQL_BLOCK_SIZE][SQL_MAX_COLUMNS]; /* double */ > } callback_data; > >My questions: > How can I populate sql_data.i[] and sql_data.x[] without calling atoi() > and atof() on terms of azArg[]? > Is there example C code out there that demonstrates the technique? > -- Al > -- /"\ \ / ASCII RIBBON CAMPAIGN - AGAINST HTML MAIL X - AGAINST MS ATTACHMENTS / \