Qt中MySQL数据库编程.docx

上传人:b****5 文档编号:4042831 上传时间:2022-11-27 格式:DOCX 页数:17 大小:37.14KB
下载 相关 举报
Qt中MySQL数据库编程.docx_第1页
第1页 / 共17页
Qt中MySQL数据库编程.docx_第2页
第2页 / 共17页
Qt中MySQL数据库编程.docx_第3页
第3页 / 共17页
Qt中MySQL数据库编程.docx_第4页
第4页 / 共17页
Qt中MySQL数据库编程.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

Qt中MySQL数据库编程.docx

《Qt中MySQL数据库编程.docx》由会员分享,可在线阅读,更多相关《Qt中MySQL数据库编程.docx(17页珍藏版)》请在冰豆网上搜索。

Qt中MySQL数据库编程.docx

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():

获得现

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1