1

QT を使用してすべてのバイナリ データ値を sqlite3 テーブルに格納することはできません。

このために、logTable という名前のバイナリ データ テーブルを格納する BLOB データ列を作成しました。バイナリ データを 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 log.db

sqlite>.output try.txt

sqlite>select * logTable から;

$ls -l try.txt

サイズは406バイト

4

1 に答える 1

2

を使用する必要があります.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();
}
于 2012-06-16T14:10:45.653 に答える