• 5871阅读
  • 4回复

对QT DEMO的一个疑问!!! [复制链接]

上一主题 下一主题
离线wljfox
 
只看楼主 倒序阅读 楼主  发表于: 2008-11-05
— 本帖被 XChinux 执行加亮操作(2008-11-06) —
在QT DEMO中的SQL的Query Mode例子中有如下代码:

editablesqlmodel.cpp:

bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int /* role */)
{
    if (index.column() < 1 || index.column() > 2)
        return false;

    QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
    int id = data(primaryKeyIndex).toInt();

    clear();

    bool ok;
    if (index.column() == 1) {
        ok = setFirstName(id, value.toString());
    } else {
        ok = setLastName(id, value.toString());
    }
    refresh();
    return ok;
}

void EditableSqlModel::refresh()
{
    setQuery("select * from person");
    setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
    setHeaderData(1, Qt::Horizontal, QObject::tr("First name"));
    setHeaderData(2, Qt::Horizontal, QObject::tr("Last name"));
}

bool EditableSqlModel::setFirstName(int personId, const QString &firstName)
{
    QSqlQuery query;
    query.prepare("update person set firstname = ? where id = ?");
    query.addBindValue(firstName);
    query.addBindValue(personId);
    return query.exec();
}

bool EditableSqlModel::setLastName(int personId, const QString &lastName)
{
    QSqlQuery query;
    query.prepare("update person set lastname = ? where id = ?");
    query.addBindValue(lastName);
    query.addBindValue(personId);
    return query.exec();
}

这里修改数据表后,每次都必需重新打开query!  这效率也太低了点!
难道一定要用tablemodel来更新数据库么?
离线wljfox
只看该作者 1楼 发表于: 2008-11-05
只有自己顶了!
离线sbtree
只看该作者 2楼 发表于: 2008-11-05
只是一个例子而已,可以自己编写代码提高效率,例如批量修改,打开一次就可以了。另外有个问题就是,如果修改了多条记录,构造sql语句的时候可能会麻烦一些。这个例子给我的感觉是可靠性很高
windows 7 + VC++2008 + Qt4.5.2
离线wljfox
只看该作者 3楼 发表于: 2008-11-05
这种方法有点不可行吧,更改一下数据就必须重新打开表,太可怕了!
离线sbtree
只看该作者 4楼 发表于: 2008-11-05
当然对于大数据量的表来说,这种操作的确造成效率的问题。事情总是都有两面性的,适合自己的就是好的。
windows 7 + VC++2008 + Qt4.5.2
快速回复
限100 字节
 
上一个 下一个