• 9428阅读
  • 4回复

QT例子问题(关于SQL) [复制链接]

上一主题 下一主题
离线myx0001
 

只看楼主 倒序阅读 楼主  发表于: 2008-09-12
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
QT安装包的有关SQL的DEMO例子里,在视图上修改的数据并不能保存到数据库上。(关闭程序后,数据库还是返回到原样)。原因是程序每次打开数据库(createConnection()函数)都重新建表格和插入数据。如果我想保存我的数据,应该怎么修改??在实际使用的时候,表格应该只创建一次就好了吧?如果是,程序怎么判断表格是否存在呢?刚学习应用开发二个月,大家别见笑!!
createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if (!db.open()) {....... }
    QSqlQuery query;
    query.exec("create table person (id int primary key, "
                "firstname varchar(20), lastname varchar(20))");
    query.exec("insert into person values(101, 'Danny', 'Young')");
    query.exec("insert into person values(102, 'Christine', 'Holand')");
    query.exec("insert into person values(103, 'Lars', 'Gordon')");
    query.exec("insert into person values(104, 'Roberto', 'Robitaille')");
    query.exec("insert into person values(105, 'Maria', 'Papadopoulos')");
    return true;
}
离线myx0001

只看该作者 1楼 发表于: 2008-09-12
Cached Table Example这个例子就是这样的
#include <QtGui>
#include <QtSql>

#include "tableeditor.h"

TableEditor::TableEditor(const QString &tableName, QWidget *parent)
    : QDialog(parent)
{
    model = new QSqlTableModel(this);
    model->setTable(tableName);
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();

    model->setHeaderData(0, Qt::Horizontal, tr("ID"));
    model->setHeaderData(1, Qt::Horizontal, tr("First name"));
    model->setHeaderData(2, Qt::Horizontal, tr("Last name"));

    QTableView *view = new QTableView;
    view->setModel(model);

    submitButton = new QPushButton(tr("Submit"));
    submitButton->setDefault(true);
    revertButton = new QPushButton(tr("&Revert"));
    quitButton = new QPushButton(tr("Quit"));

    buttonBox = new QDialogButtonBox(Qt::Vertical);
    buttonBox->addButton(submitButton, QDialogButtonBox::ActionRole);
    buttonBox->addButton(revertButton, QDialogButtonBox::ActionRole);
    buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);

    connect(submitButton, SIGNAL(clicked()), this, SLOT(submit()));
    connect(revertButton, SIGNAL(clicked()), model, SLOT(revertAll()));
    connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));

    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addWidget(view);
    mainLayout->addWidget(buttonBox);
    setLayout(mainLayout);

    setWindowTitle(tr("Cached Table"));
}

void TableEditor::submit()
{
    model->database().transaction();
    if (model->submitAll()) {
        model->database().commit();
    } else {
        model->database().rollback();
        QMessageBox::warning(this, tr("Cached Table"),
                              tr("The database reported an error: %1")
                              .arg(model->lastError().text()));
    }
}
离线myx0001

只看该作者 2楼 发表于: 2008-09-15
怎么没人回答我的问题啊!我问得不好吗?
离线goldenalex

只看该作者 3楼 发表于: 2008-09-16
最后在sql语句结束的时候commit一下吧。。。
离线xuchen
只看该作者 4楼 发表于: 2009-04-28
把db.setDatabaseName(":memory:");语句中的:memory:换成name.db之类的文件名,然后在运行一次就可以生成name.db文件了,我估计:memory:是把文件存在内存里。
快速回复
限100 字节
 
上一个 下一个