【问题标题】:QByteArray as blob data inserted partially in sqlite3 (c++)QByteArray 作为 blob 数据部分插入 sqlite3 (c++)
【发布时间】:2026-01-01 22:10:01
【问题描述】:

我正在尝试将我用QNetworkAccessManager 下载的图像数据插入为QByteArray。我正在尝试将此QByteArray 作为 BLOB 插入。我的表创建查询是

CREATE TABLE TILE_IMAGE(TILE_ID VARCHAR(1050), IMAGE_DATA BLOB,INSERTED_AT DATETIME,USED_AT DATETIME, PRIMARY KEY(TILE_ID))

我这样创建了插入查询,

    query = QString("INSERT INTO ");
    query.append("TILE_IMAGE");
    query.append(QString("(TILE_ID, IMAGE_DATA ,INSERTED_AT ,USED_AT) VALUES(\'"));
    query.append(*tileId);
    query.append(QString("\',\'"));
    query.append(QString(*imageData));
    query.append(QString("\',DATETIME('NOW'),DATETIME('NOW'))"));

但是当我打印它显示的查询时,

"INSERT INTO TILE_IMAGE(TILE_ID, IMAGE_DATA ,INSERTED_AT ,USED_AT) VALUES('ivbase_TILED_MAP_VIEW_16_37396_22531','ÿØÿà',DATETIME('NOW'),DATETIME('NOW'))" 

看到 BLOB 数据只有 4 个长度。并且有一些奇怪的值。 *imageData 包含的屏幕截图是,

图片长256*256*4。它是一个 jpeg 图像。

编辑:我遵循 CL 的代码,现在 IMAGE_DATA 列有一些菱形字符。图片如下。

【问题讨论】:

  • imageData是什么类型?

标签: c++ sql sqlite blob qbytearray


【解决方案1】:

您不能将 blob 的二进制内容转换为字符串。 您必须改用parameters

QSqlQuery query;
query.prepare("INSERT INTO TILE_IMAGE(TILE_ID, IMAGE_DATA) VALUES(?,?)");
query.bindValue(0, *tileId);
query.bindValue(1, *imageData);
query.exec();

【讨论】:

  • 嗨。我像你一样更改了代码。现在它显示了一些菱形字符。这也是 4 长。我用图片编辑了我的帖子。感谢您的回复。
【解决方案2】:

我是怎么做到的

    QString query = QString("INSERT INTO ");
    query.append("TILE_IMAGE");
    query.append(QString("(TILE_ID, IMAGE_DATA ,INSERTED_AT ,USED_AT) VALUES(\'"));
    query.append(*tileId);
    query.append(QString("\',\'"));
    query.append(QString(imageData->toBase64()));
    query.append(QString("\',DATETIME('NOW'),DATETIME('NOW'))"));
    load(query, QUERY_TYPE_CHANGE,false);

虽然当我像这样从数据库中读取它时它仍然显示菱形字符,但它确实有效,

    QString query;
    query = QString("SELECT");
    query.append(" IMAGE_DATA FROM TILE_IMAGE WHERE TILE_ID=\'");
    query.append(tileId).append(QString("\'"));
    int id = getId();
    load(query, id,true);
    query = resultList.value(0).toMap().value("IMAGE_DATA").value<QString>();
    QByteArray arr = QByteArray::fromBase64(query.toLatin1());

知道为什么显示菱形字符会有所帮助吗?

【讨论】: