我使用QODBC查詢遠程MSSQL服務器數據庫,並且返回了一個結果集,但看起來好像它逐個向每個記錄發送查詢到SQL Server。迭代結果集的速度非常慢。從Qt運行查詢,大約需要15秒才能完成。我在SQL Server Management Studio中運行了相同的查詢,並且需要1秒才能返回結果。下面是我使用的代碼:最有效的方式來遍歷QSqlQuery結果集?
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();
}
有什麼辦法捕獲整個結果通過它在內存設置到內存和循環?我寧願不讓應用程序花費這麼長的時間來遍歷結果集。
我想出瞭如何提高迭代遍歷結果的速度。我忘記了我需要在執行之前先準備好sql,並且setForwardOnly必須設置爲true。 –
任何想法爲什麼通過setforwardonly通過prepare'd查詢迭代20k記錄可能需要4秒?這有點與你的問題有關,所以我決定在這裏問:) – Zeks
我會說這是20k記錄的相當不錯的返回時間。這也取決於你是在做SELECT語句還是在做其他複雜的子查詢。通過將setForwardOnly設置爲true,可以顯着提高查詢性能。通過QtSql查詢數據庫的方式,對於SELECT語句使用setForwardOnly爲true更有效。另外,無論如何,您應該始終準備您的SQL查詢,因爲它有助於防止SQL注入。 –