Russian Qt Forum

Qt => Базы данных => Тема начата: alim от Май 23, 2009, 18:12



Название: LineEdit
Отправлено: alim от Май 23, 2009, 18:12
Подскажите пож-та как считать цифры из LineEdit,чтобы в запросе указать число введенное пользователем?

QString text_win2  = lineEdit->text(),//bank
          text2_win2 = lineEdit2->text(),//country
          text3_win2 = lineEdit3->text(),//stock exchange
;
 query.exec("INSERT INTO Main VALUES('"+text_win2+"','"+text2_win2+"','"+text3_win2+"',число,");


Название: Re: LineEdit
Отправлено: sLiva от Май 23, 2009, 18:19
В зависимости от типа:

Код:
int QString::toInt(bool *ok = 0, int base = 10) const
float QString::toFloat(bool *ok = 0) const
double QString::toDouble(bool *ok = 0) const


Название: Re: LineEdit
Отправлено: break от Май 24, 2009, 01:11
лучше использовать строку для подготовки запроса и функцию arg();

Код:
QString sSelectQueryText = 
QString("select from WOMANS where (AGE > %1) and (AGE < %2) and (NAME = %3)").arg(18).arg(25).arg("SEXY");


Название: Re: LineEdit
Отправлено: Rcus от Май 24, 2009, 08:01
Код:
QString sSelectQueryText = 
QString("select from WOMANS where (AGE > %1) and (AGE < %2) and (NAME = %3)").arg(18).arg(25).arg("SEXY");
Из-за таких любителей динамического SQL вместо параметризации потом фиг статистику с базы соберешь... поубивал бы


Название: Re: LineEdit
Отправлено: ритт от Май 24, 2009, 08:48
Rcus, поясни, пожалуйста ))


Название: Re: LineEdit
Отправлено: Rcus от Май 24, 2009, 09:00
Rcus, поясни, пожалуйста ))

Есть у меня на работе база на оракле, к которой за много лет было написано разными людьми модулей разных, но анализ производительности усложняется тем, что не все знали о параметризации запросов, поэтому при анализе статистики вариации одного запроса всплывают несколько раз с разными "параметрами". Тогда анализ ограничен одним запросом (время выполнения, сложность etc), а самая интересная статистика в виде общего времени выполнения, количества запросов становится непригодной к использованию.


Название: Re: LineEdit
Отправлено: Karl-Philipp от Май 24, 2009, 10:53
Rcus, поясни, пожалуйста ))

Есть у меня на работе база на оракле, к которой за много лет было написано разными людьми модулей разных, но анализ производительности усложняется тем, что не все знали о параметризации запросов, поэтому при анализе статистики вариации одного запроса всплывают несколько раз с разными "параметрами". Тогда анализ ограничен одним запросом (время выполнения, сложность etc), а самая интересная статистика в виде общего времени выполнения, количества запросов становится непригодной к использованию.
то есть в посте break'a вместо констант ты хотел видеть переменные?


Название: Re: LineEdit
Отправлено: Rcus от Май 24, 2009, 11:01
Не совсем, я хотел сказать что параметризация запроса изменением текста запроса мешает анализу, даже если в отдельном случае параметры константы.


Название: Re: LineEdit
Отправлено: lit-uriy от Май 24, 2009, 11:30
Rcus, тыб выразился проще. Я так понимаю твой вариант prepare ...?


Название: Re: LineEdit
Отправлено: break от Май 24, 2009, 13:14
Да я на самом деле сам за параметризацию, по крайней мере когда это касается переменных, а вот когда я составляю запрос INSERT - и у меня еще не известно какие колонки будут вставляться - то через описанный способ. Но не все драйвера не всех баз для Qt поддерживают эту возм. поэтому предложил 100% рабочий вариант.

Исправляюсь:

Код:
QSqlQuery query;
query.prepare("select from WOMANS where (AGE > :AGE_MIN) and (AGE < :AGE_MAX) and (NAME = :NAME)");
query.bindValue(":AGE_MIN", 18);
query.bindValue(":AGE_MAX", 25);
query.bindValue(":NAME", "SEXY");
query.exec();


Название: Re: LineEdit
Отправлено: ритт от Май 24, 2009, 16:47
благодарствую, Rcus.
до сих пор не сталкивался с необходимостью собирать статистику с бд - потому выпада и не понял. теперь всё четко и ясно :)


Название: Re: LineEdit
Отправлено: mugabe от Май 25, 2009, 10:07
А здесь дело не только в статистике.

Например, два варианта:

Код
C++ (Qt)
QSqlQuery query;
for (int i = 0; i < 100000; i++) {
 query.exec(QString("insert into test (a, b) values (%1, %2)").arg(i).arg(i * 2));
}
 

Код
C++ (Qt)
QSqlQuery query;
 
query.prepare("insert into test (a, b) values (:a, :b)");
 
for (int i = 0; i < 100000; i++) {
 query.bindValue(":a", i);
 query.bindValue(":b", i * 2);
 query.exec();
}
 

делают одно и то же.
Но второй в некоторых (а может даже в большинстве) СУБД будет работать быстрее, т.к. подготовка запроса происходит всего один раз, а это не очень то дешевая операция.


Название: Re: LineEdit
Отправлено: DmP от Май 26, 2009, 06:14
Но второй в некоторых (а может даже в большинстве) СУБД будет работать быстрее, т.к. подготовка запроса происходит всего один раз, а это не очень то дешевая операция.
Если говорить о postgre, то будет предпочтительней говорить о третьем варианте, и писать параметры через вопросы, так как :a и :b все равно будут заменены на знаки вопроса.