2013-08-06 12 views
5

Nach dem Besuch Dutzender Websites mit Informationen über SQLite kann ich immer noch keine Lösung finden, um einen Fehler zu beheben, während ein Blob bindet. Hier ist die Tabelle decleration:SQLite Blob Einfügen C++

CREATE TABLE ONE ( 
ID INTEGER  PRIMARY KEY AUTOINCREMENT 
        NOT NULL, 
NAME CHAR(50) NOT NULL, 
LABEL CHAR(50), 
GRP CHAR(50), 
FILE BLOB 
); 

Und hier ist der Code zum Einfügen:

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: Geklebte volle Funktion, die Menge von Zeichen einfügen im Versuch ist über 350K.

Das Ergebnis von binb_blob ist immer 21, Fehlercode enthält nichts. Puffer enthält Binärdateidaten, die wahrscheinlich nicht zu groß sind, daher der Fehlercode. Irgendwelche Hinweise würden gegeben werden.

+0

'fileptr = & Puffer;' für einen. –

+0

Es ist auch möglich, dass "count" falsch ist - wir sehen nicht, wie das eingestellt ist. –

+0

count ist die Anzahl der Zeichen im Puffer, und was ist falsch mit fileptr? Platzieren des Puffers selbst ändert nichts imo – Ghostli

Antwort

11

Ihr Code enthält zu viele Fehler zum Zählen.

so etwas wie dieses Versuchen:

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; 
}