数据库
注:连接数据库时用的时db句柄,执行sql语句时用的是query
1.创建数据库文件
1.在项目文件中引入sql模块
Qt += sql
---------------------------------------------------------------
2.引入头文件
#include <QsqlDatabase>
数据库连接管理类
#include <QsqlQuery>
数据库语句管理类 用于执行sql语句
#include <QsqlError>
数据库错误信息管理类 用于数据库操作失败看错误信息
---------------------------------------------------------------
3.构造数据库对象
widget.h:
QsqlDatabase db; //定义对象(数据库的句柄,也称为连接)
widget.c:
构造函数:
连接数据库,没有就创建:
db=QsqlDatabase::addDatabase("QSQLITE"); //获得或者创建sqlite3的数据库连接
设置数据库的文件名:
db.setDatabaseName("my.db")
---------------------------------------------------------------
4.打开数据库文件
db.open();
返回bool类型
if(!db.open())
{
qDebug()<<"open:"<<db.lastError().text();
return ;
}
运行成功后本地的bulid文件会新增一个my.db文件
2.创建数据库表
5.创建数据库表
应该用sql语句写:
新建的sql语句:create table if not exists usr()
构造query对象:
QString sql=""; //将sql语句装进字符串
QSqlQuery query; //定义一个sql对象,用于装载sql语句
装载sql语句:
prepare();
query.prepare(sql);
执行sql语句
exec();
query.exec();
--------------------------------------------------------------
或者不装载,直接通过exec执行sql语句:
QString sql="";
QSqlQuery query;
query.exec(sql);
---------------------------------------------------------------
QString sql = "create table if not exists usr(name text, sex varchar(2), age integer, Tel varchar(11));";
//第一个字段:name用文本类型(不限长);
//第二个字段:sex 用varchar(),可以指定字节数
//第三个字段:age 用integer类型,整数类型
QSqlQuery query;
query.prepare(sql);
if( !query.exec() )
{
qDebug() << "create table: " << query.lastError().text();
//执行sql语句时,错误信息用query打印,不是用db打了
return;
}
---------------------------
QString sql = "create table if not exists usr(name text, sex varchar(2), age integer, Tel varchar(11));";
QSqlQuery query;
if( !query.exec(sql) )
{
qDebug() << "create table: " << query.lastError().text();
return;
}
注:连接数据库时用的时db句柄,执行sql语句时用的是query
3.向数据库里插入数据
ui界面新建一个按钮(添加),然后转到槽
插入的sql语句:
insert into usr values()
sql可以不加分号,之前在网编的加分号是因为在命令行进行操作
在槽函数中:
QSqlQuery query;
Qstring sql=" ";
if(!query.exec(sql))
{
qDebug() << "insert into: " << query.lastError().text();
return;
}
---------------------------------------------------------
void Widget::on_btnAdd_clicked()
{
QSqlQuery query;
QString sql = QString("insert into usr values('%1', '%2', %3, '%4') ")
.arg(ui->edtName->text())
.arg(ui->edtSex->text())
.arg(ui->edtAge->text().toInt())
.arg(ui->edtPhone->text());
qDebug() << "sql: " << sql;
if(!query.exec(sql)){
qDebug() << "insert into: " << query.lastError().text();
return;
}
QMessageBox::information(this, "恭喜", "操作成功");
}
4.查询数据
在ui界面中,双击tableWidget,修改控件的行数和列数
查询的数据将在该控件上显示
ui界面中新建一个查询按钮,右键转到槽
查询的sql语句:
select * from usr
槽函数中:
QSqlQuery query;
QString sql = "";
if(!query.exec(sql))
{
qDebug() << "select : " << query.lastError().text();
return;
}
---------------------------------------------------------
查询的内容在query中,处理query将其显示在tableWidget中:
获取query的记录
query.record() #include <QsqlRecord>
获得每条记录的字段数(行数)
query.record().count()
取出本条记录:
next()
取出本条记录,返回记录是否存在
存在返回 true,不存在返回 false;内部指针指向下一条记录
取出本条记录中第 i号字段
value(i);
取出数据后存入表格:
与列表部件框的操作类似;
设置表格项:
ui->tableWidget->setItem();
构造一个表格项:
new QTableWidgetItem();
----------------------------------------------------------
int row=0;
while(query.next())
{
for(int i = 0; i < query.record().count(); i++)
{
ui->tableWidget->setItem(row, i, new QTableWidgetItem( query.value(i).toString() ));
//行 列 新的表格项的内容
}
row++;
}
通过while循环将每一条记录的数据取出来
在通过for循环将每个字段(列)的数据取出来,再存进表格
---------------------------------------------------------
注1:
每一次查询的时候,应该把前一次查询的内容清除掉
清除表格项的内容:
clear();
ui->tableWidget->clear();
但是会将表头的列名一起清除掉
设置表格的水平头部标签名: 就可以解决这个问题
setHorizontalHeaderLabels(); 参数时list类型
QStringList list = {"姓名", "性别", "年龄", "联系方式"};
ui->tableWidget->setHorizontalHeaderLabels();
注2:
设置表格的行数:
setRowCount();
ui->tableWidget->setRowCount(10);
用于预设表格的行数
-------------------------------------------------------------------------
void Widget::on_btnSelect_clicked()
{
QSqlQuery query;
QString sql = "select * from usr";
if(!query.exec(sql))
{
qDebug() << "insert into: " << query.lastError().text();
return;
}
ui->tableWidget->clear();
QStringList list = {"姓名", "性别", "年龄", "联系方式"};
ui->tableWidget->setHorizontalHeaderLabels(list);
ui->tableWidget->setRowCount(10);
row = 0;
qDebug() << query.record().count();
while(query.next())
{
for(int i = 0; i < query.record().count(); i++)
{
ui->tableWidget->setItem(row, i, new QTableWidgetItem( query.value(i).toString() ));
}
row++;
}
}
5.eg:数据库的增删改查
ui界面:
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QSqlRecord>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_btnAdd_clicked();
void on_btnSelect_clicked();
private:
Ui::Widget *ui;
QSqlDatabase db; //定义对象(数据库的句柄,也称为连接)
int row = 0;
};
#endif // WIDGET_H
widget.c
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//获得或者创建sqlite3的数据库连接
db = QSqlDatabase::addDatabase("QSQLITE");
// 设置数据库的文件名
db.setDatabaseName("my.db");
//打开数据库文件
if( !db.open()){
qDebug() << "open: " << db.lastError().text();
return;
}
QString sql = "create table if not exists usr(name text, sex varchar(2), age integer, Tel varchar(11));";
QSqlQuery query;
#if 0
// prepare():装在sql语句
query.prepare(sql);
// exec(): 执行 sql语句
if( !query.exec() ){
#else
if(!query.exec(sql)){
#endif
qDebug() << "create table: " << query.lastError().text();
return;
}
}
Widget::~Widget()
{
delete ui;
}
#include <QMessageBox>
void Widget::on_btnAdd_clicked()
{
QSqlQuery query;
QString sql = QString("insert into usr values('%1', '%2', %3, '%4'); ")
.arg(ui->edtName->text())
.arg(ui->edtSex->text())
.arg(ui->edtAge->text().toInt())
.arg(ui->edtPhone->text());
qDebug() << "sql: " << sql;
if(!query.exec(sql)){
qDebug() << "insert into: " << query.lastError().text();
return;
}
QMessageBox::information(this, "恭喜", "操作成功");
}
void Widget::on_btnSelect_clicked()
{
QSqlQuery query;
QString sql = "select * from usr";
if(!query.exec(sql)){
qDebug() << "insert into: " << query.lastError().text();
return;
}
//清除表格项的内容
ui->tableWidget->clear();
QStringList list = {"姓名", "性别", "年龄", "联系方式"};
// 设置表格的水平头部 标签名
ui->tableWidget->setHorizontalHeaderLabels(list);
// 设置表格的行数
ui->tableWidget->setRowCount(10);
row = 0;
// record().count(): 获得每条记录的字段数
qDebug() << query.record().count();
// next(): 取出本条记录,返回记录是否存在,存在返回 true,不存在返回 false;内部指针指向下一条记录
while(query.next()){
// value(i): 取出本条记录中第 i号字段
// qDebug() << query.value(0).toString();
for(int i = 0; i < query.record().count(); i++){
ui->tableWidget->setItem(row, i, new QTableWidgetItem( query.value(i).toString() ));
}
row++;
}
}
运行结果:
可视化数据库软件
Navicat Premium
使用:
1.点击项目中的*.db文件,用Navicat 打开
2.项目名->main->表->usr 右边就是在数据库的内容,
3.新增或是删除数据后暂时没变化,右键刷新