270 likes | 401 Views
嵌入式应用软件开发. www.gdsdxy.cn. Qt 4 与 MySQL 数据库编程. #include<QtSql> Qt4 中提供了 QtSql 模块。 为访问数据库提供了平台和相应的接口 提供模型视图体系,来完成可视化的信息输入 必须在 .pro 文件中加上: Qt += sql. Qt4 连接数据库过程. Qt SQL 模块中连接并处理数据库被分成三个层次。 第一层是数据库的驱动程序。 第二层是数据库的连接层。实现对数据库的连接,对数据库操作结果、错误信息的进行处理。 第三层是用户接口层。提供了一套模型视图体系来完成对数据库的可视化操作。.
E N D
嵌入式应用软件开发 www.gdsdxy.cn Qt 4与MySQL数据库编程
#include<QtSql> Qt4中提供了QtSql模块。 为访问数据库提供了平台和相应的接口 提供模型视图体系,来完成可视化的信息输入 必须在.pro文件中加上:Qt += sql Qt4连接数据库过程
Qt SQL模块中连接并处理数据库被分成三个层次。 第一层是数据库的驱动程序。 第二层是数据库的连接层。实现对数据库的连接,对数据库操作结果、错误信息的进行处理。 第三层是用户接口层。提供了一套模型视图体系来完成对数据库的可视化操作。 Qt4连接数据库过程
Qt4中为多种数据库提供了本地驱动程序,见下表:Qt4中为多种数据库提供了本地驱动程序,见下表: Qt4连接数据库过程
#include <QSqlDatabase> 用QSqlDatabase类通过驱动程序建立起和数据库的连接 设置hostName,databaseName,username,password等属性 打开数据库 操作数据库 关闭数据库 Qt4与MySQL数据库的连接
QSqlDatabase db = QSqlDatabase::addDatabase(“QMYSQL”); db.setHostName(“localhsot”); db.setDatabaseName(“testmysql.db”); db.setUserName(“user”); db.setPassword(“password”); if(!db.open()) { QMessageBox::critical(0,"cannot open database","Unabel to connect",QMessageBox::Cancel); } Qt4与MySQL数据库的连接
用QSqlQuery对象来执行SQL命令来对数据库操作。 QSqlQuery类中提供了多个函数来操作结果集。 QSqlQuery query; query.exec(“SELECT * FROM teacher”); exec()方法执行之后,能够获得相应的执行结果集,集合记录从0开始编号。 first():指向结果集的第一条记录。 last():指向结果集的最后一条记录。 next():指向下一条记录,每执行一次便指向相邻的下一条记录。 previous():指向上一条记录,每执行一次便指向相邻的上一条记录 seek(int n):指向结果集第n条记录。 record():获得现在指向的记录。 对数据库的操作-SQL语句
通过next()方法来指定结果集的第一条记录,依次访问后续的记录,直到最后一条记录,next()方法返回false。如果查询失败或者查询的结果集为空,那么next()返回值也为false。通过next()方法来指定结果集的第一条记录,依次访问后续的记录,直到最后一条记录,next()方法返回false。如果查询失败或者查询的结果集为空,那么next()返回值也为false。 while(query.next()) { //获取query所指向的记录在结果集中的编号 qDebug("rowNum is:%d",query.at()); //获取id属性的值,并转换成int型 qDebug("id is:%d",query.value(0).toInt()); } 对数据库的操作-SQL语句
在SQL语句中使用变量 prepare()函数,利用”:id”和”:name”代替具体的数据 bindValue()函数给id,name赋值,为绑定操作,可以将用编号或实际的字段名代替。如: query.prepare("insert into student(id,name) values(:id,:name)"); query.bindValue(":id",4); query.bindValue(":name","stu4"); query.exec(); 对数据库的操作-SQL语句
当要进行多条记录的操作时,可以利用绑定进行批操作当要进行多条记录的操作时,可以利用绑定进行批操作 QSqlQuery query; QVariantList ints; QVariantList names; query.prepare("insert into student values(?,?)"); ints<<5<<6; names<<"stu5"<<"stu6”; query.addBindValue(ints); query.addBindValue(names); query.execBatch(); 对数据库的操作-SQL语句
Qt中提供了模型类和模型/视图框架,使用这些模型,用户设置完成对数据库的SQL语句,自动的向视图表中添加数据,可视化的操作数据库。Qt提供了三种SQL模型。Qt中提供了模型类和模型/视图框架,使用这些模型,用户设置完成对数据库的SQL语句,自动的向视图表中添加数据,可视化的操作数据库。Qt提供了三种SQL模型。 (1)QSqlQueryModel:为SELECT SQL语句结果集提供只读数据模型 (2)QSqlTabelModel:为单个数据库表提供可编辑的数据模型。 (3)QSqlRelationModel:为单个数据库表提供可编辑的数据模型,同时可以和其他数据库表产生关联。 Qt4中SQL模型
QSqlQueryModel QSqlQueryModel 模型创建一个实例对象,用setQuery方法设定查询条件,把查询的结果通过一个视图(QTableView)表显示出来。 #include<QSqlQueryModel> #include<QTableView> QSqlQueryModel *model = new QSqlQueryModel(); model->setQuery(“SELECT ID, name FROM teacher”); QTableView *view = new QTableView(); view->setModel(model); view->show();
QSqlQueryModel例子 static bool createtable() { QSqlQuery query; query.exec("create table student (id integer primary key,name varchar(10))"); query.exec("insert into student values(1,'stu1')"); query.exec("insert into student values(2,'stu2')"); query.exec("insert into student values(3,'stu3')"); return true; }
QSqlQueryModel例子 static bool createconnect() { QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("test.db"); if(!db.open()) { QMessageBox::critical(0,"cannot open database","Unabel to connect",QMessageBox::Cancel); return false; } createtable(); return true; }
QSqlQueryModel例子 int main(int argc, char *argv[]) { QApplication a(argc, argv); createconnect(); Widget w; w.show(); return a.exec(); }
QSqlQueryModel例子 Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); Initdata(); } void Widget::Initdata() { this->model = new QSqlQueryModel(0); this->model->setQuery("select * from student"); this->model->setHeaderData(0,Qt::Horizontal,tr("id")); this->model->setHeaderData(1,Qt::Horizontal,tr("name")); this->ui->tableView->setModel(model); this->ui->tableView->show(); }
QSqlTableModel 为单个数据库表提供可编辑的数据模型。 常用功能:修改、插入、删除、查询和排序 使用该类可以完全脱离SQL语句。 包括头文件#include"QSqlTableModel" 初始化QSqlTableModel QSqlTableModel *model=new QSqlTableModel(); model=new QSqlTableModel(); model->setTable("appliance"); model->setEditStrategy(QSqlTableModel::OnManualSubmit); model->select(); ui->tableView->setModel(model);
QSqlTableModel-增加操作 model->setEditStrategy(QSqlTableModel::OnManualSubmit); 上述表示手动修改提交之后,才能生效。 例子:增加一条空记录 void Widget::on_Button_add_clicked() { int row=this->model->rowCount(); this->model->insertRow(row); }
void Widget::on_Button_Edit_clicked() { this->model->database().transaction(); int ok = QMessageBox::question(this,tr("提示"),tr("确定修改吗?"),QMessageBox::Yes|QMessageBox::No); if(ok == QMessageBox::Yes) { this->model->submitAll(); } this->model->revertAll(); } QSqlTableModel-修改操作
QSqlTableModel-修改操作 submitAll())表示提交所有待定的操作。 revertAll()表示恢复/撤销所有待定的操作。 如果出现中文乱码的情况,解决方法为: 在main()函数中加入 QTextCodec::setCodecForTr(QTextCodec::codecForName(“GB18030”)); 需要包含头文件 #include"QTextCodec"
QSqlTableModel-修改操作 QSqlTabelModel模型可以将所有修改先保存到model中,只有当执行事务操作的model->database().commit()后,才会真正写入数据库。 需要在QSqlTableModel初始化时,设定 model->setEditStrategy(QSqlTableModel::OnManualSubmit); OnManualSubmit 表明我们要提交修改才能使其生效。
QSqlTableModel-删除操作 void Widget::on_Button_delete_clicked() { int currentRow = ui->tableView->currentIndex().row(); //获取选中的行 this->model->removeRow(currentRow); //删除该行 int ok = QMessageBox::warning(this,tr("Delete?"),tr("确认删除?"),QMessageBox::Yes|QMessageBox::No); if(ok = QMessageBox::Yes) this->model->submitAll();//提交并删除数据库中该记录 else this->model->revertAll();//撤销该操作 }
QSqlTableModel-查询操作 //点击查询按钮,按照编辑框的内容进行模块查询 void Widget::on_Button_select_clicked() { QString applianceName = ui->Edit_search->text(); //根据姓名进行查询 this->model->setFilter(tr("name='%1'").arg(applianceName)); this->model->select(); ui->tableView->setModel(this->model); }
QSqlTableModel-排序操作 •使用setSort()函数进行排序,它有两个参数,第一个参数表示按第几个属性排序,表头从左向右,最左边是第0个属性(eg:id);第二个参数是排序方法,有升序和降序两种。 •代码示例: void TableModel::on_pushButton_5_clicked() { model->setSort(0,Qt::AscendingOrder); //id属性,即第0列,升序排列 model->select(); } //降序排列如下: model->setSort(0,Qt::DescendingOrder);
QSqlTableModel QSqlTableModel与QSqlQueryModel的区别与联系: 1.QSqlQueryModel中的操作在QSqlTableModel中可以同样执行; 2.完全脱离了SQL语句,就算你不怎么懂数据库,也可以利用它进行大部分常用的操作; 3.这个模型提供了缓冲区,可以先将修改保存起来,当我们执行提交函数时,再去真正地修改数据库。
QSqlRelationTableModel QSqlRelationTableModel和QSqlTableModel类似,不同于QSqlTableModel 的是,增加了数据库中不同表之间的联系,该模型使得不同表的信息通过它们之间的联系可以在一个视图中表现出来。 用setRelation(int,QSqlRelation)方法可建立不同表之间的联系。 QSqlRelation有三个参数。第一个参数是要关联的表名;第二个参数是关联的字段,也就是两个表中共同的字段;第三个参数是关联表中要加入关联字段。
QSqlRelationTableModel QSqlRelationalTableModel *model=new QSqlRelationalTableModel(); model->setTable("teacher"); model->setRelation(0,QSqlRelation("salary","ID","pay")); model->select(); model->setHeaderData(0,Qt::Horizontal,QObject::tr("pay")); model->setHeaderData(1,Qt::Horizontal,QObject::tr("xingming")); model->setHeaderData(2,Qt::Horizontal,QObject::tr("xingbie")); QTableView *view=new QTableView(); view->setModel(model); view->show(); 有teacher和salary两个数据库表,将teacher表中第0个属性设为salary表ID属性的外键,两个表之间通过这个字段建立起联系;通过ID,表teacher把表salary中的pay字段关联进表teacher中。