2013-08-06 23 views
5

Po odwiedzeniu dziesiątek stron internetowych zawierających informacje o SQLite wciąż nie mogę znaleźć rozwiązania, które naprawiłoby błąd podczas wiązania bloba. Oto decleration tabela:Wprowadzanie bloku SQLite C++

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

A oto kod do wstawienia:

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 pełen funkcji, ilość znaków Próbuję wstawić wynosi około 350K.

Wynik z binb_blob wynosi zawsze 21, kod błędu nie zawiera niczego. bufor zawiera dane binarne, które najprawdopodobniej nie są zbyt duże, stąd kod błędu. Wszelkie podpowiedzi byłyby doceniane.

+0

'fileptr = & bufor;' dla jednego. –

+0

Jest również możliwe, że 'count' jest fałszywe - nie widzimy, jak to jest ustawione. –

+0

count to liczba znaków w buforze i co jest nie tak z fileptr? Umieszczenie samego bufora nie zmienia nic imo – Ghostli

Odpowiedz

11

Twój kod zawiera zbyt wiele błędów do zliczenia.

Spróbuj czegoś takiego:

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