Sorry, but I can't give you a definitive answer myself since I working on
the same problem. I'll let you know when/if I solve it and I'm sure you'll
do the same. But for what its worth below is what i'm trying in C++.
first the disclaimer - i'm very new to sqlite and its been a while since
i've done sql/odbc type of work.
SHORT ANSWER: i agree you don't use sqlite_exec. i'm pretty sure you need to
use the sqlite3_bind_blob call with a prepared sqlite3_statement.
LONG ANSWER:
this is what i think you're supposed to do, but it isn't working yet.
GOAL:
Briefly, the goal is to add a blob field (here for a newly created record,
as opposed to updating)
0. assume a table was created with 3 fields.
"create table xtable (id primary integer, stuff as blob, type as
integer);"
1. create a sqlite3_stmt via the prepare call.
const char *sql = "INSERT INTO xtable (id, stuff, type) VALUES
(NULL,?,?)";
rc = sqlite3_prepare( sql, &pstmt, .... );
2. then bind the columns using an index to represent each '?' field.
Notes:
a. since the id is "autoincrement"; (i.e. autoassigned) that field
was not bound
b. use INDEX #1 for the first ? (the blob)
sql_bind_blob( pstmt, 1, pData, nSizeOfData, .. ); // use
appropriate flag here
c. use INDEX #2 for the type
sql_bind_int( pstmt, 2, nTypeValue );
d. unless i'm mistaken the calls to read the values from a query are
0 based and these
are 1 based. perhaps i'm wrong.
e. be sure to check all return codes!
3. then execute the statement via sqlite3_step(pstmt);
4. close/free the statement.
RESULT:
the record was added, the type value is correct, but the blob data is
corrupt.
Note: i have additional code to read the object that verified the type, was
correct, but the blob is wrong. Yes the error could be in my "read from db"
code...
Note: In addition when trying to read that column after a query it states
the blob data type is TEXT as opposed to BLOB. I'm not sure why that is the
case.
Sorry, I couldn't be of more help but perhaps this will lead you in the
right direction.
John
-----Original Message-----
From: Will Leshner [mailto:[EMAIL PROTECTED]
Sent: Friday, October 15, 2004 11:05 AM
To: [EMAIL PROTECTED]
Subject: Re: [sqlite] BLOBs and sqlite_exec
On Oct 15, 2004, at 7:50 AM, Will Leshner wrote:
> Sorry if this is terribly obvious, but I'm assuming that, in SQLite3,
> we can't use the sqlite_exec convenience API to store BLOBs, right? I
> see that if we go through the VM directly the API allows us to specify
> a data size, so that it doesn't depend on NULL-terminated C strings.
> But sqlite_exec does no such thing, right?
>
>
>
Sorry to respond my own question, but I'm digging into the SQLite3 code
a bit more and I'm a little confused. I see that sqlite3_prepare takes
a SQL statement as a char* and also the number of bytes in the SQL
statement. I assumed this was so that you could put BLOB data in the
SQL statement. But sqlite3_prepare doesn't seem to actually use the
nBytes parameter anywhere. And sqlite3RunParser seems to be running the
parse until it finds a NULL byte in the zSql string. In fact,
sqlite3RunParser doesn't even take a number of bytes for the SQL
string, so I don't see how it could be using that for the length of the
string at all.
So I guess my question is: How do you put BLOB (binary) data into a
SQLite3 database?