Qt | SQLite数据库执行两次命令

时间:2013-06-27 09:09:02

标签: qt command execute

希望你能帮助我解决这个问题,基本上它是快速解释的。 我建立了一个与SQLite数据库的数据库连接,并写了一个简单的函数,它将返回数据库,所以我可以使用" db()"而不是再次声明它。 这对其他项目起作用之前,我只是复制了它的大部分内容,所以我不知道它出错了......但是我要执行的每个命令都执行了两次。

localdatabase.h

#ifndef LOCALDATABASE_H
#define LOCALDATABASE_H

#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QStringList>

class LocalDatabase : public QObject
{
    Q_OBJECT
public:
    explicit LocalDatabase(QObject *parent = 0);
    void initialize();
    bool insertHashValues(QStringList allHash);

private:
    QSqlDatabase db();
};

#endif // LOCALDATABASE_H

localdatabase.cpp

#include "localdatabase.h"

LocalDatabase::LocalDatabase(QObject *parent) :
    QObject(parent)
{
}

QSqlDatabase LocalDatabase::db()
{
    return QSqlDatabase::database();
}

void LocalDatabase::initialize()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setHostName("127.0.0.1");
    db.setDatabaseName("C:/temp/data.db");
    db.setConnectOptions("Count Changes=off;pooling=true;Cache Size=10000;Page Size=4096;Synchronous=off;");
}

bool LocalDatabase::insertHashValues(QStringList allHash)
{
    bool result = true;

    if(!db().open()) return false;
    db().transaction();

    foreach(QString hash, allHash)
    {
        QSqlQuery q("INSERT INTO hash (hash) VALUES ('" + hash + "');", db());

        if(!q.exec())
        {
            result = false;
            break;
        }
    }

    db().commit();
    db().close();

    return result;
}

的main.cpp

#include <QApplication>
#include "mainwindow.h"
#include "localdatabase.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    LocalDatabase ldb;
    ldb.initialize();

//  ***
//  Writing Hash-Keys into the StringList "allHash"
//  ***

    ldb.insertHashValues(allHash);

    return a.exec();
}

StringList&#34; allHash&#34;包含大约160,000个哈希值....还在调试中检查了这一点。 这应该导致数据库中有160,000个,但最后我有320,000个被执行的查询。

然后数据库看起来像这样:

ID;散列
1; f8j39fh3fdh34fg3h4fgtrgr
2; f8j39fh3fdh34fg3h4fgtrgr
3; 3freferff343t65j8j787k8k
4; 3freferff343t65j8j787k8k
5; h67hgigjggjjonnmkcbldjjs
6; h67hgigjggjjonnmkcbldjjs

我不知道为什么会那样做。 尝试将foreach更改为while循环,显式整数计数为160,000,因此它不会比这更频繁地执行命令....仍然是相同的结果。 我是否以某种方式弄乱了数据库声明?

1 个答案:

答案 0 :(得分:1)

查看QSqlQuery::QSqlQuery ( const QString & query = QString(), QSqlDatabase db = QSqlDatabase() )方法文档:

  

如果查询不是空字符串,则会执行。

因此,如果为构造函数指定数据库,则会立即执行查询。之后你不应该致电exec。您可以使用QSqlQuery::isActive检查查询是否成功。

此外,我认为您应该为QSqlDatabase对象创建一个类成员,在init()中对其进行初始化并在db()中返回。它会更清楚,因为如果不阅读其文档,很难理解QSqlDatabase::database的作用。同样QSqlDatabase::database会产生一些小但不必要的开销。你不应该多次打电话。