Застрял в использовании prepare () и bindvalue () в c ++ Qt - PullRequest
2 голосов
/ 17 января 2010

Я написал SQL-запрос, основанный на Qt assistant, и он говорит, что вы можете использовать метод prepare() вместо exec(), тогда вы можете передать свой параметр с помощью двух методов, называемых:
bindvalue() и addbindvalue()

Вот фрагмент кода моей проблемы:

Query->prepare("SELECT ID , Row , Col FROM sometable WHERE Row = :row AND Col = :col");
Query->bindValue(":row" , __Row);
Query->bindValue(":col" ,__Col);
Query->exec();
qDebug("%s" , Query->executedQuery().toStdString().c_str());

вывод:

ВЫБЕРИТЕ ID, Row, Col ИЗ НЕКОТОРЫХ ГДЕ Row =? AND Col =?

а также я использовал другой предложенный способ:

Query->prepare("SELECT ID , Row , Col FROM sometable WHERE Row = :row AND Col = :col");
Query->addBindValue(0 , __Row);
Query->addBindValue(1 ,__Col);
Query->exec();
qDebug("%s" , Query->executedQuery().toStdString().c_str());

вывод:

ВЫБЕРИТЕ ID, Row, Col ИЗ НЕКОТОРЫХ ГДЕ Row =? AND Col =?

но когда я использую exec(), обычно он работает отлично и заменяет соответствующие значения вместо "?".

есть какое-нибудь объяснение по этому поводу? или я должен использовать обычный exec ()?

Ответы [ 3 ]

5 голосов
/ 17 января 2010

Сбой вызова exec ()? Поскольку то, что вы видите, может быть в порядке, так как в зависимости от того, какой сервер sql вы используете, привязка может выполняться сервером (например, Oracle). Согласно документации Qt, executeQuery: "В большинстве случаев эта функция возвращает ту же строку, что и lastQuery (). Если подготовленный запрос с заполнителями выполняется в СУБД, которая его не поддерживает, подготовка этого запроса эмулируется ". Поэтому, я думаю, если сервер поддерживает значения привязки, подготовка не будет эмулироваться, поэтому вы просто увидите запрос без замены заполнителей на реальные значения.

3 голосов
/ 17 января 2010

Это всего лишь предположение, но из http://qt.nokia.com/doc/4.6/qsqlquery.html я прочитал следующее:

Предупреждение : необходимо загрузить драйвер SQL и открыть соединение перед созданием QSqlQuery. Кроме того, соединение должно оставаться открытым, пока существует запрос; в противном случае поведение QSqlQuery не определено.

Открыто ли соединение в вашем случае?

0 голосов
/ 16 мая 2011

Вы можете попробовать это, если хотите, чтобы ваш запрос строился из подготовленных операторов:

qDebug("%s" , Query.lastQuery().toStdString().c_str());
...