Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迭代QSqlQuery结果集的最有效方法?_C++_Sql Server_Qt_Odbc_Qtsql - Fatal编程技术网

C++ 迭代QSqlQuery结果集的最有效方法?

C++ 迭代QSqlQuery结果集的最有效方法?,c++,sql-server,qt,odbc,qtsql,C++,Sql Server,Qt,Odbc,Qtsql,我正在使用QODBC查询一个远程MSSQL服务器数据库,返回了一个结果集,但它似乎是针对每个记录逐个向SQL Server发送查询。这对于迭代结果集来说非常慢。从Qt运行查询,大约需要15秒才能完成。我在SQLServerManagementStudio中运行了相同的查询,返回结果需要1秒的时间。以下是我使用的代码: QString connectionTemplate = "DRIVER={SQL SERVER};SERVER=server;DATABASE=db;"; QSqlDatabas

我正在使用QODBC查询一个远程MSSQL服务器数据库,返回了一个结果集,但它似乎是针对每个记录逐个向SQL Server发送查询。这对于迭代结果集来说非常慢。从Qt运行查询,大约需要15秒才能完成。我在SQLServerManagementStudio中运行了相同的查询,返回结果需要1秒的时间。以下是我使用的代码:

QString connectionTemplate = "DRIVER={SQL SERVER};SERVER=server;DATABASE=db;";
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3", "db");
db.setDatabaseName(connectionTemplate);
db.setUserName("user");
db.setPassword("password");

if (db.open()) {
    qDebug() << "OK!";
    QSqlQuery * query = new QSqlQuery(db);
    query->exec("SELECT [UserName]"
                "  FROM [dbo].[Users]");


    while(query->next())
    {
        QString userName = query->value(0).toString();
        qDebug() << userName;
    }

    db.close();
}
else {
    qDebug() << db.lastError().text();
}
QString connectionTemplate=“DRIVER={SQL SERVER};SERVER=SERVER;DATABASE=db;”;
QSqlDatabase db=QSqlDatabase::addDatabase(“QODBC3”,“db”);
db.setDatabaseName(connectionTemplate);
db.setUserName(“用户”);
db.setPassword(“密码”);
if(db.open()){
qDebug()exec(“选择[用户名]”
“来自[dbo]。[用户]”;
while(查询->下一步())
{
QString用户名=查询->值(0).toString();

qDebug()我想出了如何提高迭代结果的速度。我忘记了我需要在执行之前首先准备sql,并且必须设置为true

QSqlQuery * query = new QSqlQuery(db);
query->setForwardOnly(true);
query->exec("SELECT [UserName]"
            "  FROM [dbo].[Users]");

我找到了如何提高迭代结果的速度。我忘记了在执行之前需要先准备sql,并且必须将setForwardOnly设置为true。有没有想过为什么使用setForwardOnly通过prepare’d query迭代20k条记录可能需要4秒钟?这与您的问题有点相关,所以我决定提问这里:)我想说,对于20k条记录来说,这是一个相当好的返回时间。这还取决于您是在执行SELECT语句,还是在执行其他复杂的子查询。通过将setForwardOnly设置为true,您可以大大提高查询性能。通过QtSql查询数据库的方式,使用setForwardOnly对tru进行查询更有效e表示SELECT语句。此外,无论发生什么情况,您都应该准备SQL查询,因为它有助于防止SQL注入。如果可以的话,我建议从现在开始编写一个REST API与数据库接口。我不再使用直接ODBC访问我的数据库。将数据层与访问层分离要容易得多ayer通过HTTP REST API。这允许更改数据库,而不必太多地更改底层API。我正在使用SqLite开发一个桌面应用程序。我想我已经解决了这个问题。
query.setForwardOnly(true);
根据文档,
prepare()
不是必需的。必需的是
setForwardOnly()
。但是,它可能因数据库而异,因此某种程度上,prepare可能对其中一些数据库有用。