void *blob = reinterpretcast<char *>(imageArray); void *blob = reinterpretcast<void *>(imageArray);
Ron Wilson, S/W Systems Engineer III, Tyco Electronics, 434.455.6453 -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of C S Sent: Wednesday, March 12, 2008 9:37 AM To: General Discussion of SQLite Database Subject: Re: [sqlite] SQL Blobs - what am i doing wrong here?(code inside) Dennis, thanks for your and everyone elses help with this problem. i actually did everything you said here and the program executed without any errors. i re-created the table to what you said as now so it is blob now instead of text. i get nothing. i have a printout statement to make sure an imageID was created and it was successfully. the array is indeed dynamic and has to be. to echo this is what i have: myString = "insert into Images(imageID, imageData) values(?, ?); status = sqlite3_prepare_v2(db, myString.c_str(), -1, &statement, NULL); void *blob = reinterpretcast<char *>(imageArray); status = sqlite3_bind_blob(statement, 2, blob, 10 * sizeof(unsigned short), SQLITE_STATIC); statusu = sqlite3_finalize(statement); return sqlite3_last_insert_row(db); **************************** however when i do: select * from Images; i get no results returned to me. i just get returned to the prompt. is there anything that i missed? thanks again!!! --- Dennis Cote <[EMAIL PROTECTED]> wrote: > C S wrote: > > hi all - i am trying once again to insert an > image(an > > array of shorts) into a blob. > > > > i created a table that is described as such: > > > > CREATE TABLE Images{ > > imageID integer primary key, > > imageData text not null); > > > > #1 - is text ok here for a blob? maybe not - this > may > > be my entire problem. > > > > I would recommend using a column type of BLOB for > blob data just to > avoid any confusion. > > CREATE TABLE Images ( > imageID integer primary key, > imageData blob not null); > > > > anyway instead of using data in an image i just > made > > an array of unsigned shorts and filled it. a size > of > > 10. > > > > so here is what i am doing in the code. imageArray > > holds the unsigned shorts(there are 10 of them) > > > > char* blob = reinterpret_cast<char*>(imageArray); > > > > Generally you should use a void* instead of a char* > for blobs. > > void* blob = reinterpret_cast<void*>(imageArray); > > This pointer isn't needed if your imageArray is a > true array of unsigned > shorts rather than a pointer to some dynamically > allocated memory. > > unsigned short imageArray[10] = > {1,2,3,4,5,6,7,8,9,10}; > > > > string myString = "insert into Images(ImageID, > > imageData) values(?, 'blob')"; > > Note, this 'blob' is a string literal and has no > relation at all to the > blob variable you defined above. You need to use a ? > for the second > parameter as well so that you can bind a value to it > later. > > string myString = "insert into Images(ImageID, > imageData) values(?, ?)"; > > > > > //then i want to try to prepare the statement: > > > > int status = sqlite3_prepare_v2(db, > myString.c_str(), > > -1, &statement, NULL); > > if( (status != SQLITE_OK) || (statement == NULL)) > > cout << "Error preparing SQL Statement" << endl; > > > > There is no need to check statement here. SQLite > will return an error > code other than SQLITE_OK if it fails. > > > > > //now i would like to bind the blob: > > > > status = sqlite3_bind_blob(statement, 1, > imageArray, > > 10 * sizeof(unsigned short), SQLITE_TRANSIENT); > > > > The blob will be the second parameter to the > statement. This parameter > can be static as long as the image data will be > stable until the > statement is executed by sqlite3_step(). > > If you want to use the blob pointer above you should > do this: > > status = sqlite3_bind_blob(statement, 2, blob, > 10 * sizeof(unsigned short), SQLITE_STATIC); > > If imageArray is a true array as shown above you can > instead do this: > > status = sqlite3_bind_blob(statement, 2, imageArray, > sizeof(imageArray), SQLITE_STATIC); > > You have not bound a value to the first parameter, > the imageId column, > so it will have a null value when the statement > executes. This is OK > since the column is declared as "integer primary > key" and SQLite will > assign a unique ID value. > > > > > //execute statement for each row?? > > while( (status = sqlite3_step(statement)) == > > SQLITE_ROW); > > > > There is no need for a while loop here. An insert > statement can only > step once, and sqlite3_step() will return > SQLITE_DONE or some other > error code. > > > //free the prepared statement > > status = sqlite3_finalize(statement); > > if(status != SQLITE_OK) > > cout << "Error deleting prepared SQL statement" > << > > endl; > > > ===================================================== > > > > i actually get the last status check output, > saying > > that there was an error deleting the statement. > when i > > looked that up it says there was a problem with > the > > prepare statement being successful or nothing > happens > > at all when clearly i did and clearly the status > was > > ok too since i didnt get an error message there. > > > > I'm not sure why the finalize would fail, unless > perhaps your prepare > also failed, and you didn't have a valid statement > pointer to pass to > sqlite3_finalize(). > > > can anyone help me out as to what might be going > on > > here? thanks so much in advance > > > > HTH > Dennis Cote > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > ________________________________________________________________________ ____________ Be a better friend, newshound, and know-it-all with Yahoo! Mobile. Try it now. http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAcJ _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users