crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Проблема с запросом SELECT., Не возвращается результат запроса, хотя должен бы...
bayah
  опции профиля:
сообщение 7.6.2010, 15:13
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 23.11.2009
Пользователь №: 1249

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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



    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
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

Спасибо сказали: 14 раз(а)




Репутация:   2  


Цитата
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
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 23.11.2009
Пользователь №: 1249

Спасибо сказали: 0 раз(а)




Репутация:   0  


Все ясно, разобрались.
Проблема была в том что строка запроса должна была выглядеть так:
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
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Цитата(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
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 13:10