Russian Qt Forum
Ноябрь 23, 2024, 11:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Не работает запрос добавления строки в таблицу  (Прочитано 8763 раз)
lexflax
Гость
« : Январь 14, 2014, 15:34 »

Доброго времени суток...
Когда делаю запрос в таблицу так
Код:
QSqlQuery query;

query.exec("INSERT INTO  kod (kodsv,kodg,kodk)" "VALUES (23213,150200,1)");
то запрос добавляется...
Мне нужно чтоб пользователь выбирал что добавлять в таблицу, результаты выбора записываются в переменные типа String
но когда эти переменныеставлю взапрос он ничего не добавляет.... где делаю ошибку подскажите???
Код:
QString kodsv,kodg,KODK;
kodsv = ui->comboBox_3->currentText();
kodg = ui->comboBox_5->currentText();
KODK = ui->comboBox->currentText();
QSqlQuery query;

query.exec("INSERT INTO  kod (kodsv,kodg,kodk)" "VALUES (kodsv,kodg,1)");
Записан
VPS
Гость
« Ответ #1 : Январь 14, 2014, 15:42 »

Попробуйте использовать:
Код:
bool QSqlQuery::prepare ( const QString & query )
Записан
Serr500
Гость
« Ответ #2 : Январь 14, 2014, 17:00 »

Сам то понял, что написал?

Так надо:
Код:
QString kodsv,kodg,KODK;
kodsv = ui->comboBox_3->currentText();
kodg = ui->comboBox_5->currentText();
KODK = ui->comboBox->currentText();
QSqlQuery query;

QString S = QString("INSERT INTO  kod (kodsv,kodg,kodk) VALUES (%1,%2,%3)").arg(kodsv,kodg,KODK );

query.exec(S);

Это не perl, переменные в строках не интерполируются!
Записан
dio
Гость
« Ответ #3 : Январь 15, 2014, 09:46 »

Сам то понял, что написал?

Так надо:
Код:
QString kodsv,kodg,KODK;
kodsv = ui->comboBox_3->currentText();
kodg = ui->comboBox_5->currentText();
KODK = ui->comboBox->currentText();
QSqlQuery query;

QString S = QString("INSERT INTO  kod (kodsv,kodg,kodk) VALUES (%1,%2,%3)").arg(kodsv,kodg,KODK );

query.exec(S);

Это не perl, переменные в строках не интерполируются!

Так тоже работать не будет. Забыли обернуть значения в кавычки. К тому же, если СУБД кэширует запросы, то забьете кэш ненужными запросами.  Правильным решением будет использование связанных переменных.

Код:
QString kodsv,kodg,KODK;
kodsv = ui->comboBox_3->currentText();
kodg = ui->comboBox_5->currentText();
KODK = ui->comboBox->currentText();
QSqlQuery query;

QString S = QString("INSERT INTO  kod (kodsv,kodg,kodk) VALUES (:kodsv,:kodg,:kodk)");
query.prepare(S);
query.bindValue(":kodsv",QVariant(kodsv),QSql::In);
query.bindValue(":kodg",QVariant(kodg),QSql::In);
query.bindValue(":kodk",QVariant(KODK),QSql::In);
query.exec();
Записан
Bepec
Гость
« Ответ #4 : Январь 15, 2014, 10:21 »

Не соглашусь, dio.
Числовые значения не нуждаются в "обёртке". А тут как раз они и есть.

И что значит забить ненужными запросами?

А ваш приведённый код полный аналог кода Serr500. Просто по другому оператор развернули.
Записан
dio
Гость
« Ответ #5 : Январь 15, 2014, 11:01 »

Про числовые значения, действительно упустил. Смутила строка
Цитировать
QString kodsv,kodg,KODK;
Приведенный выше код работать будет. А вот то, что это аналогичный код, с этим не согласен. В моем случае используются связанные переменные, в этом случае интерпретатор SQL будет воспринимать команды с разными значениями как одну и туже (в кэш попадет только одна запись). В предыдущем же варианте, каждая команда уникальна и попадет в кэш запросов СУБД. Массовое выполнение подобных команд приведет к росту кэша и  вытеснению из кэша других команд, что существенно скажется на производительности системы в целом.         
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #6 : Январь 15, 2014, 11:06 »

2 Dio Далеко не каждая СУБД уметь работать с именованными параметрами запроса, возможно, лучше использовать позиционный параметр ? и обращаться при бинде по номеру позиции.
Записан
dio
Гость
« Ответ #7 : Январь 15, 2014, 11:26 »

Работа с СУБД  в Qt осуществляется через драйвер SQL. Он и разруливает как связывать переменные, по порядку или по имени. По имени - код наглядней, меньше возможностей ошибиться.
« Последнее редактирование: Январь 15, 2014, 11:31 от dio » Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #8 : Январь 15, 2014, 11:42 »

Это да, но после того, как пришлось убить почти день на поиск бага в программе, от такой практики я отказался. Весь фокус в том, что если при бинде перепутать порядок следования параметров запроса, то в базу может уйти что-то левое.
Записан
Bepec
Гость
« Ответ #9 : Январь 15, 2014, 12:02 »

Не знаю насчёт интерпретатора SQL и запросов, но для SQLITE и тот и этот запрос одинаковы.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #10 : Январь 15, 2014, 12:08 »

А что, кто-то всерьез рассматривает SQLite как полноценную СУБД?  Улыбающийся
Записан
dio
Гость
« Ответ #11 : Январь 15, 2014, 12:09 »

Hellraiser Да уж, неприятный баг. К счастью не сталкивался. А с какой СУБД и какая версия Qt?
Записан
carrygun
Гость
« Ответ #12 : Январь 15, 2014, 12:10 »

А что, кто-то всерьез рассматривает SQLite как полноценную СУБД?  Улыбающийся
В качестве локальной БД - очень хороший вариант.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #13 : Январь 15, 2014, 12:39 »

Hellraiser Да уж, неприятный баг. К счастью не сталкивался. А с какой СУБД и какая версия Qt?
Это было на 2007 Access`e, а кьют был, кажется, какой-то из 4.6 - давно это было, точно не помню. Но урок запомнился. Сейчас работаю с Постгресом, он тоже не поддерживает именованные параметры.
Записан
Bepec
Гость
« Ответ #14 : Январь 15, 2014, 12:58 »

В качестве переносимой базы sqlite идеален. Быстр, прост, возможно открытие в сотнях различных менеджерах, поддержка стандарта. Можно быстро перенести таблицы и запросы в другую субд.

Как то для Access писали, так потом переносить замучались Веселый Собственные параметры, функции. Ужас. Веселый
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.098 секунд. Запросов: 23.