Название: Проблема со вставкой записей в таблицу
Отправлено: 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; } В таблице после этого присутствует только одна запись :( Что не так в этих способах и как это истправить?
Название: Re: Проблема со вставкой записей в таблицу
Отправлено: Rcus от Октябрь 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 таблицы и связанных с ней ограничений, индексов и триггеров.
Название: Re: Проблема со вставкой записей в таблицу
Отправлено: kn0pka от Октябрь 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; } и все стало хорошо :) Пользуйся тэгом КОД!!!
Название: Re: Проблема со вставкой записей в таблицу
Отправлено: Rcus от Октябрь 18, 2008, 16:29
*shrugs* мне кажется вы избавились от симптома, а не решили проблему (возможно проблема то простая, например partial unique index по not NUMBER is null). /*с моей точки зрения второй вариант был правильнее/читабельнее, еще бы там вынести создание QSqlQuery и preparе из цикла*/ кстати метод QString::arg перегружен для всех возможных типов, так что смысл нет создавать строку под каждый параметр.
|