如何使用QT Sqlite插入多行?

s71maibg  于 2023-01-02  发布在  SQLite
关注(0)|答案(3)|浏览(270)

我有下面的代码(它是一个函数),我想在调用它时向数据库中插入500个值。

QSqlDatabase::database().transaction();
query.prepare("INSERT INTO datatable (Name, age, data1, data2, data3, data4, data5)"
              "VALUES (?, ?, ?, ?, ?, ?, ?)");
for (int i = 0; i<500; i++){
    query.bindValue(0,Name[j]);
    query.bindValue(1,age[j]);
    query.bindValue(2,data1[j]);
    query.bindValue(3,data2[j]);
    query.bindValue(4,data3[j]);
    query.bindValue(5,data4[j]);
    query.bindValue(6,data5[j]);
    query.next();   //just trying to go for the next row
}
qDebug() << "Finish" << QSqlDatabase::database().commit();

问题是这只是插入j=500时的数据,我的意思是,这只存储最后一个数据,其他499个数据没有存储。
有人能帮我吗?我试着把查询,准备循环内,但这没有工作。

myzjeezk

myzjeezk1#

必须使用exec()方法而不是next()

QSqlDatabase db = QSqlDatabase::database();

if(db.transaction()){

    QSqlQuery query;
    query.prepare("INSERT INTO datatable (Name, age, data1, data2, data3, data4, data5) VALUES (?, ?, ?, ?, ?, ?, ?)");
    for (int i = 0; i < 500; i++){
        query.bindValue(0, Name[i]);
        query.bindValue(1, age[i]);
        query.bindValue(2, data1[i]);
        query.bindValue(3, data2[i]);
        query.bindValue(4, data3[i]);
        query.bindValue(5, data4[i]);
        query.bindValue(6, data5[i]);
        if(!query.exec()){
            qDebug() << query.lastError().text();
        }
    }

    if(!db.commit()){
        qDebug() << db.lastError().text();
    }
}
mxg2im7a

mxg2im7a2#

query.next()通常用于迭代数据读取器的行。您应该使用query.exec()在事务中插入数据。
这是一个很好的教程:https://katecpp.wordpress.com/2015/08/28/sqlite-with-qt/

avwztpqn

avwztpqn3#

这正是QSqlQuery::execBatch的用途。

query.prepare("INSERT INTO datatable (Name, age, data1, data2, data3, data4, data5)"
              "VALUES (?, ?, ?, ?, ?, ?, ?)");
QVariantList names;
QVariantList ages;
QVariantList data[5];
for (int i = 0; i<500; i++) {
    names << Name[j];
    ages << age[j];
    data[0] << data1[j];
    data[1] << data2[j];
    data[2] << data3[j];
    data[3] << data4[j];
    data[4] << data5[j];
}
query.addBindValue(names);
query.addBindValue(ages);
for (int i=0; i < 5; ++i)
    query.addBindValue(data[i]);

if (!query.execBatch())
   qDebug() << q.lastError();

相关问题