对于习惯使用SQL语法的用户,QSqlQuery类提供了直接执行SQL语句并处理返回结果的方法。对于习惯使用较高层数据库接口避免使用SQL语句的用户,QSqlTableModel类和QSqlRelationalTableModel类则提供了合适的抽象。

 -->可视化操作数据库

 Qt 不仅提供了这种使用 SQL 语句的方式,还提供了一种基于模型的更高级的处理方式。这种基于QSqlTableModel 的模型处理更为高级,如果对 SQL 语句不熟悉,并且不需要很多复杂的查询,这种QSqlTableModel模型基本可以满足一般的需求。即使用可以不懂sql语句都可以操作的类,来操作数据库。

-----> 需要自己补充SQL语法等内容

 数据库连接由任意字符串标识。在没有指定连接的情况下,QSqlDatabase可以提供默认连接供Qt其他的SQL类使用。建立一条数据库连接的代码如下:

    //以QSQLITE为数据库类型,在本进程地址控件创建一个SQLite数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setHostName("easybook-3313b0"); //设置数据库主机名
db.setDatabaseName("qtDB.db"); //设置数据库名
db.setUserName("zhouhejun"); //设置数据库用户名
db.setPassword("123456"); //设置数据库密码
db.open(); //打开连接

 静态函数QSqlDatabase::addDatabase()带有两个参数,第一个参数为驱动名,第二个参数为连接名,缺省值为默认连接。这个函数返回一条新建立的数据库连接。如果连接名connectionName没有指定,新建立的数据库连接将成为本程序的默认连接,并且可以被后续不带参数的函数database()引用。如果指定了连接名connectionName,函数database(connectionName)将获取这个数据库连接。

    static QSqlDatabase addDatabase(QSqlDriver* driver,
const QString& connectionName = QLatin1String(defaultConnection));

DEMO

pro文件

#-------------------------------------------------
#
# Project created by QtCreator 2018-10-18T11:24:48
#
#------------------------------------------------- QT += core gui
QT += sql greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = CH1301
TEMPLATE = app SOURCES += main.cpp\
dialog.cpp HEADERS += dialog.h FORMS += dialog.ui

dialog.h

