Hi,

Are there any tutorials available to explain SQLite3's prepared statement interface further? I adapted from:
http://www.linuxjournal.com/article/7803


As a test, I created a database containing a single table [children]. I filled it with the names of 3 girls and 2 boys, and then tried to write a program that selects the boys and girls separately and printed their names.
However, I have difficulty in binding text with sqlite3_bind_text()
It appears that sqlite3_step() returns SQLITE_DONE at once, so my loop to print the names never runs.


I use SQLite 3.2.0 on Windows XP.
My compiler is the MinGW port of GCC 3.4.2
I used dlltool to generate libsqlite3.a

The source file used is attached as main.cpp
The database name is hardcoded as "mytest.db"
The SQL script that creates a chilren table is attached as children.sql

Basically I do a command line jig with:
g++ -c main.cpp
g++ -o test.exe main.o -lsqlite3
test

Hope someone can point out my mistakes, and point me in the right direction.

Thanks,
Eugene Wee
#include <iostream>
#include <sqlite3.h>

using std::cout;
using std::cerr;
using std::endl;

int main() {
        sqlite3* db;
        if (sqlite3_open("mytest.db", &db) == SQLITE_OK) {
                sqlite3_stmt* stmt;
                #define QUERY "SELECT name FROM children WHERE sex=:sex"
                if (sqlite3_prepare(db, QUERY, sizeof(QUERY), &stmt, NULL) == 
SQLITE_OK) {
                        int index = sqlite3_bind_parameter_index(stmt, ":sex");
                        #define SEX "'M'"
                        sqlite3_bind_text(stmt, index, SEX, sizeof(SEX), 
SQLITE_TRANSIENT);
                        cout << "The boys are:\n";
                        while (sqlite3_step(stmt) == SQLITE_ROW) {
                                cout << "- " << sqlite3_column_text(stmt, 0) << 
"\n";
                        }
                        sqlite3_reset(stmt);
                        #undef SEX
                        #define SEX "'F'"
                        sqlite3_bind_text(stmt, index, SEX, sizeof(SEX), 
SQLITE_TRANSIENT);
                        cout << "The girls are:\n";
                        while (sqlite3_step(stmt) == SQLITE_ROW) {
                                cout << "- " << sqlite3_column_text(stmt, 0) << 
"\n";
                        }
                } else {
                        cerr << sqlite3_errmsg(db) << endl;
                }
                sqlite3_finalize(stmt);
        } else {
                cerr << sqlite3_errmsg(db) << endl;
        }
        sqlite3_close(db);
        return 0;
}
CREATE TABLE children(
        name TEXT,
        sex  TEXT
);
INSERT INTO children VALUES('Amanda', 'F');
INSERT INTO children VALUES('Charis', 'F');
INSERT INTO children VALUES('Desmond', 'M');
INSERT INTO children VALUES('Bernadette', 'F');
INSERT INTO children VALUES('Charles', 'M');

Reply via email to