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();