#ifndef DIALOG_H
#define DIALOG_H #include <QDialog>
#include <QString>
#include <QSqlError>
#include <QSqlDatabase>
#include <QString>
#include <QTime>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlRecord> namespace Ui {
class Dialog;
} class Dialog : public QDialog
{
Q_OBJECT public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
QString driverName() const;
QString databaseName() const;
QString userName() const;
QString password() const;
QString hostName() const;
int port() const; QSqlError addConnection(const QString &driver,const QString &dbName,
const QString &host,const QString &user,
const QString &passwd,int port = -1); void creatSqliteDB(); private slots:
void on_cancel_pushButton_clicked(); void on_ok_pushButton_clicked(); void driverChanged(const QString &text); private:
Ui::Dialog *ui;
}; #endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h" Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
QStringList drivers = QSqlDatabase::drivers(); ui->drivercomboBox->addItems(drivers); connect(ui->drivercomboBox,SIGNAL(currentIndexChanged(QString)),
this,SLOT(driverChanged(QString))); ui->statuslabel->setText(tr("准备连接数据库!"));
} Dialog::~Dialog()
{
delete ui;
} void Dialog::driverChanged(const QString &text)
{
if(text == "QSQLITE")
{
ui->datebaselineEdit->setEnabled(false);
ui->userNamelineEdit->setEnabled(false);
ui->hostnamelineEdit->setEnabled(false);
ui->passwordlineEdit->setEnabled(false);
ui->portspinBox->setEnabled(false);
}
else
{
ui->datebaselineEdit->setEnabled(true);
ui->userNamelineEdit->setEnabled(true);
ui->hostnamelineEdit->setEnabled(true);
ui->passwordlineEdit->setEnabled(true);
ui->portspinBox->setEnabled(true);
}
} void Dialog::on_cancel_pushButton_clicked()
{
close();
} QString Dialog::driverName() const
{
return ui->drivercomboBox->currentText();
} QString Dialog::databaseName() const
{
return ui->datebaselineEdit->text();
} QString Dialog::hostName() const
{
return ui->hostnamelineEdit->text();
} QString Dialog::userName() const
{
return ui->userNamelineEdit->text();
} QString Dialog::password() const
{
return ui->passwordlineEdit->text();
} int Dialog::port() const
{
return ui->portspinBox->value(); } QSqlError Dialog::addConnection(const QString &driver, const QString &dbName, const QString &host, const QString &user,
const QString &passwd, int port)
{
static int cCount = 0;
QSqlError err;
QSqlDatabase db = QSqlDatabase::addDatabase(driver,QString("conn%1").arg(++cCount));
db.setHostName(dbName);
db.setDatabaseName(dbName);
db.setPort(port); if(!db.open(user,passwd))
{
err = db.lastError();
db = QSqlDatabase();
QSqlDatabase::removeDatabase(QString("conn%1").arg(cCount));
}
return err;
}
/*
* 描述:
* 输入:
* 输出:
* 返回值:
* 其他:
*/
void Dialog::creatSqliteDB()
{
//以QSQLITE为数据库类型,在本进程地址控件创建一个SQLite数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setHostName("easybook-3313b0"); //设置数据库主机名
db.setDatabaseName("qtDB.db"); //设置数据库名
db.setUserName("zhouhejun"); //设置数据库用户名
db.setPassword("123456"); //设置数据库密码
db.open(); //打开连接 if(!db.open())
{
ui->statuslabel->setText(db.lastError().text());
return ;
} //创建数据库表
QSqlQuery query; bool success=query.exec("create table automobil(id int primary key,attribute varchar,type varchar,kind varchar,nation int,carnumber int,elevaltor int,distance int,oil int,temperature int)"); if(success)
{
qDebug() << "数据库创建成功!" << endl;
}
else
{
qDebug() << "数据库创建失败!" << endl;
return ;
}
//查询
query.exec("select * from automobil");
QSqlRecord rec = query.record();
qDebug() << "atuomobil 表字段数: " << rec.count(); //插入记录
QTime t; //启动一个定时器,统计操作耗时
t.start();
query.prepare("insert into automobil values(?,?,?,?,?,?,?,?,?,?)"); long records = 100; //向表中任意的插入100条记录
for(int i = 0;i < records;i++)
{
query.bindValue(0,i);
query.bindValue(1,"四轮");
query.bindValue(2,"轿车");
query.bindValue(3,"富康");
query.bindValue(4,rand()%100);
query.bindValue(5,rand()%10000);
query.bindValue(6,rand()%300);
query.bindValue(7,rand()%200000);
query.bindValue(8,rand()%52);
query.bindValue(9,rand()%100);
success=query.exec();
if(!success)
{
QSqlError lastError = query.lastError();
qDebug() << lastError.driverText() << "插入失败" <<endl;
}
} qDebug() << QObject::tr("插入 %1 条记录,耗时 %2 ms").arg(records).arg(t.elapsed()); //排序
t.restart(); //重启计数器
//按id字段的降序将查询表中刚刚插入的100条记录进行排序
success = query.exec("select * from automobil order by id desc"); if(success)
{
qDebug() << QObject::tr("排序 %1 条记录,耗时 %2 ms").arg(records).arg(t.elapsed());
}
else
{
qDebug() << "排序失败!\n";
} //删除
t.restart();
query.exec("delete from automobil where id=15"); //执行删除id为15的记录的操作 //输出耗时
qDebug() << QObject::tr("删除一条记录,耗时 %1 ms").arg(t.elapsed()); return ;
} void Dialog::on_ok_pushButton_clicked()
{
if(ui->drivercomboBox->currentText().isEmpty())
{
ui->statuslabel->setText(tr("请选择一个数据库驱动"));
}
else if(ui->drivercomboBox->currentText() == "QSQLITE")
{
creatSqliteDB();
// accept();
}
else
{
QSqlError err = addConnection(driverName(),databaseName(),hostName(),
userName(),password(),port());
if(err.type() != QSqlError::NoError)
{
ui->statuslabel->setText(err.text());
}
else
{
ui->statuslabel->setText(tr("连接数据库成功!"));
// accept();
}
}
}

main.cpp

#include "dialog.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show(); return a.exec();
}

参考资料

1 https://www.cnblogs.com/yuweifeng/p/9403696.html

