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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите оптимизировать запись из контролов формы в базу данных SQLite  (Прочитано 2528 раз)
tumanovalex
Гость
« : Ноябрь 03, 2010, 19:33 »

Созданы 3 таблице в базе данных:
Код
SQL
CREATE TABLE [Object] (
[objid] INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,
[object] CHAR(40)  UNIQUE NULL
)
 
CREATE TABLE [Date] (
[dateid] INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,
[date] Date  UNIQUE NOT NULL
)
 
CREATE TABLE [DATA] (
[dataid] INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,
[time] TIME  NULL,
[param1] FLOAT  NULL,
[param2] FLOAT  NULL,
[param3] VARCHAR(10)  NULL,
[param4] VARCHAR(10)  NULL,
[note] VARCHAR(40)  NULL,
[objid] INTEGER NULL,
[dateid] INTEGER NULL,
FOREIGN KEY(objid) REFERENCES Object(objid),
FOREIGN KEY(dateid) REFERENCES Date(dateid)
)
В контролах формы выбираются дата и объект (название предприятия), в QTableWidget на форме вводятся значения времени и напряжения (в проекте для отладки я создаю нужные данные, чтобы каждый раз их не вводить). Нужно занести данные из QTableWidget в таблицу Data базы данных вместе с уникальными номерами выбранных в форме объекта  и даты. Сначала я проверяю наличие в таблицах Date и Object выбранных объекта и даты и запоминаю их уникальные номера:
Код
C++ (Qt)
query.prepare("SELECT objid, object FROM Object WHERE object = ?");
     query.addBindValue(ui->cbObj->currentText());
     if(!query.exec()) {
        QMessageBox::warning(this, "Error", "Query SELECT OBJECT fail!");
        qDebug() << query.lastError();
        return;
     }
     if(!query.next()) {
         QMessageBox::warning(this, "Error", "Write object in the base!");
         qDebug() << query.lastError();
         return;
     }
     nObj = query.value(0).toInt();
     qDebug() << nObj;
     query.prepare("SELECT dateid, date FROM Date WHERE date = ?");
     query.addBindValue(ui->dtAdd->date());
     if(!query.exec()) {
        QMessageBox::warning(this, "Error", "Query SELECT DATE fail!");
        qDebug() << query.lastError();
        return;
     }
     if(!query.next()) {
         QMessageBox::warning(this, "Error", "Write date in the base!");
         qDebug() << query.lastError();
         return;
    }
     nDate = query.value(0).toInt();
     qDebug() << nDate;
Затем мне нужно ввести в таблицу Data в поля time и param1 значения времени и напряжения из таблицы, а в поля objid и dateid уникальные номера объекта и даты (тем самым создавая отношение один ко многим между таблицами Date и Object и таблицей Data). Данные из таблицы я считываю:
Код
C++ (Qt)
     QTableWidget *tbl = ui->tblData;
    query.prepare("SELECT objid, object FROM Object WHERE object = ?");
     query.addBindValue(ui->cbObj->currentText());
     if(!query.exec()) {
        QMessageBox::warning(this, "Error", "Query SELECT OBJECT fail!");
        qDebug() << query.lastError();
        return;
     }
     if(!query.next()) {
         QMessageBox::warning(this, "Error", "Write object in the base!");
         qDebug() << query.lastError();
         return;
     }
     sObj = query.value(0).toString();
     qDebug() << sObj;
     query.prepare("SELECT dateid, date FROM Date WHERE date = ?");
     query.addBindValue(ui->dtAdd->date());
     if(!query.exec()) {
        QMessageBox::warning(this, "Error", "Query SELECT DATE fail!");
        qDebug() << query.lastError();
        return;
     }
     if(!query.next()) {
         QMessageBox::warning(this, "Error", "Write date in the base!");
         qDebug() << query.lastError();
         return;
    }
     sDate = query.value(0).toString();
     qDebug() << sDate;
     QTableWidget *tbl = ui->tblData;
     nRow = tbl -> rowCount();
     nCol = tbl -> columnCount();
     QString qr;
     for(i = 0; i < nRow; ++i) {
       qr = "INSERT INTO Data(time, param1, objid, dateid) VALUES (";
       for(j = 0; j < nCol; ++j)   {
         QTableWidgetItem *item = tbl->item(i, j);
         switch(j) {
           case 0:
             qr += '\'';
             qr += item->text();
             qr += QString(":00") + '\'' + ',';
             break;
           case 1:
             qr += item->text();
             qr += ',';
             break;
          }
       } //for j
       qr += sObj + ','+ sDate + ')';
       qDebug() << qr;
       if(!query.exec(qr)) {
          QMessageBox::warning(this, "Error", "Unable to insert data");
       }
     } // for i
     }
Данные записываются, но как я это делаю, мне не нравится:
- не нравится использование switch/case, поскольку для большего количества столбцов код будет разрастаться;
- большое количество кода для формирования запроса;
- да и вообще код выглядит очень коряво.
Подскажите, пожалуйста, как оптимальнее решить задачу записи данных из контролов формы в таблицу Data базы данных. Прикрепляю проект.
Записан
crossly
Гость
« Ответ #1 : Ноябрь 03, 2010, 21:45 »

для этих целей существуют QSqlTableModel QTableView и QDataWidgetMapper
Записан
tumanovalex
Гость
« Ответ #2 : Ноябрь 03, 2010, 22:43 »

А чем это лучше использования QTableWidget?
Записан
crossly
Гость
« Ответ #3 : Ноябрь 03, 2010, 22:46 »

да потому что tableWidget никаким образом не оптимизирован под работу с БД.... и вообще не рекомендуется к использованию (кстати самими тролями) кроме простых задач...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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