2013-09-22 74 views
1

因此,使用(和重用)預準備語句的目的之一就是數據庫驅動程序執行的工作量較少。從Perl開始,我習慣於準備SQL查詢並存儲對準備查詢的引用,以便稍後可以綁定某些值並在必要時多次執行查詢。如何在QSqlQuery中重用預準備語句?

有了Qt C++(QT 5.1)我嘗試這樣做:

class MyClass { 
      [...] 
      QSqlDatabase db; 
      QSqlQuery insert_query; 
    }; 

    MyClass::MyClass() { 
      db = QSqlDatabase::addDatabase("QSQLITE"); 
      db.setDatabaseName("whatever"); 
      db.open(); 

      insert_query = QSqlQuery(db); 
      insert_query.prepare("insert into players (firstname, lastname) values(:firstname, :lastname)")); 
    } 

    void MyClass::MyMeth(QString firstname, QString lastname) { 
      insert_query.bindValue(":firstname", firstname); //COMPILE ERROR 
    } 

error: no matching member function for call to 'bindValue'

note: candidate function not viable: 'this' argument has type 'const QSqlQuery', but method is not marked const

但我想在準備好的查詢綁定MyClass的構造函數之外的新價值。我發現this,但我懷疑它是貨運邪教,因爲如果"query"保持不變(即使QSqlQuery對象不同),多次呼叫QSqlQuery::prepare("query")實際上是noop。這對某些司機是否屬實?否則,我錯過了什麼?我應該如何重用準備好的查詢?

回答

2

您的編譯器錯誤與QSqlQuery的重複使用無關。你是否宣佈MyMeth爲const?刪除const,它阻止了對非常量bindValue()的調用。

變化

void MyMeth(QString firstname, QString lastname) const; 

void MyMeth(QString firstname, QString lastname); 
+0

賓果!我錯過了這個,因爲我忘記了我在const繼承的重寫方法。我需要綁定另一個方法中的值來控制簽名。 – njahnke

相關問題