Поэтому одной из целей использования (и повторного использования) подготовленных операторов является то, что драйвер базы данных выполняет меньше работы. Исходя из Perl, я привык готовить SQL-запрос и хранить ссылку на этот подготовленный запрос, чтобы впоследствии я мог связать некоторые значения и выполнить запрос, при необходимости много раз.
С 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. я нашел этот, но я подозреваю, что это груз-культ, потому что зовет QSqlQuery::prepare("query")
более одного раза, фактически, но "query"
остается прежним (даже если QSqlQuery
объект другой). Это правда с некоторыми драйверами? Иначе чего мне не хватает? Как я должен повторно использовать подготовленные запросы?
Ошибка вашего компилятора не имеет ничего общего с повторным использованием QSqlQuery. Вы объявили MyMeth как const
? Удалить const
, это предотвращает вызов неконстантного bindValue ().
+ Изменить
void MyMeth(QString firstname, QString lastname) const;
в
void MyMeth(QString firstname, QString lastname);
Других решений пока нет …