Qt5数据库的更多相关文章

  1. QT5 - 数据库、QMYSQL driver not loaded

    第一步.先在“.pro”的入口文件里加入以下两行代码: QT += sql SOURCES += main.cpp 第二步.在“main.cpp”文件中连接数据库并判断是否连接成功 1.QPSQL连接 ...

  2. JSP应用开发 -------- 电纸书(未完待续)

    http://www.educity.cn/jiaocheng/j9415.html JSP程序员常用的技术   第1章 JSP及其相关技术导航 [本章专家知识导学] JSP是一种编程语言,也是一种动 ...

  3. 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0

    作者:小波 QQ:463431476 请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/ 我的第二款软件:CET四六级单词背诵软件.基于QT5.5.0.sql数 ...

  4. CentOS7 (64位) 下QT5.5 连接MySQL数据库(driver not loaded)

    用qt连接MySQL需要共享库 libqsqlmysql.so的驱动,路径在plugin/sqldrivers目录下,乍看已经可用了,其实不然. 用ldd命令分析一下,libmysqlclient_r ...

  5. Linux系统下 解决Qt5无法连接MySQL数据库的方法

    Linux平台下解决Qt5连接mysql数据库的问题:输入sudo apt-get install libqt5sql5-mysql解决,这种方法只能解决Qt是用sudo apt-get instal ...

  6. 数据库SQLite在Qt5+VS2012使用规则总结---中文乱码

    VS2012默认格式为 "GB2312-80",而有时我们用到字符串需要显示中文时,就会出现乱码.下面仅就Qt5和VS2012中使用数据库SQLite时,做一个简单的备忘录 #in ...

  7. Qt5.8以上版本编译Oracle数据库的OCI驱动教程

    在前一篇的文章中我已经发过一个相似的文章,详情请点击:Qt5编译oracle驱动教程. 在那一篇文章中已经可以解决了Qt5的常用版本的Oracle数据库驱动的支持,但是在新的Qt开发工具中那种方法竟然 ...

  8. qt5.6.2简单操作mysql数据库

    1.新建个项目后,需要在.pro工程文件在中添加QT += sql,否则编译会出错: 2.如果出现数据库驱动未加载,则需要把mysql下的libmysql.dll拷贝到D:\Qt5.6.2\5.6\m ...

  9. Ubuntu 15.04 Qt5 链接 mysql数据库

    序 最近在Ubuntu15.04下做一个Linux-服务器-客户端通信项目,用到MySQL数据库.开始的时候,在数据库链接时遇到障碍,查找资料解决. 特此记录,分享于此. 环境配置 系统:Ubuntu ...

随机推荐

  1. php 获取淘宝搜索词 内容

    $s = file_get_contents('http://suggest.taobao.com/sug?extras=1&code=utf-8&callback=g_ks_sugg ...

  2. Python生成目录树代码

    用Python实现类似Windows下的tree命令,获取目录树结构. import os import os.path BRANCH = '├─' LAST_BRANCH = '└─' TAB = ...

  3. 如何通过 Vue+Webpack 来做通用的前端组件化架构设计

    目录:   1. 架构选型     2. 架构目录介绍     3. 架构说明     4. 招聘消息 目前如果要说比较流行的前端架构哪家强,屈指可数:reactjs.angularjs.emberj ...

  4. ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)

    ARM架构:  由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7:       一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...

  5. 如何写好接口(php写app移动端接口示例)

    原文链接:https://blog.csdn.net/xwh670570759/article/details/52130585?utm_source=blogxgwz0

  6. bzoj 4810 由乃的玉米田 - bitset - 莫队算法

    由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题   这个题是这样的: 给你一个序列a,长度为n,有m ...

  7. C# lock 关键字的一些理解

    C# lock 关键字的一些理解 问题1:谁是锁? lock 这个关键字,并不是“锁”,真正的“锁”是那个被lock的Object类型的“对象”,请注意,这里为“对象”加了双引号着重强调被lock的是 ...

  8. HDU 5929 Basic Data Structure(模拟 + 乱搞)题解

    题意:给定一种二进制操作nand,为 0 nand 0 = 10 nand 1 = 1 1 nand 0 = 1 1 nand 1 = 0 现在要你模拟一个队列,实现PUSH x 往队头塞入x,POP ...

  9. FJNU2018低程A 逃跑路线(Lucas + 中国剩余定理 + LGV定理)题解

    题目描述 n个人在w*h的监狱里面想要逃跑,已知他们的同伙在坐标(bi,h)接应他们,他们现在被关在(ai,1)现在他们必须要到同伙那里才有逃出去的机会,这n个人又很蠢只会从(x,y)->(x+ ...

  10. 怎样建立你自己的MASM导入库

    by Iczelion (翻译:花心萝卜yqzq@163.net) 9.5.2000 这篇短文是讲述关于建立MASM导入库(import libraries)技巧,我假设你已经知道什么是导入库.在下面 ...