2012-07-04 536 views
4

我使用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(); 
} 

有什麼辦法捕獲整個結果通過它在內存設置到內存和循環?我寧願不讓應用程序花費這麼長的時間來遍歷結果集。

+0

我想出瞭如何提高迭代遍歷結果的速度。我忘記了我需要在執行之前先準備好sql,並且setForwardOnly必須設置爲true。 –

+0

任何想法爲什麼通過setforwardonly通過prepare'd查詢迭代20k記錄可能需要4秒?這有點與你的問題有關,所以我決定在這裏問:) – Zeks

+0

我會說這是20k記錄的相當不錯的返回時間。這也取決於你是在做SELECT語句還是在做其他複雜的子查詢。通過將setForwardOnly設置爲true,可以顯着提高查詢性能。通過QtSql查詢數據庫的方式,對於SELECT語句使用setForwardOnly爲true更有效。另外,無論如何,您應該始終準備您的SQL查詢,因爲它有助於防止SQL注入。 –

回答

5

我想出瞭如何提高迭代遍歷結果的速度。我忘記了我需要在執行之前先準備好sql,並且setForwardOnly必須設置爲true。

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

修改過的代碼是什麼樣的? – Assimilater

+0

如果可以的話,我會建議編寫一個REST API來與這個數據庫接口。我不再使用對數據庫的直接ODBC訪問。通過HTTP REST API將數據層從訪問層中解耦出來要容易得多。這允許更改數據庫,而不必更改基礎API太多。 –

+1

我正在使用SqLite處理桌面應用程序。我想我已經明白了。 'query.setForwardOnly(true);' – Assimilater