Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Разработка баз данных _ Проблема с запросом SELECT.

Автор: bayah 7.6.2010, 15:13

Возможно я сошел с ума, но...

Есть таблица.



    QSqlQuery query;
    query.exec("CREATE TABLE DIST ("
               "CODE_D INTEGER PRIMARY KEY NOT NULL, "
               "NAME_D VARCHAR(20) UNIQUE NOT NULL"
               ");");


Таблица, к примеру, заполнена значениями:
CODE_D NAME_D

1 alpha
2 beta
3 gama

Дальше я делаю запрос:

        QString id = "1";
        QSqlQuery query;
        query.exec("SELECT NAME_D FROM DIST WHERE CODE_D = "+id+";");
        query.next();
        QString a = query.value(0).toString();


Если же пытаюсь сделать наоборот - по имени получить код, ничего не выходит:

        QString name = "beta";
        QSqlQuery query;
        query.exec("SELECT CODE_D FROM DIST WHERE NAME_D = "+name+";");
        query.next();
        QString a = query.value(0).toString();

query.next() возвращает false. Я что-то не понимаю видимо?

Автор: kibsoft 7.6.2010, 15:51

Цитата
query.exec("SELECT NAME_D FROM DIST WHERE CODE_D = "+id+";");
query.next();
QString a = query.value(0).toString();

query.next() попробуй заменить на query.first().

Автор: bayah 7.6.2010, 15:59

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

SELECT CODE_D FROM DIST WHERE NAME_D = 'beta'

Для этого в QT это должно было выглядеть так:

query.exec("SELECT CODE_D FROM DIST WHERE NAME_D = '"+name+"'");

Всем спасибо за внимание._)

Автор: MoPDoBoPoT 7.6.2010, 18:31

Цитата(bayah @ 7.6.2010, 16:59) *
query.exec("SELECT CODE_D FROM DIST WHERE NAME_D = '"+name+"'");

Лучше использовать QSqlQuery::prepare() + QSqlQuery::bindValue() + QSqlQuery::exec(), чем QString::arg() + QSqlQuery::exec().
При использовании подготовленных запросов:
- Исключается возможность SQL-инъекций
- Оптимизицация по скорости выполнения запроса на стороне СУБД (в случае, когда используются однообразные запросы - меняются только значения в условии WHERE), но это когда СУБД и драйвер поддерживают

Автор: Litkevich Yuriy 7.6.2010, 19:03

Цитата(MoPDoBoPoT @ 7.6.2010, 22:31) *
- Исключается возможность SQL-инъекций
это актуально только для случая, когда запрос формируется из пользовательского ввода, да и то не всюду. А в системах с произвольным открытым доступом

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)