Learning Qt 5! (15):数据库

Qt 学习之路 2(55):数据库操作
Qt 学习之路 2(56):使用模型操作数据库
Qt 学习之路 2(57):可视化显示数据库数据
Qt 学习之路 2(58):编辑数据库外键

批处理(如使用query.prepare()后)进行query.execBatch()而不是query.exec()非常重要!否则出错!!!

如果习惯于使用 SQL 语句,我们可以选择QSqlQuery类;如果只需要使用高层次的数据库接口(不关心 SQL 语法),我们可以选择QSqlTableModel和QSqlRelationalTableModel。

使用数据库相关的类要在.pro文件中加上QT += sql
看个connect()的代码:

//使用connect()函数创建一个数据库连接
bool connect(const QString &dbName)
{
    //创建了一个QSqlDatabase实例
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(dbName);
    //调用QSqlDatabase::open()函数打开这个数据库连接
    if (!db.open()) {
        QMessageBox::critical(0, QObject::tr("Database Error"),
                              db.lastError().text());
        /*QtSql 模块中的类大多具有lastError()函数,用于检查最新出现的错误。如果你发现
        数据库操作有任何问题,应该使用这个函数进行错误的检查。*/
        return false;
    }
    return true;
}

注意,数据库连接使用自己的名字进行区分,而不是数据库的名字。如果使用下面的语句:

QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE", QString("con%1").arg(dbName));

那么数据库连接的名字是QString(“conn%1”).arg(dbName),而不是 “QSQLITE”。如果不指定名字,系统会给出一个默认的名字QSqlDatabase::defaultConnection,此时,Qt 会创建一个默认的连接。如果指定的名字与已存在的名字相同,新的连接会替换掉已有的连接。通过这种设计,可以为一个数据库建立多个连接。

操作数据库:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //调用connect()函数打开数据库
    if (connect("demo.db")) {
        QSqlQuery query;
    /*注意这里的QSqlQuery实例的创建。我们并没有指定是为哪一个数据库连接创建查询对象,
    此时,系统会使用默认的连接,也就是使用没有第二个参数的addDatabase()函数创建的那个
    连接(其实就是名字为QSqlDatabase::defaultConnection的默认连接)。如果没有这么
    一个连接,系统就会报错。也就是说,如果没有默认连接,我们在创建QSqlQuery对象时必须
    指明是哪一个QSqlDatabase对象,也就是addDatabase()的返回值。*/
        if (!query.exec("CREATE TABLE student ("
                        "id INTEGER PRIMARY KEY AUTOINCREMENT,"
                        "name VARCHAR,"
                        "age INT)")) {
            QMessageBox::critical(0, QObject::tr("Database Error"),
                                  query.lastError().text());
            return 1;
        }
    } else {
        return 1;
    }
    return a.exec();
}

QSqlTableModel 类为单个数据库表提供了一个可编辑的数据模型(不能用该类去新建表)。
使用QSqlTableModel 进行 SELECT 操作:

if (connect("demo.db")) {
    QSqlTableModel model;
    /*创建了QSqlTableModel实例,使用setTable()函数设置所需要操作的表格;setFilter()
    函数则是添加过滤器,也就是 WHERE 语句所需要的部分*/
    model.setTable("student");
    model.setFilter("age > 20 and age < 25");
    if (model.select()) {
        for (int i = 0; i < model.rowCount(); ++i) {
            QSqlRecord record = model.record(i);
            QString name = record.value("name").toString();
            int age = record.value("age").toInt();
            qDebug() << name << ": " << age;
        }
    }
} else {
    return 1;
}

使用QSqlTableModel进行INSERT INTO操作:

QSqlTableModel model;
model.setTable("student");
int row = 0;
model.insertRows(row, 1);
model.setData(model.index(row, 1), "Cheng");
model.setData(model.index(row, 2), 24);
model.submitAll();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值