You're example should work if you only prepare the statement once.
So assuming mystmt is set to NULL on your object creation.
if (mystmt == NULL) {
rc = sqlite_prepare_v2.....
}
Then reset it to NULL again when you set apstr="finished". After
sqlite3_finalize(mystmt). That way you're next query will reprepare the
statement again.
}else{
if (rc == SQLITE_DONE) {
apstr = "finished";
this->finalize();
mystmt = NULL; // is this being done in your finalize??? It could be put in
there instead of here.
}
else {
apstr = "error: " + sqlite3_errmsg(db);
this->finalize();
mystmt = NULL;
}
}
Michael D. Black
Senior Scientist
Advanced Analytics Directorate
Advanced GEOINT Solutions Operating Unit
Northrop Grumman Information Systems
________________________________________
From: [email protected] [[email protected]] on
behalf of Arbol One [[email protected]]
Sent: Friday, September 07, 2012 4:07 AM
To: 'General Discussion of SQLite Database'
Subject: EXT :Re: [sqlite] C++ - WHERE clause - 2nd update
Yes, thank?
I gave you the answer you gave me, obviously I was right.
I need you to prove me right again, how about, haaa.... yes! if 2x2 is 4,
what is 2x2? Come on! I know you can get it, just try going slowly this
time.
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Marcus Grimm
Sent: Friday, September 07, 2012 3:39 AM
To: General Discussion of SQLite Database
Subject: Re: [sqlite] C++ - WHERE clause - 2nd update
On 07.09.2012 08:58, Arbol One wrote:
> I got this code to work, however, I am getting a segmentation fault on
> this code.
>
> I pass to SQLite only one statement [db->setStmt(apstr);], I read the
> first of the 'fname', but I don't know how to get to the second
> 'fname' in the database.
> I am not very sure as to what do to tell the program to read the next
> row until there are no more [ read_str until SQLITE_DONE ] rows to read.
well.. you already answered your question:
You step thru the result list until you reach SQLITE_DONE.
In your example you re prepare the statement all the time and thus you will
always get the first hit in your data.
The sequence should be:
sqlite3_prepare_v2
while( sqlite3_step(mystmt) == SQLITE_ROW ) {
/** read the data .. **/
}
sqlite3_finalize
...
> Help?
>
> Glib::ustring apstr;
> Glib::ustring sName;
> int apint;
> mySQLite3* db;
> try {
> db = new mySQLite3(db_name.c_str());
> } catch(somexception& e) {
> //do something
> }
>
> // SQL statement
> Glib::ustring sName;
> apstr = "SELECT fname FROM ";
> apstr += this->db_table_name;
> apstr += " WHERE title = \'";
> apstr += token;
> apstr += "\' ";
>
> apint = 0;
> db->setStmt(apstr);
> do{
> try {
> sName = db->read_str(apint);
> } catch(jme::Exception& e ) {
> e.Display();
> }
> apex.setException(sName, FILE, METHOD, LINE);
> apex.Display();
> }while(sName != "finished");
>
>
> --------------------------------------------
> const Glib::ustring& mySQLite3::read_str(const int pos)
> throw(somexception) {
>
> rc = sqlite3_prepare_v2(db, this->SQLStatement.c_str(),
> -1,&mystmt, NULL);
> if(rc != SQLITE_OK) {
> // do something
> }
> rc = sqlite3_step(mystmt);
> if(rc == SQLITE_ROW ) {
> apstr = (const char*)sqlite3_column_text(mystmt,pos);
> }else{
> apstr = "finished"; // a small modification
> }
> try {
> this->finalize();
> } catch(somexception& e) {
> throw e;
> }
> return apstr;
> }
>
> What am I doing wrong?
>
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users