【问题标题】:Not able to store binary data in sqlite using QT无法使用 QT 在 sqlite 中存储二进制数据
【发布时间】:2016-11-08 22:27:33
【问题描述】:

无法使用 QT 将所有二进制数据值存储到 sqlite3 表中。

为此,我创建了一个 BLOB 数据列来存储名为 logTable 的二进制数据表。 我正在尝试将二进制数据插入到 binary_data[] 缓冲区,其值为 0x1 到 0xFF 和 0x00 到 0xFF 等等,直到 1024 字节。但是当我执行查询来存储数据时,表格只显示 0x1 到 0xFF,但剩余的字符没有被存储(因为下一个立即值是 0x00)。我想存储所有的二进制数据值?

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

执行此代码后,当我使用 sqlite 输出时,表格的结果是 254 个字符

$sqlite3 日志.db

sqlite>.output try.txt

sqlite>从logTable中选择*;

$ls -l try.txt

大小为 406 字节

【问题讨论】:

    标签: sqlite qt


    【解决方案1】:

    您必须使用.dump。 sqlite3 交互式客户端不输出 BLOB 列。

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

    下面的代码是创建一个简单的包含 blob 的数据库的自包含示例。

    // 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 2020-07-19
      • 2013-11-22
      相关资源
      最近更新 更多