Qt对数据库操作

QtSql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口,这个接口由利用Qt的模型视图结构将数据库与用户界面集成的一套类来支持。
QSqlDatabase创建连接数据库实例,一个QSqlDatabase的实例代表一个数据库的连接。QSqlQuery进行执行数据库语句。
Qt 提供了对不同数据库的驱动支持:

Driver TypeDescription
QDB2IBM DB2
QIBASEBorland InterBase Driver
QMYSQLMySQL Driver
QOCIOracle Call Interface Driver
QODBCODBC Driver (includes Microsoft SQL Server)
QPSQLPostgreSQL Driver
QSQLITESQLite version 3 or above
QSQLITE2SQLite version 2
QTDSSybase 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(); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值