Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Разработка баз данных _ Проблема со вставкой в таблицу

Автор: AD 7.11.2008, 11:11

Через 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 7.11.2008, 11:30

я как-то так делал:

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 7.11.2008, 11:52

Спасибо. Но, к сожалению, не помогло! :(

Автор: sploid 7.11.2008, 12:01

может там есть какие обязательные поля, а ты их не заполняешь?

Автор: AD 7.11.2008, 12:09

Цитата(sploid @ 7.11.2008, 12:01) *
может там есть какие обязательные поля, а ты их не заполняешь?

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

Да, с QSqlQuery запрос проходит удачно. Не понимаю, в чем ошибка-то? :(((

Автор: AD 7.11.2008, 13:22

Блин. Обнаружил что для последнего кода по каким-то причинам setValue не присваивает значения. В дебаггере вижу получаемую строку, где в VALUES выглядит таким образом:

VALUES(?, ?, ?, ?)


Почему. Почему не проходит это? в чем ошибки?

Автор: sploid 7.11.2008, 14:15

знаки вопроса заменяются значениями перед выполнением, а до этого ставятся нули.
http://doc.trolltech.com/4.4/qsqlquery.html
раздел "Binding values using positional placeholders (version 1)"

Автор: AD 7.11.2008, 14:25

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

Так и что? Я ведь в дебаггер залезаю во время выполнения....

Автор: Litkevich Yuriy 7.11.2008, 17:09

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

Автор: AD 7.11.2008, 17:14

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

Так в этом и весь интерес, чтобы как можно меньше менять ручками. Менять руками целый запрос через QSqlQuery немного муторно (дизайн базы меняется довольно часто) (конечно, это временное явление) - то изменяются связи между таблицами, то данные из одной таблицы уходят в другую. Хотелось сделать так, чтобы потом можно было менять только имена таблиц и если что, имена атрибутов (параметров, полей) этих таблиц.

Автор: Litkevich Yuriy 7.11.2008, 17:40

Цитата(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 7.11.2008, 17:55

Ясно. Жаль. Пока что придется запросами, значит, делать. Дело в том, что эу ХП мне самому придется править - большей производительности не будет. Потом, конечно, сделаю в виде ХП. Но пока пусть и так побудет!

Автор: hd_qt 7.11.2008, 21:12

У меня тоже QSqlTableModel не отображает (БД firebird). С QSQLITE работает, а с QIBASE нет. Это похоже уже баг.

Автор: AD 8.11.2008, 14:08

Цитата
У меня тоже QSqlTableModel не отображает (БД firebird). С QSQLITE работает, а с QIBASE нет. Это похоже уже баг.

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

Итак, выводы: проблема по не решена. Кто узнает верное/правильное решение, просьба сообщить и показать правильный результат! :)

Автор: hd_qt 9.11.2008, 20:16

AD, По пробуй написать таблицу в верхнем регистре букв.
model.setTable("DEVICELIST");
У меня все заработало))

Автор: AD 10.11.2008, 10:23

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

Не помогло. Причина, где-то глубже. Блин, ведь знаю, что "истина где-то рядом", а вот где? :unsure:

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)