Qt编译MySql插件教程
帮助: SQL Programming
QSqlDatabase
静态函数
1.drivers()
,得到可以使用的数据库驱动名字的集合
[static] QStringList QSqlDatabase::drivers();
2.addDatabase()
,添加一个数据库实例
[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String( defaultConnection ));
该函数的有两个参数分别是:
type
: 指定要连接什么样的数据库,就是数据库驱动对应的驱动名
connectionName
:数据库连接名,默认叫: defaultConnection,我们可以在应用程序中添加多个数据库连接(也就是多个实例),每个连接都对应一个唯一的名字。
函数的返回值就是得到的数据库实例对象。
3.database()
,通过数据库连接名得到数据库实例对象(指向数据库连接的指针)
[static] QSqlDatabase QSqlDatabase::database(const QString &connectionName = QLatin1String( defaultConnection ), bool open = true);
该函数的有两个参数分别是:
connectionName
: 通过addDatabase()
函数的第二个参数指定的连接名
open
: 实例的状态
true
: 得到的实例设置为打开状态false
: 得到的实例设置为关闭状态
4.判断连接名对应的连接是否已经存在了,给函数参数指定数据库连接名函数就可以返回连接对应的状态了:true(打开) 或者 false(关闭)。
[static] bool QSqlDatabase::contains(const QString &connectionName = QLatin1String( defaultConnection ));
5.QSqlDatabase::colse()
关闭数据库之后,调用 QSqlDatabase::removeDatabase()
移除该连接
普通成员函数
// 1.设置数据库名
void QSqlDatabase::setDatabaseName(const QString &name);
// 2.设置数据库服务器主机名(一般指定服务器IP地址即可)
void QSqlDatabase::setHostName(const QString &host);
// 3.设置数据库服务器绑定的端口
void QSqlDatabase::setPort(int port);// 如果数据库服务器绑定的是默认端口,可以省略设置端口的操作。
// 4.设置连接的数据库中某个用户的用户名
void QSqlDatabase::setUserName(const QString &name);
// 5.设置连接的数据库中某个用户对应的密码
void QSqlDatabase::setPassword(const QString &password);// 6.连接数据库(必须要先设置连接信息,然后再连接数据库)
bool QSqlDatabase::open();// 数据库连接成功返回true,连接失败返回false。
// 7.判断数据库是否打开了,返回值和open()函数相同。
bool QSqlDatabase::isOpen() const;
// 8.关闭数据库连接
void QSqlDatabase::close();
// 9.返回有关数据库上发生的最后一个错误的信息。
QSqlError QSqlDatabase::lastError() const;
QString QSqlError::text() const;
// 该函数返回的是一个QSqlError对象,调用QSqlError类提供的text()方法就可以得到最后一个错误对应的信息描述了。// 事务操作
// 10.创建一个事务
bool QSqlDatabase::transaction();
// 11.提交事务
bool QSqlDatabase::commit();
// 12.事务回滚
bool QSqlDatabase::rollback();
QSqlQuery
QSqlQuery
封装了从 QSqlDatabase
上执行的SQL查询中创建、导航和检索数据所涉及的功能。既可以执行 SELECT
、INSERT
、UPDATE
、DELETE
等DML(数据操作语言)语句,也可以执行CREATE TABLE
等DDL(数据定义语言)语句。
成员函数
1.构造函数
QSqlQuery::QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase());
参数说明(这两个参数都有默认值,因此可以根据实际需求进行指定):
query
:要执行的SQL语句,指定无参 exec()
执行的 SQL 语句
db
:数据库实例对象,如果没有指定db,或者是无效的,则使用应用程序的默认数据库。
2.执行一个SQL语句
bool QSqlQuery::exec(); // 没有参数,执行的SQL语句是在构造函数中指定的
bool QSqlQuery::exec(const QString &query); // 有参数,参数对应的字符串就是要执行的SQL语句
3.检索查询得到的结果集中的下一条记录(如果可用),并将查询定位到检索到的记录上。
bool QSqlQuery::next();
该函数检索结果集中的每一条记录的规则如下:
- 如果当前位于结果集第一个记录之前,例如,在执行查询之后,将尝试检索第一个记录。
- 如果当前位于结果集最后一条记录之后,结果集已经检索完毕并返回false。
- 如果结果位于结果集中间的某个位置,则尝试检索下一个记录。
函数调用之后,如果检索到有效记录返回true,否则返回false。
4.获取当前记录中字段的值
QVariant QSqlQuery::value(int index) const; // 通过字段的索引得到当前字段的值,编号从0开始。
QVariant QSqlQuery::value(const QString &name) const; // 通过字段的名字得到当前字段的值。
由于数据库表中的字段可以有多种数据类型,因此将这多种类型通过 QVariant
类进行了包装从而实现了整齐划一。我们可以通过调用 QVariant
类的API函数得到其内部实际类型的数据。
ui界面
使用 QSqlQuery
进行查询时,字符类型的参数的占位符加引号 QString("select *from student where num = '%1'").arg(searchname);
;但是对于数值类型的参数的占位符,QString("select *from student where num = '%1'").arg(searchnumer);
,QString("select *from student where num = %1").arg(searchnumer);
,加不加引号都可以正常查询
QSqlQuery简单使用
代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlDatabase>
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowTitle("SQL");//设置窗口的标题connect(ui->pushButtonInsert, &QPushButton::clicked, this, &MainWindow::pInsert_clicked);connect(ui->pushButtonDelete, &QPushButton::clicked, this, &MainWindow::pDelete_clicked);connect(ui->pushButtonModify, &QPushButton::clicked, this, &MainWindow::pModify_clicked);connect(ui->pushButtonSelect, &QPushButton::clicked, this, &MainWindow::pSelect_clicked);connect(ui->pushButtonSelectAll, &QPushButton::clicked, this, &MainWindow::pSelectAll_clicked);ui->textEdit->setText("右侧栏操作介绍:\n""1.插入:输入新学生的姓名,学号,分数\n""2.删除:输入要删除学生的姓名\n""3.修改:输入学生姓名,对其学号和分数进行修改\n""4.指定信息优先按姓名查询,其次按学号\n""5.查询所有学生信息");QStringList list = QSqlDatabase::drivers();qDebug() << list;QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("127.0.0.1"); // 本地连接db.setPort(3306); // 如果使用的是默认端口可以不设置db.setUserName(""); // 数据库用户名db.setPassword(""); // 数据库密码db.setDatabaseName("student"); // 数据库名字if(db.open()){QMessageBox::information(this, "打开数据库", "数据库打开成功, 可以读写数据了......");}else{QString msg = "数据库打开失败: " + db.lastError().text();QMessageBox::information(this, "打开数据库", msg);}pquery = new QSqlQuery(db);QString str = "create table IF NOT EXISTS student(num int, name varchar(32), score double);";pquery->exec(str); // 建表
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::pInsert_clicked()
{if(ui->lineEditName->text().isEmpty() ||ui->lineEditNumber->text().isEmpty() ||ui->lineEditScore->text().isEmpty()) {QMessageBox::information(this, "Insert Error", "要插入的学生信息必须完整");return;}QString namestr = ui->lineEditName->text();int num = ui->lineEditNumber->text().toInt();double score = ui->lineEditScore->text().toDouble();QString str = QString("insert into student(num, name, score) values('%1', '%2', '%3')").arg(num).arg(namestr).arg(score);pquery->exec(str);ui->textEdit->append("插入成功\n");
}void MainWindow::pDelete_clicked()
{if(ui->lineEditName->text().isEmpty()) {QMessageBox::information(this, "Delete Error", "必须给出要删除学生的姓名");return;}QString name = ui->lineEditName->text();//从行编辑框中获取需要删除的人名QString str = QString("select * from student where name = '%1'").arg(name);pquery->exec(str);if(pquery->size() <= 0) {QMessageBox::information(this, "Delete Error", "要删除的学生不存在,请检查输入的姓名是否正确");return;}str = QString("delete from student where name = '%1'").arg(name);pquery->exec(str);ui->textEdit->append(QString("删除姓名为%1的同学成功\n").arg(name));
}void MainWindow::pModify_clicked()
{if(ui->lineEditName->text().isEmpty() ||ui->lineEditNumber->text().isEmpty() ||ui->lineEditScore->text().isEmpty()) {QMessageBox::information(this, "Insert Error", "要修改的学生信息必须完整");return;}QString updatename = ui->lineEditName->text();QString temp = QString("select * from student where name = '%1'").arg(updatename);pquery->exec(temp);if(pquery) {if(pquery->size() <= 0) {QMessageBox::information(this, "Insert Error", "要修改的学生不存在,请查看输入的姓名是否正确");return;}}int number = ui->lineEditNumber->text().toInt();double score = ui->lineEditScore->text().toDouble();temp = QString("update student set num = '%1' , score = '%2' where name = '%3'").arg(number).arg(score).arg(updatename);pquery->exec(temp);//执行修改信息的操作ui->textEdit->append("修改成功\n");
}void MainWindow::pSelect_clicked()
{if(ui->lineEditName->text().isEmpty() && ui->lineEditNumber->text().isEmpty()) {QMessageBox::information(this, "Select Error", "必须指定查询的姓名或者学号");return;}QString searchname = ui->lineEditName->text();int searchnumer = ui->lineEditNumber->text().toInt();QString str;if(!ui->lineEditName->text().isEmpty()) {str = QString("select *from student where name = '%1'").arg(searchname);pquery->exec(str);if(pquery->size() <= 0) {QMessageBox::information(this, "Select Error", "要查询的学生不存在,请查看输入的姓名是否正确");return;}ui->textEdit->append(QString("查询姓名为%1的同学成功").arg(searchname));}else if(!ui->lineEditNumber->text().isEmpty()) {str = QString("select *from student where num = '%1'").arg(searchnumer);pquery->exec(str);if(pquery->size() <= 0) {QMessageBox::information(this, "Select Error", "要查询的学生不存在,请查看输入的学号是否正确");return;}ui->textEdit->append(QString("查询学号为%1的同学成功").arg(searchnumer));}pquery->exec(str);QString name;int number = 0;double score;while (pquery->next()){number = pquery->value(0).toInt();name = pquery->value(1).toString();score = pquery->value(2).toDouble();str = "学号: " + QString::number(number) + " " +"姓名: " + name + " " +"分数: " + QString::number(score);ui->textEdit->append(str);}ui->textEdit->append("\n");
}void MainWindow::pSelectAll_clicked()
{QString str = QString("select *from student");pquery->exec(str);if(pquery->size() <= 0) {QMessageBox::information(this, "Select Error", "目前student里没有信息");}ui->textEdit->append("查询所有成员成功");QString name;int number = 0;double score;while (pquery->next()){number = pquery->value(0).toInt();name = pquery->value(1).toString();score = pquery->value(2).toDouble();str = "学号: " + QString::number(number) + " " +"姓名: " + name + " " +"分数: " + QString::number(score);ui->textEdit->append(str);}ui->textEdit->append("\n");
}