2012-06-16 2 views
1

QT를 사용하여 모든 이진 데이터 값을 sqlite3 테이블에 저장할 수 없습니다.QT를 사용하여 sqlite에 바이너리 데이터를 저장할 수 없습니다.

이 경우 logTable이라는 이진 데이터 테이블을 저장하기 위해 BLOB 데이터 열을 만들었습니다. binary_data [] 버퍼에 이진 데이터를 삽입하려고합니다. 값은 0x1에서 0xFF까지, 0x00에서 0xFF까지 1024 바이트까지입니다. 그러나 쿼리를 실행하여 데이터를 저장하면 테이블에 0x1 ~ 0xFF 만 표시되지만 나머지 문자는 저장되지 않습니다 (즉 치값이 0x00이므로). 모든 바이너리 데이터 값을 저장하고 싶습니다. SQLite는 I로부터 출력 사용시

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    conect_to_log_db("./log.db"); 

    unsigned char binary_data[1024]; 

    for(unsigned int i = 0, value = 1; i < 1024; i++, value++) 
    { 
     binary_data[i] = value; 
    } 
    store_to_log_db("01/02/2012,13:03:58", binary_data, 1024); 
    ...... 
} 


bool store_to_log_db(QString dateTime, unsigned char *data, unsigned int dataLength) 
{ 
    QSqlQuery objQuery(objLogsDB); 

    QString query = "CREATE TABLE IF NOT EXISTS logTable(logDateTime VARCHAR(19), packet BLOB, direction INTEGER)"; 
    objQuery.exec(query); 

    QByteArray dataArr; 
    dataArr.resize(dataLength); 
    for(unsigned int i = 0; i < dataLength; i++) 
    { 
     dataArr[i] = data[i]; 
    } 

    QVariant blobData = dataArr.data(); 

    objQuery.prepare("INSERT INTO logTable VALUES(:logDateTime,:packet,:direction)"); 
    objQuery.bindValue(":logDateTime",dateTime); 
    objQuery.bindValue(":packet",blobData,QSql::In | QSql::Binary); 
    objQuery.bindValue(":direction",1); 

    qDebug() << objQuery.exec(); 

    return true; 
} 

이 코드를 실행 한 후, 테이블의 결과가 254 개 문자까지이다

$ sqlite3를 log.db

SQLite는> · 출력 try.txt

sqlite> select * from logTable;

$ 1!은

크기는 406 바이트

답변

0

당신은 .dump를 사용해야입니다 try.txt -l. sqlite3 대화식 클라이언트는 BLOB 열을 출력하지 않습니다.

$sqlite3 log.db 
sqlite> .output try.txt 
sqlite> .dump 
sqlite> .quit 

아래 코드는 간단한 얼룩이 포함 된 데이터베이스를 만드는 자체 포함 된 예입니다.

// https://github.com/KubaO/stackoverflown/tree/master/questions/sqlite-blob-11062145 
#include <QtSql> 

int main() 
{ 
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
    db.setDatabaseName("./log.db"); 

    if (!db.open()) { qDebug() << "can't open the database"; return 1; } 

    QSqlQuery query{db}; 

    query.exec("DROP TABLE log"); 

    if (!query.exec("CREATE TABLE log(packet BLOB)")) 
     qDebug() << "create table failed"; 

    QVariant data[2] = {QByteArray{1024, 1}, QByteArray{2048, 2}}; 

    query.prepare("INSERT INTO log VALUES(:packet)"); 

    query.bindValue(":packet", data[0], QSql::In | QSql::Binary); 
    if (!query.exec()) qDebug() << "insert failed"; 

    query.bindValue(":packet", data[1], QSql::In | QSql::Binary); 
    if (!query.exec()) qDebug() << "insert failed"; 

    db.close(); 

    if (!db.open()) { qDebug() << "can't reopen the database"; return 2; } 

    query.prepare("SELECT (packet) FROM log"); 
    if (!query.exec()) qDebug() << "select failed"; 

    for (auto const & d : data) if (query.next()) { 
     qDebug() << query.value(0).toByteArray().size() << d.toByteArray().size(); 
     if (d != query.value(0)) qDebug() << "mismatched readback value"; 
    } 

    db.close(); 
} 
+0

감사의 Ober, 당신은 텍스트 파일에 데이터 올바른 .dump 출력됩니다. – user1460364

관련 문제