Автор: 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-инъекций
это актуально только для случая, когда запрос формируется из пользовательского ввода, да и то не всюду. А в системах с произвольным открытым доступом