Qt中MySQL数据库编程.docx
- 文档编号:4042831
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:17
- 大小:37.14KB
Qt中MySQL数据库编程.docx
《Qt中MySQL数据库编程.docx》由会员分享,可在线阅读,更多相关《Qt中MySQL数据库编程.docx(17页珍藏版)》请在冰豆网上搜索。
Qt中MySQL数据库编程
Qt中MySQL数据库编程
Qt使用SQL
主要是下面的几个类
QSqlDatabase建立于数据库的链接
QSqlQuery用于执行SQL语句
QSqlTableModel结合QTableView可以输出数据库的表
贴下我写的简单Demo
[cpp]viewplaincopyprint?
1.QSqlDatabase db =QSqlDatabase:
:
addDatabase("QMYSQL"); // becomes the new default connection
2. db.setUserName("root");//用户名
3. db.setPassword("password");//密码
4. db.setHostName("localhost");
5. db.setDatabaseName("test");//数据库名
6. db.setConnectOptions("CLIENT_SSL=1;CLIENT_IGNORE_SPACE=1");//使用SSL
7. db.setPort(3306);//端口
8. if(db.open()){
9. qDebug()<<"open/n"< 10. } 11. else{ 12. qDebug()<<"open faile/n"; 13. } 14. QSqlQuery query;//用于执行SQL语言 15. query.exec("show databases");//很方便的 16. while (query.next()) { 17. qDebug()< 18. 19. } 20. 21. QSqlTableModel *model = new QSqlTableModel;//间接将数据库表装入QTableView 22. model->setTable("people"); //表名 23. model->setEditStrategy(QSqlTableModel: : OnManualSubmit); 24. model->select(); 25. //model->removeColumn(0); // don't show the ID 26. //model->setHeaderData(0, Qt: : Horizontal, QObject: : tr("ID")); 27. model->setHeaderData(0, Qt: : Horizontal, tr("Name")); 28. model->setHeaderData(1, Qt: : Horizontal, tr("Age")); 29. model->setHeaderData(2, Qt: : Horizontal, tr("Sex")); 30. 31. 32. QTableView *view = new QTableView(this); 33. view->setModel(model); 34. 35. db.close(); 36. 37. QGridLayout * gl=new QGridLayout(); 38. gl->addWidget(view); 39. this->setLayout(gl); 2、 下面是最终的现实效果如下: 现在先做一个显示的界面,界面是由一个表格试图和三个按钮组成。 我的大概流程是: <1>在对话框窗口先创建一个栅格布局管理器,添加一个表格视图窗口部件。 <2>创建一个水平布局管理器,在水平布局管理器中添加三个按钮,最后将水平布局管理器添加到栅格布局管理器中。 <3>创建三个按钮的信号与槽 <4>数据库的使用分为三步: (1)QsqlDatabase建立数据库的链接 (2)QsqlQuery用于执行SQL语句(3)QsqlTableModel结合QtableView可以输出数据库的表。 <5>效果测试点击connect按钮链接打开数据库 #include #include"table.h" intmain(intargc,char*argv[]) { QApplicationapp(argc,argv); Table*table=newTable; table->show(); returnapp.exec(); } #ifndefTABLE_H #defineTABLE_H #include #include classQGridLayout; classQPushButton; classQHBoxLayout; classTable: publicQDialog { Q_OBJECT public: //继承公共对话框窗体派生类 Table(QWidget*parent=0); //创建各个类的指针 QTableView*table; QGridLayout*gridLayout; QPushButton*connectButton; QPushButton*executionButton; QPushButton*displayButton; QHBoxLayout*verticalLayout; privateslots: //创建三个按钮槽函数 voidon_connectButton_clicked(); voidon_executionButton_clicked(); voidon_displayButton_clicked(); }; #endif #include #include #include #include #include"table.h" Table: : Table(QWidget*parent) : QDialog(parent) { //创建视图及按钮的对象 table=newQTableView; connectButton=newQPushButton("connect"); executionButton=newQPushButton("execution"); displayButton=newQPushButton("display"); //建立三个信号与槽函数链接 connect(connectButton,SIGNAL(clicked()),this,SLOT(on_connectButton_clicked())); connect(executionButton,SIGNAL(clicked()),this,SLOT(on_executionButton_clicked()));connect(displayButton,SIGNAL(clicked()),this,SLOT(on_displayButton_clicked())); //创建一个水平布局管理器,布局三个按钮 verticalLayout=newQHBoxLayout; verticalLayout->addWidget(connectButton); verticalLayout->addWidget(executionButton); verticalLayout->addWidget(displayButton); //创建一个栅格布局管理器对整体窗口部件的排布。 gridLayout=newQGridLayout; gridLayout->addWidget(table,0,0,1,1); gridLayout->addLayout(verticalLayout,1,0,1,1); setLayout(gridLayout); //设置窗口的大小 resize(500,400); } voidTable: : on_connectButton_clicked() { //链接函数实现数据库的链接功能 QSqlDatabasedb=QSqlDatabase: : addDatabase("QMYSQL");//添加QMYSQL数据库驱动 db.setHostName("localhost");//设置登陆的主机名为localhost db.setUserName("root");//登陆的用户是超级用户root db.setPassword("123456");//登陆密码是123456 db.setDatabaseName("student");//打开的数据库表格,这个表格式预先创建好的。 用>createdatabasestudent;创建。 boolok=db.open(); //布尔类型,打开数据。 if(ok)//if判断 { qDebug()<<"openDatabase! "< //如果打开数据库在终端输出openDatabase信息 } else {QMessageBox: : critical(0,QObject: : tr("DatabaseError"),db.lastError().text()); //否则输出数据库的消息框错误信息 } } voidTable: : on_executionButton_clicked() { //按executionButton按钮执行SQL语句 QSqlQueryquery; //创建一个执行数据库SQL语句对象 query.exec("droptableemployee"); //如果存在employee数据库表格,先删除 query.exec("createtableemployee(idint(11)primarykey,namevarchar(50),descriptionvarchar(255))"); //在创建数据库表格employee query.exec("insertintoemployeevalues(1,'zhangsan','student')"); query.exec("insertintoemployeevalues(2,'lisi','teacher')"); query.exec("insertintoemployeevalues(3,'wangwu','professor')"); //插入三个记录 } voidTable: : on_displayButton_clicked() { //用数据库表格模式结合试图显示数据库内容。 QSqlTableModel*model=newQSqlTableModel; //创建数据表模式对象 model->setTable("employee"); //设置数据库表上的运作模式以employee表名,不选择从数据表格以外获取信息 model->setEditStrategy(QSqlTableModel: : OnManualSubmit); //所有更改将被缓存在模型中,直到submitAll()或revertAll()函数被调用 model->select(); //select()函数用于确定一个或多个套接口的状态。 对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息。 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->setModel(model); //将这个数据库表格模式用视图显示出来。 } 在关闭对话框后出现查询应用默认数据库连接错误: QSqlDatabasePrivate: : removeDatabase: connection'qt_sql_default_connection'isstillinuse,allquerieswillceasetowork. 我googel以下,参照 的内容测试,还是解决不了。 在第二个按钮末尾添加下面的语句: QStringname; { name=QSqlDatabase: : database().connectionName(); } QSqlDatabase: : removeDatabase(name); On_executionButton_clicked()函数末尾添加,执行SQL语句后关闭窗口时有效的,但在on_displayButton_clicked()函数末尾添加却没有效。 问题还在解决当中。 。 。 。 。 Qt中MySQL数据库操作 首先,要查询相关的驱动是否已经装好了,可以用以下的程序进行验证: #include #include #include #include intmain(intargc,char*argv[]) { QCoreApplicationa(argc,argv); qDebug()<<"Availabledrivers: "; QStringListdrivers=QSqlDatabase: : drivers(); foreach(QStringdriver,drivers) qDebug()<<"/t"< returna.exec(); } 结果如下: 接着是连接数据库: #include #include #include boolcreateConnection() { QSqlDatabasedb=QSqlDatabase: : addDatabase("QMYSQL"); db.setDatabaseName("test"); db.setUserName("root"); db.setPassword("123456"); boolok=db.open(); if(! ok){ QMessageBox: : critical(0,QObject: : tr("连接数据库失败! ! ! "),db.lastError().text()); returnfalse; }else{ QMessageBox: : information(0,QObject: : tr("Tips"),QObject: : tr("连接数据库成功! ! ! ")); returntrue; } } intmain(intargc,char*argv[]) { QApplicationa(argc,argv); QTextCodec*codec=QTextCodec: : codecForName("GB2312"); QTextCodec: : setCodecForLocale(codec); QTextCodec: : setCodecForCStrings(codec); QTextCodec: : setCodecForTr(codec); if(! createConnection()) return1; returna.exec(); } 插入操作: //ODBC数据库表示方式 QSqlQueryquery; query.prepare(“insertintostudent(id,name)” “values(: id,: name)”); query.bindValue(0,5); query.bindValue(1,“sixth”); query.exec(); //Oracle表示方式 query.prepare(“insertintostudent(id,name)” “values(? ? )”); query.bindValue(0,5); query.bindValue(1,“sixth”); query.exec(); //使用addBindValue()函数,省去了编号,它是按属性顺序赋值的 query.prepare(“insertintostudent(id,name)” “values(? ? )”); query.addBindValue(5); query.addBindValue(“sixth”); query.exec(); //使用ODBC方法时,可以将编号用实际的占位符代替 query.prepare(“insertintostudent(id,name)” “values(: id,: name)”); query.bindValue(“: id”,5); query.bindValue(“: name”,“sixth”); query.exec(); 注意: 最后一定要执行exec(),否则上面的语句是不会被执行的。 //进行多个记录的插入时,可以利用绑定进行批处理 QSqlQueryq; q.prepare(“insertintostudentvalues(? ? )”); QVariantListints; ints<<10<<11<<12<<13; q.addBindValue(ints); QVariantListnames; names<<“xiaoming”<<“xiaoliang”<<“xiaogang”< : String); //最后一个是空字符串,应与前面的格式相同 q.addBindValue(names); if(! q.execBatch())//进行批处理,如果出错就输出错误 qDebug()< 查询操作: //返回全部的属性和结果集 QSqlQueryquery; query.exec(“select*fromstudent”);//执行查询操作 qDebug()<<“execnext(): ”; if(query.next()) //开始就先执行一次next()函数,那么query指向结果集的第一条记录 { introwNum=query.at(); //获取query所指向的记录在结果集中的编号 intcolumnNum=query.record().count(); //获取每条记录中属性(即列)的个数 intfieldNo=query.record().indexOf(“name”); //获取”name”属性所在列的编号,列从左向右编号,最左边的编号为0 intid=query.value(0).toInt(); //获取id属性的值,并转换为int型 QStringname=query.value(fieldNo).toString(); //获取name属性的值 qDebug()<<“rowNumis: ”< <<”idis: ”< <<”nameis: ”< <<”columnNumis: ”< } qDebug()<<“execseek (2): ”; if(query.seek (2)) //定位到结果集中编号为2的记录,即第三条记录,因为第一条记录的编号为0 { qDebug()<<“rowNumis: ”< <<”idis: ”< <<”nameis: ”< (1).toString(); } qDebug()<<“execlast(): ”; if(query.last()) //定位到结果集中最后一条记录 { qDebug()<<“rowNumis: ”< <<”idis: ”< <<”nameis: ”< (1).toString(); } 结果集其实就是查询到的所有记录的集合,而在QSqlQuery类中提供了多个函数来操作这个集合,需要注意这个集合中的记录是从0开始编号的。 最常用的有: seek(intn): query指向结果集的第n条记录。 first(): query指向结果集的第一条记录。 last(): query指向结果集的最后一条记录。 next(): query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。 previous(): query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。 record(): 获得现
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Qt MySQL 数据库 编程
![提示](https://static.bdocx.com/images/bang_tan.gif)