QtSql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口,这个接口由利用Qt的模型视图结构将数据库与用户界面集成的一套类来支持。
QSqlDatabase创建连接数据库实例,一个QSqlDatabase的实例代表一个数据库的连接。QSqlQuery进行执行数据库语句。
Qt 提供了对不同数据库的驱动支持:
Driver Type | Description |
---|---|
QDB2 | IBM DB2 |
QIBASE | Borland InterBase Driver |
QMYSQL | MySQL Driver |
QOCI | Oracle Call Interface Driver |
QODBC | ODBC Driver (includes Microsoft SQL Server) |
QPSQL | PostgreSQL Driver |
QSQLITE | SQLite version 3 or above |
QSQLITE2 | SQLite version 2 |
QTDS | Sybase Adaptive Server |
下面通过代码,详细介绍一下Qt对数据库操作:
//连接数据库
bool connectDB()
{
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE", "project");
database.setHostName("localhost"); //数据库主机名
database.setDatabaseName("database.db"); //数据库名
database.setUserName("root"); //数据库用户名
database.setPassword("123456"); //数据库密码
// create connection
if (!database.open())
{
qDebug() << "Sqlite open fail" << endl;
return false;
}
return true;
}
//创建表
bool createTable()
{
QSqlQuery query(database);
QString strCreateTable = "create table student (id int primary key, name varchar(30), age int)";
if(!query.exec(strCreateTable))
{
qDebug()<<"init tb_error errot"<<query.lastError();
}
return true;
}
//插入数据
bool insertData()
{
QString stInsertData = "insert into student values (?, ?, ?)";
query.prepare(stInsertData);
query.addBindValue(1);
query.addBindValue("test_name");
query.addBindValue(18);
if(!query.exec())
{
qDebug()<<query.lastError();
}
return true;
}
//更新数据
bool updateData()
{
QString strUpdateData = "update student set name = :name where id = :id";
query.prepare(strUpdateData);
query.bindValue(":name", "myName");
query.bindValue(":id", 1);
if(!query.exec())
{
qDebug()<<query.lastError();
}
return true;
}
//查询所有数据
bool selectData()
{
QString strSelectData = "select * from student";
query.prepare(strSelectData);
if(!query.exec())
{
qDebug()<<query.lastError();
}
else
{
while(query.next())
{
qDebug() << query.value(0).toInt() << query.value(1).toString() << query.value(2).toInt();
}
}
return true;
}
//删除数据
bool deleteData()
{
QString strDeteleData = "delete from student where id = 1";
query.prepare(strDeteleData);
if(!query.exec())
{
qDebug()<<query.lastError();
}
return true;
}
//清空表
bool clearDBTable()
{
QString strClearDB = "delete from student";
query.prepare(strClearDB);
if(!query.exec())
{
qDebug()<<query.lastError();
}
return true;
}
//关闭数据库
bool closeDB()
{
database.close();
return true;
}
//删除数据库
bool deleteDB()
{
QFile::remove("database.db");
return true;
}
事务是数据库的一个重要功能,所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。
在Qt 中用transaction() 开始一个事务操作,用commit() 函数或rollback() 函数进行结束。
commit() :表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到数据库,事务正常结束。
rollback():表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态。
下面看一段使用事务操作数据库的代码:
bool deleteData()
{
if(QSqlDatabase::database().transaction()) // 启动事务操作
{
query.exec( “delete from student where id = 1 ″);
if(!QSqlDatabase::database().commit())
{
qDebug() << QSqlDatabase::database().lastError(); // 提交失败信息
if(!QSqlDatabase::database().rollback())
{
qDebug() << QSqlDatabase::database().lastError(); // 回滚 失败信息
}
}
}
return true;
}
Qt 提供了更简单的数据库操作和数据显示模型。它们分别是只读的QSqlQueryModel ,操作单表的QSqlTableModel 和以及可以支持外键的QSqlRelationalTableModel、
下面通过代码示例了解一下各模型使用:
//QSqlQueryModel
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("select * from student ");
model->setHeaderData(0, Qt::Horizontal, tr( "id "));
model->setHeaderData(1, Qt::Horizontal, tr( "name "));
QTableView *view = new QTableView;
view->setModel(model);
view->show();
//QSqlTableModel
QSqlTableModel *model = new QSqlTableModel(this);
model->setTable( "student ");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select(); // 选取整个表的所有行
model->removeColumn(1); // 不显示name 属性列 , 如果添加记录,则该属性的值添加不上
QTableView *view = new QTableView;
view->setModel(model);
view->show();
//QSqlRelationalTableModel
QSqlRelationalTableModel *model = new QSqlRelationalTableModel(this);
model->setEditStrategy(QSqlTableModel::OnFieldChange); // 属性变化时写入数据库
model->setTable( "student ");
model->setRelation(2,QSqlRelation( "course ", "id ", "name "));
// 将student 表的第三个属性设为course 表的id 属性的外键,并将其显示为course 表的name 属性的值
model->setHeaderData(0, Qt::Horizontal, QObject::tr( "ID "));
model->setHeaderData(1, Qt::Horizontal, QObject::tr( "Name "));
model->setHeaderData(2, Qt::Horizontal, QObject::tr( "Course "));
model->select();
QTableView *view = new QTableView;
view->setModel(model);
view->show();