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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема со вставкой записей в таблицу  (Прочитано 3275 раз)
kn0pka
Гость
« : Октябрь 18, 2008, 15:27 »

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

Код:
bool MdiChild::save()
{
    command = "delete from " + dbName + ";";
    QSqlQuery queryDelete (command);

    char sql[1024];       
    QList<DnDLabel *> labels = mapWidget->findChildren<DnDLabel *>();
    for (int i = 0; i < labels.size(); ++i) {
            char *data = labels.at(i)->ba.data();
 
            command = "INSERT INTO " + dbName + " VALUES (NULL, %d, %5.5f, %5.5f,%d,%d,%d,%d,'%s');";
            sprintf(sql,command,
            data[0],                  // device id
            labels.at(i)->val_x,    // point X
            labels.at(i)->val_y,    // point Y
            0,                           // angle
            data[1],                   // camera number
            data[2],                   // address number
            data[3],                   // cable number
            "");
            QSqlQuery querySave (sql);
     }
     return true;
}

Все хорошо в Windows, но не работает в Linux.

Пробовала сделать по-другому:

Код:
bool MdiChild::save()
{
    QSqlQuery queryDelete;
    command = "DELETE FROM " + dbName;
    queryDelete.exec(command);

    QList<DnDLabel *> labels = mapWidget->findChildren<DnDLabel *>();
   
    for (int i = 0; i < labels.size(); ++i)
    {
            QSqlQuery querySave;
            command = "INSERT INTO " + dbName + " (NUMBER, DEVICE_ID, VAL_X, VAL_Y, ANGLE, CAMERA_NUMBER, ADDRESS, \
CABLE, DESCRIPTION) VALUES (:NUMBER, :DEVICE_ID, :VAL_X, :VAL_Y, :ANGLE, :CAMERA_NUMBER, :ADDRESS, :CABLE, :DESCRIPTION)";
            querySave.prepare(command);
            char* data = labels.at(i)->ba.data();
            querySave.bindValue(":NUMBER", 0);
            querySave.bindValue(":DEVICE_ID", data[0]);
            querySave.bindValue(":VAL_X", labels.at(i)->val_x);
            querySave.bindValue(":VAL_Y", labels.at(i)->val_y);
            querySave.bindValue(":ANGLE", 0);
            querySave.bindValue(":CAMERA_NUMBER", data[1]);
            querySave.bindValue(":ADDRESS", data[2]);
            querySave.bindValue(":CABLE", data[3]);
            querySave.bindValue(":DESCRIPTION", "");
            querySave.exec();
    }
    return true;
}

В таблице после этого присутствует только одна запись Грустный
Что не так в этих способах и как это истправить?
« Последнее редактирование: Октябрь 18, 2008, 15:41 от pastor » Записан
Rcus
Гость
« Ответ #1 : Октябрь 18, 2008, 15:45 »

В общем эти способы не равнозначны(даже закрывая глаза на ересь sprintf при наличии QString::arg), ибо
Код:
To bind a NULL value, use a null QVariant; for example, use QVariant(QVariant::String) if you are binding a string.
А вообще может попробуете проверять результат запросов, например так:
http://www.prog.org.ru/index.php?topic=7834.msg40524#msg40524
Или глянуть в лог базы, и посмотреть DDL таблицы и связанных с ней ограничений, индексов и триггеров.
Записан
kn0pka
Гость
« Ответ #2 : Октябрь 18, 2008, 16:20 »

Спасибо большое, убрала "ересь", т.е. написала

Код:
bool MdiChild::save()
{
    command = "delete from " + dbName + ";";
    QSqlQuery queryDelete (command);

    QList<DnDLabel *> labels = mapWidget->findChildren<DnDLabel *>();
    for (int i = 0; i < labels.size(); ++i) {
        if ( labels.at(i)->objectName() != "disabled")
        {
            char *data = labels.at(i)->ba.data();
            QString id = QString::number(data[0]);
            QString point_X = QString::number(labels.at(i)->val_x);
            QString point_Y = QString::number(labels.at(i)->val_y);
            QString angle = QString::number(0);
            QString camera = QString::number(data[1]);
            QString address = QString::number(data[2]);
            QString cable = QString::number(data[3]);
            QString description = "";

            command = QString("INSERT INTO " + dbName + " VALUES (NULL, %1, %2, %3,%4,%5,%6,%7,'%8')")
.arg(id).arg(point_X).arg(point_Y).arg(angle).arg(camera).arg(address).arg(cable).arg(description);
            QSqlQuery querySave (command);
        }
    }
    return true;
}

и все стало хорошо Улыбающийся


Пользуйся тэгом КОД!!!
« Последнее редактирование: Октябрь 18, 2008, 16:27 от pastor » Записан
Rcus
Гость
« Ответ #3 : Октябрь 18, 2008, 16:29 »

*shrugs* мне кажется вы избавились от симптома, а не решили проблему (возможно проблема то простая, например partial unique index по not NUMBER is null).
/*с моей точки зрения второй вариант был правильнее/читабельнее, еще бы там вынести создание QSqlQuery и preparе из цикла*/
кстати метод QString::arg перегружен для всех возможных типов, так что смысл нет создавать строку под каждый параметр.
« Последнее редактирование: Октябрь 18, 2008, 16:32 от Rcus » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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