SQLite Blob insertion c++
c++, sqlite
Solution
Your code has too many errors to count.
Try something like this:
int InsertFile(const string& db_name)
{
ifstream file("Sql.pdf", ios::in | ios::binary);
if (!file) {
cerr << "An error occurred opening the file\n";
return 12345;
}
file.seekg(0, ifstream::end);
streampos size = file.tellg();
file.seekg(0);
char* buffer = new char[size];
file.read(buffer, size);
sqlite3 *db = NULL;
int rc = sqlite3_open_v2(db_name.c_str(), &db, SQLITE_OPEN_READWRITE, NULL);
if (rc != SQLITE_OK) {
cerr << "db open failed: " << sqlite3_errmsg(db) << endl;
} else {
sqlite3_stmt *stmt = NULL;
rc = sqlite3_prepare_v2(db,
"INSERT INTO ONE(ID, NAME, LABEL, GRP, FILE)"
" VALUES(NULL, 'fedfsdfss', NULL, NULL, ?)",
-1, &stmt, NULL);
if (rc != SQLITE_OK) {
cerr << "prepare failed: " << sqlite3_errmsg(db) << endl;
} else {
// SQLITE_STATIC because the statement is finalized
// before the buffer is freed:
rc = sqlite3_bind_blob(stmt, 1, buffer, size, SQLITE_STATIC);
if (rc != SQLITE_OK) {
cerr << "bind failed: " << sqlite3_errmsg(db) << endl;
} else {
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE)
cerr << "execution failed: " << sqlite3_errmsg(db) << endl;
}
}
sqlite3_finalize(stmt);
}
sqlite3_close(db);
delete[] buffer;
}
Problem
After visiting dozens of websites containing info about SQLite I still cannot find a solution to fix an error while binding a blob. Here is the table decleration: ``` CREATE TABLE ONE ( ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, NAME CHAR( 50 ) NOT NULL, LABEL CHAR( 50 ), GRP CHAR( 50 ), FILE BLOB ); ``` And here is the code for insertion: ``` int InsertFile(string name) { const char* dbname = name.c_str(); sqlite3 *database; int rc = sqlite3_open(dbname, &database); char *zErrMsg = 0; unsigned char *buffer = (unsigned char*) malloc(sizeof(char)*MAX); ifstream file; file.open("Sql.pdf", ios::in|ios::binary); if ( ! file ) { cout << "An error occurred opening the file" << endl; } int count = 0; const void* fileptr = NULL; fileptr = buffer; while(file.good()) { char c=file.get(); buffer[count]=c; count++; } file.close(); sqlite3_stmt *stmt = NULL; char* statement = "INSERT INTO ONE( ID, NAME, LABEL, GRP, FILE ) VALUES ( NULL, 'fedfsdfss', NULL, NULL, ?);"; rc = sqlite3_prepare_v2(database, statement, 0, &stmt, NULL); rc = sqlite3_bind_blob(stmt, 1, fileptr, sizeof(char)*count, SQLITE_TRANSIENT); const char* result = sqlite3_errmsg(database); rc = sqlite3_step(stmt); result = sqlite3_errmsg(database); sqlite3_close(database); free(buffer); fileptr=NULL; return 0; ``` } EDIT: Pasted full function, the amount of characters im trying to insert is about 350K. The result from binb_blob is always 21, error code contains nothing. buffer contains binary file data, which most probably isn't too big hence the error code. Any hints would be apprieciated.