Qt中MySQL数据库编程课件_第1页
Qt中MySQL数据库编程课件_第2页
Qt中MySQL数据库编程课件_第3页
Qt中MySQL数据库编程课件_第4页
Qt中MySQL数据库编程课件_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Qt中MySQL数据库编程Qt使用SQL 主要是下面的几个类 QSqlDatabase 建立于数据库的链接 QSqlQuery 用于执行SQL语句 QSqlTableModel 结合QTableView可以输出数据库的表贴下我写的简单Demo   cpp view plaincopyprint?1. QSqlDatabase db =QSqlDatabase:addDatabase("QMYSQL"); / becomes the new def

2、ault connection   2.     db.setUserName("root");/用户名   3.     db.setPassword("password");/密码   4.     db.setHostName("localhost");  5.     db.set

3、DatabaseName("test");/数据库名   6.     db.setConnectOptions("CLIENT_SSL=1;CLIENT_IGNORE_SPACE=1");/使用SSL   7.     db.setPort(3306);/端口   8.     if(db.open()  9.    

4、0;    qDebug()<<"open/n"<<db.lastError().driverText()<<"/n"  10.       11.     else  12.         qDebug()<<"open fai

5、le/n"  13.       14.     QSqlQuery query;/用于执行SQL语言   15.      query.exec("show databases");/很方便的   16.      while (query.next()  

6、 17.          qDebug()<<query.value(0).toString()<<"/n"  18.   19.       20.   21.     QSqlTableModel *model = new QSqlTableMode

7、l;/间接将数据库表装入QTableView   22.     model->setTable("people");   /表名   23.     model->setEditStrategy(QSqlTableModel:OnManualSubmit);  24.     model->select();  25. 

8、0;   /model->removeColumn(0); / don't show the ID   26.     /model->setHeaderData(0, Qt:Horizontal, QObject:tr("ID");   27.     model->setHeaderData(0, Qt:Horizon

9、tal, tr("Name");  28.     model->setHeaderData(1, Qt:Horizontal, tr("Age");  29.     model->setHeaderData(2, Qt:Horizontal, tr("Sex");  30.   31.   3

10、2.     QTableView *view = new QTableView(this);  33.     view->setModel(model);  34.   35.     db.close();  36.   37.     QGridLayout * g

11、l=new QGridLayout();  38.     gl->addWidget(view);  39.     this->setLayout(gl);  2、 下面是最终的现实效果如下:现在先做一个显示的界面,界面是由一个表格试图和三个按钮组成。我的大概流程是: <1>在对话框窗口先创建一个栅格布局管理器,添加一个表格视图窗口部件。<2>创建一个水平布局管理器,在水平布局管理器中添加三个按钮

12、,最后将水平布局管理器添加到栅格布局管理器中。<3>创建三个按钮的信号与槽<4>数据库的使用分为三步:(1)QsqlDatabase建立数据库的链接(2)QsqlQuery用于执行SQL语句(3)QsqlTableModel结合QtableView可以输出数据库的表。<5>效果测试点击connect按钮链接打开数据库 #include#include "table.h" int main(int argc,char *argv) QApplication app(argc,argv); Table *table = new Ta

13、ble; table->show(); return app.exec();#ifndef TABLE_H#define TABLE_H #include#includeclass QGridLayout;class QPushButton;class QHBoxLayout;class Table:public QDialog Q_OBJECT public: /继承公共对话框窗体派生类 Table(QWidget *parent = 0); /创建各个类的指针 QTableView *table; QGridLayout *gridLayout; QPushButton *conne

14、ctButton; QPushButton *executionButton; QPushButton *displayButton; QHBoxLayout *verticalLayout; private slots:/创建三个按钮槽函数 void on_connectButton_clicked(); void on_executionButton_clicked(); void on_displayButton_clicked(); ; #endif#include#include#include#include#include "table.h" Table:Ta

15、ble(QWidget *parent) :QDialog(parent)/创建视图及按钮的对象 table = new QTableView; connectButton = new QPushButton("connect"); executionButton = new QPushButton("execution"); displayButton = new QPushButton("display");/建立三个信号与槽函数链接 connect(connectButton,SIGNAL(clicked(),this,SLOT

16、(on_connectButton_clicked();  connect(executionButton,SIGNAL(clicked(),this,SLOT(on_executionButton_clicked(); connect(displayButton,SIGNAL(clicked(),this,SLOT(on_displayButton_clicked();/创建一个水平布局管理器,布局三个按钮 verticalLayout = new QHBoxLayout; verticalLayout->addWidget(connectButton); verticalL

17、ayout->addWidget(executionButton); verticalLayout->addWidget(displayButton);/创建一个栅格布局管理器对整体窗口部件的排布。 gridLayout = new QGridLayout; gridLayout->addWidget(table,0,0,1,1); gridLayout->addLayout(verticalLayout,1,0,1,1); setLayout(gridLayout);/设置窗口的大小 resize(500,400); void Table:on_connectButt

18、on_clicked()/链接函数实现数据库的链接功能 QSqlDatabase db = QSqlDatabase:addDatabase("QMYSQL"); /添加QMYSQL数据库驱动 db.setHostName("localhost"); /设置登陆的主机名为localhost db.setUserName("root"); /登陆的用户是超级用户 root db.setPassword("123456"); /登陆密码是123456 db.setDatabaseName("student&q

19、uot;); /打开的数据库表格,这个表格式预先创建好的。用>create database student;创建。 bool ok = db.open();/布尔类型,打开数据。 if(ok) /if判断 qDebug()<<"open Database!"<<endl;/如果打开数据库在终端输出open Database信息 else QMessageBox:critical(0,QObject:tr("Database Error"),db.lastError().text(); /否则输出数据库的消息框错误信息 vo

20、id Table:on_executionButton_clicked() /按executionButton按钮执行SQL语句 QSqlQuery query; /创建一个执行数据库SQL语句对象 query.exec("drop table employee");/如果存在employee数据库表格,先删除 query.exec("create table employee(id int(11) primary key,name varchar(50),description varchar(255)");/在创建数据库表格employee quer

21、y.exec("insert into employee values(1,'zhangsan','student')"); query.exec("insert into employee values(2,'lisi','teacher')"); query.exec("insert into employee values(3,'wangwu','professor')"); /插入三个记录 void Table:on_display

22、Button_clicked() /用数据库表格模式结合试图显示数据库内容。 QSqlTableModel *model = new QSqlTableModel; /创建数据表模式对象 model->setTable("employee"); /设置数据库表上的运作模式以employee表名,不选择从数据表格以外获取信息 model->setEditStrategy(QSqlTableModel:OnManualSubmit); /所有更改将被缓存在模型中,直到submitAll()或revertAll()函数被调用 model->select();/s

23、elect()函数用于确定一个或多个套接口的状态。对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息。 model->setHeaderData(0,Qt:Horizontal,QObject:tr("ID"); model->setHeaderData(1,Qt:Horizontal,QObject:tr("name"); model->setHeaderData(2,Qt:Horizontal,QObject:tr("description"); /对应指定的字段并设置对应的水平标题显示 table-&

24、gt;setModel(model); /将这个数据库表格模式用视图显示出来。  在关闭对话框后出现查询应用默认数据库连接错误:QSqlDatabasePrivate:removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.我googel以下,参照的内容测试,还是解决不了。在第二个按钮末尾添加下面的语句:QString name;        nam

25、e = QSqlDatabase:database().connectionName();QSqlDatabase:removeDatabase(name);On_executionButton_clicked()函数末尾添加,执行SQL语句后关闭窗口时有效的,但在on_displayButton_clicked()函数末尾添加却没有效。问题还在解决当中。Qt中MySQL数据库操作首先,要查询相关的驱动是否已经装好了,可以用以下的程序进行验证:#include <QtCore/QCoreApplication>#include <QSqlDatabase>#includ

26、e <QDebug>#include <QStringList>int main(int argc, char *argv)    QCoreApplication a(argc, argv);    qDebug()<<"Available drivers:"    QStringList drivers = QSqlDatabase:drivers();    foreach(QString driver, driv

27、ers)     qDebug() <<"/t" << driver;    return a.exec(); 结果如下: 接着是连接数据库:#include <QtGui/QApplication>#include <QtGui>#include <QtSql>bool createConnection()    QSqlDatabase db = QSqlDatabase:addDatabas

28、e("QMYSQL");    db.setDatabaseName("test");    db.setUserName("root");    db.setPassword("123456");    bool ok = db.open();    if(!ok)        QMessage

29、Box:critical(0, QObject:tr(" 连接数据库失败! "), db.lastError().text();        return false;    else        QMessageBox:information(0, QObject:tr("Tips"), QObject:tr(" 连接数据库成功! ");  

30、      return true;    int main(int argc, char *argv)    QApplication a(argc, argv);    QTextCodec *codec= QTextCodec:codecForName("GB2312");    QTextCodec:setCodecForLocale(codec);    QTextC

31、odec:setCodecForCStrings(codec);    QTextCodec:setCodecForTr(codec);    if(!createConnection()        return 1;    return a.exec(); 插入操作:/ODBC 数据库表示方式QSqlQuery query;query.prepare( “insert into student (id, name) ”&

32、#160;                 “values (:id, :name) ”);query.bindValue(0, 5);query.bindValue(1, “sixth ”);query.exec();  /Oracle 表示方式query.prepare( “insert into student (id, name) ”      &#

33、160;           “values (?, ?) ”);query.bindValue(0, 5);query.bindValue(1, “sixth ”);query.exec(); / 使用 addBindValue() 函数,省去了编号,它是按属性顺序赋值的query.prepare( “insert into student (id, name) ”          

34、        “values (?, ?) ”);query.addBindValue(5);query.addBindValue( “sixth ”);query.exec(); / 使用 ODBC 方法时,可以将编号用实际的占位符代替query.prepare( “insert into student (id, name) ”               &#

35、160;      “values (:id, :name) ”);query.bindValue( “:id ”, 5);query.bindValue( “:name ”, “sixth ”);query.exec();注意:最后一定要执行 exec() ,否则上面的语句是不会被执行的。  / 进行多个记录的插入时,可以利用绑定进行批处理QSqlQuery q;q.prepare( “insert into student values (?, ?) ”);QVariantList ints;ints <<

36、10 << 11 << 12 << 13;q.addBindValue(ints);QVariantList names;names << “xiaoming ” << “xiaoliang ” << “xiaogang ” << QVariant(QVariant:String);/ 最后一个是空字符串,应与前面的格式相同q.addBindValue(names);if (!q.execBatch() / 进行批处理,如果出错就输出错误      &

37、#160; qDebug() << q.lastError(); 查询操作: / 返回全部的属性和结果集 QSqlQuery query;query.exec( “select * from student ”);/ 执行查询操作qDebug() << “exec next() : ”;if(query.next()/ 开始就先执行一次next() 函数,那么query 指向结果集的第一条记录        int rowNum = query.at(); &#

38、160;      / 获取query 所指向的记录在结果集中的编号        int columnNum = query.record().count();        / 获取每条记录中属性(即列)的个数        int fieldNo = query.record().indexOf( “name ”); &#

39、160;      / 获取 ” name ”属性所在列的编号,列从左向右编号,最左边的编号为 0        int id = query.value(0).toInt();        / 获取id 属性的值,并转换为int 型       QString name = query.value(fieldNo).toString();

40、60;       / 获取name 属性的值        qDebug() << “rowNum is : ” << rowNum / 将结果输出                << ” id is : ” << id    &

41、#160;           << ” name is : ” << name                << ” columnNum is : ” << columnNum;qDebug() << “exec seek(2) : ”;if(query.seek(2)/ 定位到结果集

42、中编号为2 的记录,即第三条记录,因为第一条记录的编号为 0        qDebug() << “rowNum is : ” << query.at()                << ” id is : ” << query.value(0).toInt()     &#

43、160;          << ” name is : ” << query.value(1).toString();qDebug() << “exec last() : ”;if(query.last()/ 定位到结果集中最后一条记录        qDebug() << “rowNum is : ” << query.at()    

44、;            << ” id is : ” << query.value(0).toInt()                << ” name is : ” << query.value(1).toString(); 结果集其实就是查询到的所有记录的集合,而在QSql

45、Query 类中提供了多个函数来操作这个集合,需要注意这个集合中的记录是从 0 开始编号的。最常用的有:seek(int n) :query 指向结果集的第n 条记录。first() :query 指向结果集的第一条记录。last() :query 指向结果集的最后一条记录。next() :query 指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。previous() :query 指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。record() :获得现在指向的记录。value(int n) :获得属性的值。其中n 表示你查询的第n 个属性,比方上面我们使用 “ sel

46、ect * from student ”就相当于 “ select id, name from student ”,那么value(0) 返回id 属性的值,value(1) 返回name 属性的值。该函数返回QVariant 类型的数据,关于该类型与其他类型的对应关系,可以在帮助中查看QVariant 。at() :获得现在query 指向的记录在结果集中的编号。需要说明,当刚执行完query.exec( “select * from student ”); 这行代码时,query 是指向结果集以外的,我们可以利用query.next() ,当第一次执行这句代码时,query 便指向了结果集

47、的第一条记录。当然我们也可以利用seek(0) 函数或者first() 函数使query 指向结果集的第一条记录。但是为了节省内存开销,推荐的方法是,在query.exec( “select * from student ”); 这行代码前加上query.setForwardOnly(true); 这条代码,此后只能使用next() 和seek() 函数。  / 满足一定条件的结果集,方法一 QSqlQuery query;query.prepare( “select name from student where id = ? ”);int id =2; / 从

48、界面获取id 的值query.addBindValue(id); / 将id 值进行绑定query.exec();query.next(); / 指向第一条记录qDebug() << query.value(0).toString(); / 方法二QSqlQuery query;query. exec( QObject : tr( "select * from student where id = %1" ). arg( 2 );if (! query. next()       

49、qDebug()<< "none" ;else        qDebug()<< query. value( 0 ). toInt()<< query. value( 1 ). toString(); 事务是数据库的一个重要功能,所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。在Qt 中用transaction() 开始一个事务操作,用commit() 函数或rollback() 函数进行结束。commit()

50、表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到数据库,事务正常结束。rollback() 表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态。QSqlQuery query;if(QSqlDatabase:database().transaction() / 启动事务操作         / 下面执行各种数据库操作       

51、60;    query.exec( “insert into student values (14, hello) ”);      query.exec( “delete from student where id = 1 );            /            if(!QSqlD

52、atabase:database().commit()                      qDebug() << QSqlDatabase:database().lastError(); / 提交              

53、60;          if(!QSqlDatabase:database().rollback()                    qDebug() << QSqlDatabase:database().lastError(); / 回滚      

54、0;     / 输出整张表query.exec( “select * from student ”);while(query.next()     qDebug() << query.value(0).toInt() << query.value(1).toString();Qt 中使用了自己的机制来避免使用SQL 语句,它为我们提供了更简单的数据库操作和数据显示模型。它们分别是只读的QSqlQueryModel ,操作单表的QSqlTableModel 和以及可以支持外键的QS

55、qlRelationalTableModel / QSqlQueryModelQSqlQueryModel *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);

56、view->show();/QSqlTableModelQSqlTableModel *model;model = new QSqlTableModel(this);model->setTable( “student ”);model->setEditStrategy(QSqlTableModel:OnManualSubmit);model->select(); / 选取整个表的所有行/ model->removeColumn(1); / 不显示name 属性列 , 如果这时添加记录,则该属性的值添加不上ui->tableView->setModel(

57、model);/ ui->tableView->setEditTriggers(QAbstractItemView:NoEditTriggers);   / 使其不可编辑/ 过滤model->setFilter(QObject:tr(“name = %1 ”).arg(name); / 根据姓名进行筛选model->select(); / 显示结果/ 删除操作int curRow = ui->tableView->currentIndex().row();    / 获取选中的行model->remov

58、eRow(curRow);    / 删除该行int ok = QMessageBox:warning(this,tr( “删除当前行! ”),tr( “你确定 ”                                                           “删除当前行吗? ” ),

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论