Григорий Григоренко <[email protected]> wrote:
> I am using prepared stmts to cache selected record for later use. I have a
> wrapper class, that has methods like AsString(name),
> AsFloat(name) etc to extract data for a column name.
>
> I prepare, bind and then do Sqlite3_step() to get record. Later I use
> sqlite3_column_XXX() to access data.
>
> My concern is - do open selective prepared stmts depend on something in db or
> lock something in db?
Yes, until you call sqlite3_reset or sqlite3_finalize. For as long as the
statement is "active" (meaning, sqlite3_reset or sqlite3_finalize has not been
called after the most recent sqlite3_step call), it holds a read transaction
open.
> Var Alice := Db.SelectRecord('SELECT * FROM client WHERE client_name = ?', [
> 'alice' ]);
>
> 1. If I drop record for "alice" from db and then access column data in
> prepared stmt will it work OK?
If the select statement wasn't reset or finalized, you won't be able to delete
a record from the database (or, in WAL journaling mode, you would be able to,
but the reader would still see original data).
> 2. Can I drop client table while having such prepared stmt not closed?
What do you mean by "closed" here?
> 3. If I have a lot of such stmts (100 or more) will it somehow affect
> performance of SQLite or waste lots of memory?
No, not really. There is a reasonably small data structure associated with a
prepared statement, on the order of a few hundred bytes perhaps.
> Are there some kind of cursors for each selecting prepared stmt?
In a sense. After a call to sqlite3_step and before a call of sqlite3_reset or
sqlite3_finalize, you might think of a statement handle as a form of a cursor.
Each subsequent sqlite3_step call advances this cursor forward by one row.
> 4. If there is a cursor, maybe there is a way to disconnect a cursor from
> stmt keeping the single record still available?
No, short of making a copy of every column's value.
--
Igor Tandetnik
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users