Russian Qt Forum

Qt => Базы данных => Тема начата: lexflax от Январь 14, 2014, 15:34



Название: Не работает запрос добавления строки в таблицу
Отправлено: 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)");


Название: Re: Не работает запрос добавления строки в таблицу
Отправлено: VPS от Январь 14, 2014, 15:42
Попробуйте использовать:
Код:
bool QSqlQuery::prepare ( const QString & query )


Название: Re: Не работает запрос добавления строки в таблицу
Отправлено: Serr500 от Январь 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, переменные в строках не интерполируются!


Название: Re: Не работает запрос добавления строки в таблицу
Отправлено: dio от Январь 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();


Название: Re: Не работает запрос добавления строки в таблицу
Отправлено: Bepec от Январь 15, 2014, 10:21
Не соглашусь, dio.
Числовые значения не нуждаются в "обёртке". А тут как раз они и есть.

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

А ваш приведённый код полный аналог кода Serr500. Просто по другому оператор развернули.


Название: Re: Не работает запрос добавления строки в таблицу
Отправлено: dio от Январь 15, 2014, 11:01
Про числовые значения, действительно упустил. Смутила строка
Цитировать
QString kodsv,kodg,KODK;
Приведенный выше код работать будет. А вот то, что это аналогичный код, с этим не согласен. В моем случае используются связанные переменные, в этом случае интерпретатор SQL будет воспринимать команды с разными значениями как одну и туже (в кэш попадет только одна запись). В предыдущем же варианте, каждая команда уникальна и попадет в кэш запросов СУБД. Массовое выполнение подобных команд приведет к росту кэша и  вытеснению из кэша других команд, что существенно скажется на производительности системы в целом.         


Название: Re: Не работает запрос добавления строки в таблицу
Отправлено: Hellraiser от Январь 15, 2014, 11:06
2 Dio Далеко не каждая СУБД уметь работать с именованными параметрами запроса, возможно, лучше использовать позиционный параметр ? и обращаться при бинде по номеру позиции.


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


Название: Re: Не работает запрос добавления строки в таблицу
Отправлено: Hellraiser от Январь 15, 2014, 11:42
Это да, но после того, как пришлось убить почти день на поиск бага в программе, от такой практики я отказался. Весь фокус в том, что если при бинде перепутать порядок следования параметров запроса, то в базу может уйти что-то левое.


Название: Re: Не работает запрос добавления строки в таблицу
Отправлено: Bepec от Январь 15, 2014, 12:02
Не знаю насчёт интерпретатора SQL и запросов, но для SQLITE и тот и этот запрос одинаковы.


Название: Re: Не работает запрос добавления строки в таблицу
Отправлено: Hellraiser от Январь 15, 2014, 12:08
А что, кто-то всерьез рассматривает SQLite как полноценную СУБД?  :)


Название: Re: Не работает запрос добавления строки в таблицу
Отправлено: dio от Январь 15, 2014, 12:09
Hellraiser Да уж, неприятный баг. К счастью не сталкивался. А с какой СУБД и какая версия Qt?


Название: Re: Не работает запрос добавления строки в таблицу
Отправлено: carrygun от Январь 15, 2014, 12:10
А что, кто-то всерьез рассматривает SQLite как полноценную СУБД?  :)
В качестве локальной БД - очень хороший вариант.


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


Название: Re: Не работает запрос добавления строки в таблицу
Отправлено: Bepec от Январь 15, 2014, 12:58
В качестве переносимой базы sqlite идеален. Быстр, прост, возможно открытие в сотнях различных менеджерах, поддержка стандарта. Можно быстро перенести таблицы и запросы в другую субд.

Как то для Access писали, так потом переносить замучались :D Собственные параметры, функции. Ужас. :D


Название: Re: Не работает запрос добавления строки в таблицу
Отправлено: lexflax от Январь 17, 2014, 15:29
Доброго времени суток.
В таблицу Kod с полями
 kodsv integer NOT NULL,
 kodg integer NOT NULL,
 kodk integer NOT NULL
