Созданы 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 базы данных. Прикрепляю проект.