Qt 11数据库

数据库

注:连接数据库时用的时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.新增或是删除数据后暂时没变化,右键刷新    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值