Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема со вставкой в таблицу
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Разработка баз данных
AD
Через SQL-запросы и QSQlQuery вставлять в таблицу данные удавалось, а вот с помощью QSqlTableModel почему-то нет. Кто знает, в чем ошибка?
/// Добавление серийного номера
bool AddSerialNumber::add()
{
    /// какие-то нужные действия
                /// получение значения modelID(int modelID)

    QSqlTableModel model;
    model.setTable("DeviceList");
    model.select();
    int row = model.rowCount();
    bool _j = model.insertRows(row, 1);
    model.setData(model.index(row, 0), element -> serialName);
    bool iu = model.submit();
    model.setData(model.index(row, 1), element -> secret);
    model.setData(model.index(row, 2), true);
    model.setData(model.index(row, 3), modelID);
    bool ins = model.submitAll();

    return ins;
}
sploid
я как-то так делал:
QSqlTableModel model;
model.setTable("DeviceList");
model.setEditStrategy(QSqlTableModel::OnManualSubmit);
model.select();
QSqlRecord rec = model.record( );
rec.setValue( "field1", val1 );
rec.setValue( "field2", val2 );
rec.setValue( "field3", val3 );
model.insertRecord( -1, rec );
model.submitAll( );

код не компилил, но идея думаю понятна
AD
Спасибо. Но, к сожалению, не помогло! :(
sploid
может там есть какие обязательные поля, а ты их не заполняешь?
AD
Цитата(sploid @ 7.11.2008, 12:01) *
может там есть какие обязательные поля, а ты их не заполняешь?

все заполняю. Попробую через query, если добавится, то значит в модели где-то ошибаюсь.

Да, с QSqlQuery запрос проходит удачно. Не понимаю, в чем ошибка-то? :(((
AD
Блин. Обнаружил что для последнего кода по каким-то причинам setValue не присваивает значения. В дебаггере вижу получаемую строку, где в VALUES выглядит таким образом:
VALUES(?, ?, ?, ?)


Почему. Почему не проходит это? в чем ошибки?
sploid
знаки вопроса заменяются значениями перед выполнением, а до этого ставятся нули.
http://doc.trolltech.com/4.4/qsqlquery.html
раздел "Binding values using positional placeholders (version 1)"
AD
Цитата(sploid @ 7.11.2008, 14:15) *
знаки вопроса заменяются значениями перед выполнением, а до этого ставятся нули.
http://doc.trolltech.com/4.4/qsqlquery.html
раздел "Binding values using positional placeholders (version 1)"

Так и что? Я ведь в дебаггер залезаю во время выполнения....
Litkevich Yuriy
AD, а зачам ты вообще табличную модель (QSqlTableModel) руками трогаешь? Соедени с представлением и пусть пользователь данные в представление вводит, если надо руками то и пользуй модель запросов (QSqlQuery)
AD
Цитата(Litkevich Yuriy)
AD, а зачам ты вообще табличную модель (QSqlTableModel) руками трогаешь? Соедени с представлением и пусть пользователь данные в представление вводит, если надо руками то и пользуй модель запросов (QSqlQuery)

Так в этом и весь интерес, чтобы как можно меньше менять ручками. Менять руками целый запрос через QSqlQuery немного муторно (дизайн базы меняется довольно часто) (конечно, это временное явление) - то изменяются связи между таблицами, то данные из одной таблицы уходят в другую. Хотелось сделать так, чтобы потом можно было менять только имена таблиц и если что, имена атрибутов (параметров, полей) этих таблиц.
Litkevich Yuriy
Цитата(AD @ 7.11.2008, 20:14) *
Так в этом и весь интерес, чтобы как можно меньше менять ручками. Менять руками целый запрос через QSqlQuery немного муторно
ни какой логики, менять запрос или изголятся руками шурудить в табличной модели.

Цитата(AD @ 7.11.2008, 20:14) *
(дизайн базы меняется довольно часто)
ну и что, вызывай Хранимую Процедуру (ХП), а дезайнеры БД пусть сделают тебе эту ХП, а сами внутри что угодно делают.

Я третью неделю измываюсь над своей БД, а прогу не менял, делает она такую штуку:
/*    Обертка к ХП P_APPENDDATA.
*/
bool Controller::procAppendData(int port, int addr, int framefield, int value)
{
  QSqlDatabase    db = QSqlDatabase::database();
  QSqlQuery        q(db);
  QString        qstr;
  bool            ok;  

    q.setForwardOnly(true);

    db.transaction();

    q.prepare("EXECUTE PROCEDURE P_APPENDDATA(:port, :addr, :framefield, :value)");
    q.bindValue(":port", port);
    q.bindValue(":addr", addr);
    q.bindValue(":framefield", framefield);
    q.bindValue(":value", value);
    
    ok = q.exec();
    if (!ok)
    {
        qDebug() << "procAppendData, query ERROR............" << q.lastError();
        db.rollback();
        return ok;
    }
    ok = q.isActive();

    db.commit();
    
    return ok;

}
AD
Ясно. Жаль. Пока что придется запросами, значит, делать. Дело в том, что эу ХП мне самому придется править - большей производительности не будет. Потом, конечно, сделаю в виде ХП. Но пока пусть и так побудет!
hd_qt
У меня тоже QSqlTableModel не отображает (БД firebird). С QSQLITE работает, а с QIBASE нет. Это похоже уже баг.
AD
Цитата
У меня тоже QSqlTableModel не отображает (БД firebird). С QSQLITE работает, а с QIBASE нет. Это похоже уже баг.

Я бы не был столь категоричен на счет бага. Баг есть в версии 4.4.0, сказали на англоязычном форуме по Qt. Какая причина здесь, пока неясно.

Итак, выводы: проблема по не решена. Кто узнает верное/правильное решение, просьба сообщить и показать правильный результат! :)
hd_qt
AD, По пробуй написать таблицу в верхнем регистре букв.
model.setTable("DEVICELIST");
У меня все заработало))
AD
Цитата(hd_qt @ 9.11.2008, 20:16) *
AD, По пробуй написать таблицу в верхнем регистре букв.
model.setTable("DEVICELIST");
У меня все заработало))

Не помогло. Причина, где-то глубже. Блин, ведь знаю, что "истина где-то рядом", а вот где? :unsure:
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2021 IPS, Inc.