Нужно добавить информацию с комбобоксов...., 1 и 2 комбобокс содержат именно значения ключей kodsv,kodg, А вот 3 комбобокс наполняется названием квалификации а не кодом... в этом возникает сложность... так как для добавления мне нужен kodk...
Взять его можно из таблицы Kvalif которая имеет два поля
kodk integer NOT NULL, - нужный мне код!!!!!
namekvf text NOT NULL, - название которое пользователь выбирает в 3 комбобоксе!!
Сейчас код выглядит так...
Код:
QSqlQuery querys;

querys.prepare("INSERT INTO  kod (kodsv,kodg,kodk) VALUES ( :kodsv,:kodg,2)");
querys.bindValue(":kodsv", ui->comboBox_3->currentText());
     querys.bindValue(":kodg", ui->comboBox_5->currentText());

querys.exec();
Так все добавляет как надо) НОО!! Значение поля Kodk  я вписал вручную...
Моя задача получить kodk , зная значение namekvf...
Пробовал так... Но тогда вообще ничего не добавляется.... Посмотрите может подскажите варианты кодов , опробую...
Код:
void Form4::on_pushButton_clicked()
{

    QSqlQuery query;
    query.prepare("select kodk from kvalif where namekvf = :namekvf");
    query.bindValue(":kodsv", ui->comboBox_3->currentText());
    if (!query.exec())
    {
        QMessageBox::warning(0, "Error", query.lastError().text());
        qDebug()<< "ERROR: " << query.lastError().text();
        return;
    }
    else
    {
        QString kodk;
        while (query.next())
        {
           kodk =query.value(0).toString();
        }

QSqlQuery querys;

querys.prepare("INSERT INTO  kod (kodsv,kodg,kodk) VALUES ( :kodsv,:kodg,:kodk)");
querys.bindValue(":kodsv", ui->comboBox_3->currentText());
     querys.bindValue(":kodg", ui->comboBox_5->currentText());
querys.bindValue(":kodk",kodk);
querys.exec();
this->close();
}
 }


Название: Re: Не работает запрос добавления строки в таблицу
Отправлено: lexflax от Январь 17, 2014, 15:59
Все тема снята.... затупил капец как)))
Код:
void Form4::on_pushButton_clicked()
{
 
    QSqlQuery query;
    query.prepare("select kodk from kvalif where namekvf = :namekvf");
    query.bindValue(":namekvf", ui->comboBox->currentText()); В ЭТОЙ СТРОКЕ ЗНАЧЕНИЕ ПЕРЕПУТАЛ)))
    if (!query.exec())
    {
        QMessageBox::warning(0, "Error", query.lastError().text());
        qDebug()<< "ERROR: " << query.lastError().text();
        return;
    }
    else
    {
        QString kodk;
        while (query.next())
        {
           kodk =query.value(0).toString();
        }
 
QSqlQuery querys;
 
querys.prepare("INSERT INTO  kod (kodsv,kodg,kodk) VALUES ( :kodsv,:kodg,:kodk)");
querys.bindValue(":kodsv", ui->comboBox_3->currentText());
     querys.bindValue(":kodg", ui->comboBox_5->currentText());
querys.bindValue(":kodk",kodk);
querys.exec();
this->close();
}
 }


Название: Re: Не работает запрос добавления строки в таблицу
Отправлено: demal от Январь 22, 2014, 21:03
Смотря твои разные темы я понимаю, что ты используешь для отображения вьюху, но все остальное делаешь в рукопашную через прямые запросы.
Чего не работаешь через модель? ::) С ней кода будет меньше.
Combobox заполнишь просто:
QSqlTableModel model;
model.setTable("Имя таблицы");
combobox.setModel(model);
combobox.setModelColumn(номер столбца таблицы);
model.select();
Всё заполнено.
Как вставлять и удалять в таблице я тебя уже писал тебе