Qt连接Access数据库

news2024/11/24 13:43:34

       Qt自带有QODBC驱动封装了ODBC驱动接口,通过windows平台上提供的ODBC驱动访问支持ODBC的数据库,如Ms Access、SQL Server等 (Windows XP 自带有Access和SQL Server的ODBC Driver)。我们就用QODBC对Access数据库进行访问。 

Access数据库后缀名说明

.accdb文件:accdb文件格式用于Office Access 2007 文件格式的文件扩展名,用于取代 MDB 文件扩展名。

.mdb文件:mdb文件格式是Office Access97/2000/2003数据库文件后缀名,是早期Access文件格式。

由于本人电脑支持64位的access驱动,所以qt也是按照64位的。

查看qt支持哪些数据库的驱动

    QStringList strlist = QSqlDatabase::drivers();
    foreach(QString strdriver,strlist)
    {
        qDebug() << strdriver << endl;
    }

即我们的qt支持这些驱动:QSQLITE、QMYSQL、QMYSQL3、QODBC、QODBC3、QPSQL、QPSQL7 

 

Qt SQL的API分为不同层:

驱动层 

 驱动层  对于QT是基于C++来实现的框架,该层主要包括QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorbase、QSqlDriverPlugin and QSqlResult。这一层提供了特定数据库和SQL API层之间的底层桥梁。

SQL API层

SQL API层  对于SQL API 层提供了数据库的访问相关类,其中,QSqlDataBase类进行连接,QSqlQuery完成数据库的交互。除此之外,还有QSqlError、QSqlField、QSqlIndex and QSqlRecord类。

用户接口层

用户接口层  用户接口层的几个类实现将数据库中的数据链接到窗口部件上,这些类是使用模型/视图框架实现的,他们是更高层次的抽象,主要包括QSqlQureyModel,QSqlTableModel and QSqlRelationalTableModel。

用户接口层的类使用模型/视图框架实现了将数据库中的数据链接到窗口控件上

QTableView是常用的内容显示视图组件。数据模型类有:QSqlQueryModel 、QSqlTableModel 、QSqlRelationalTableModel

QSqlQueryModel :通过设置SELECT语句查询获取内容,Model数据是只读的,不能进行编辑。

QSqlTableModel : 直接设置一个数据表的名称,可以获取数据表的全部记录,结果是可编辑的。

QSqlRelationalTableModel: 编辑一个数据表,将代码字段通过关系与代码表关联,将代码字段的编辑转换为直观的内容选择编辑。

怎给数据库设置密码和输入密码

需要用access软件设置。

登录怎使用用户名密码校验。

输入密码只使用QSqlDatabase类的setPassword函数即可。

 void setPassword(const QString& password);

前提工作

已经创建好mdb数据库。如test.mdb

如果没有,需要使用软件创建,如果没有合适的软件创建数据库。简单粗暴就是ODBC数据源管理程序创建。如创建test.mdb。在obdc数据源管理中,新建test.mdb数据库。这样odbc才能访问mdb数据库。

最好是结合视图模型一起使用,如模型为:QSqlTableModel,视图为:QTableView,数据源为QSqlDatabase。

qt开发步骤

1.在.pro文件中添加 QT+=sql    //即用QtSql文件下的头文件、源文件

2.引用头文件

#include <QSqlDatabase>  //连接数据库

#include <QSqlQuery>  //执行各种sql语句

#include <QSqlError>  //SQL数据库错误信息

#include <QSqlRecord>  //封装数据库记录

#include <QSqlTableModel>  //单个数据库表的可编辑数据模型

3.查看QT 对数据库的驱动的类型的支持(具体项目中,可以不用)

    QStringList strlist = QSqlDatabase::drivers();
    foreach(QString strdriver,strlist)
    {
        qDebug() << strdriver << endl;
     }

4.连接和打开数据库

static QSqlDatabase addDatabase(const QStringtype,

                                 const QStringconnectionName = QLatin1String(defaultConnection));

void setDatabaseName(const QStringname);

bool open();

void Dialog::on_pushButton_clicked()
{
    QString strDBname;
    QString strpassword = "123456";
    QString runPath = QCoreApplication::applicationDirPath();       //获取文件运行路径
    strDBname = runPath + "/test.mdb";

    if(QSqlDatabase::contains("MyAccessDB"))
    {
        db = QSqlDatabase::database("MyAccessDB");
    }
    else
    {
        db = QSqlDatabase::addDatabase("QODBC", "MyAccessDB");
    }

    const QString strName(QString("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};DBQ=%1")
                          .arg(strDBname));

    db.setDatabaseName(strName);//关联数据库
    db.setPassword(strpassword);//输入登录数据库密码
    if (!db.isValid())
    {
        return ;
    }
    if (!db.open())
    {
        qDebug() << db.lastError().text();
        return ;
     }

//前提是:test.mdb数据库有一个表TUser。
//这样写的目的就是调用sql api层和用户接口层直接让模型和数据库关联存储数据、视图显示。模型为 
   QSqlTableModel 类,视图为QTableView类。
   QSqlTableModel *model; //model其实为类的成员变量
   model = new QSqlTableModel(this,db);
   ui->tableView->setModel(model);
   model->setTable("TUser");
   model->select();
}

5.创建表

void Dialog::on_pushButton_4_clicked()
{
    //创建表
    QSqlQuery query = QSqlQuery(db);
    query.clear();
    bool ret = query.exec("CREATE TABLE User ( userId VARCHAR(20) PRIMARY KEY, username VARCHAR(20) )");
    query.clear();
}

6.插入数据

void Dialog::on_pushButton_2_clicked()
{
        //插入数据
    QString strid = ui->lineEdit->text();
    QString strname = ui->lineEdit_2->text();
    if(strid.isEmpty() || strname.isEmpty())
        return;
    QSqlQuery query = QSqlQuery(db);
    bool bret = false;
    query.clear();
    bret = query.prepare("insert into TUser (fusername,fpassword,fpowerset) values (?,?,?)");
    query.addBindValue(strid);
    query.addBindValue(strname);
    query.addBindValue("4095");
    bret = query.exec();
    query.clear();
    model->setTable("TUser");
    model->select();
}

7.修改数据

void Dialog::on_pushButton_7_clicked()
{
    QModelIndex i = ui->tableView->currentIndex();
    QString stroldid;
    if(i.isValid())
    {
        int row = i.row();
        stroldid = model->data(model->index(row,0)).toString();
        QString strnewid = ui->lineEdit->text();
        QString strname = ui->lineEdit_2->text();
        QSqlQuery query = QSqlQuery(db);
        query.clear();
        bool ok = query.prepare("update TUser set fusername=?, fpassword=? where fusername=?");
        query.bindValue(0,strnewid);
        query.bindValue(1,strname);
        query.bindValue(2,stroldid);
        ok = query.exec();
        query.clear();
model->setTable("TUser");
        model->select();
    }
}

8.删除数据

void Dialog::on_pushButton_5_clicked()
{
    QModelIndex i = ui->tableView->currentIndex();
    QString strid;
    if(i.isValid())
    {
        int row = i.row();
        strid = model->data(model->index(row,0)).toString();
        QSqlQuery query = QSqlQuery(db);
        query.clear();
        query.prepare("delete from TUser WHERE fusername=?");
        query.bindValue(0,strid);
        bool ok = query.exec();
model->setTable("TUser");
        model->select();
    }
}

9.全部查询

void Dialog::on_pushButton_3_clicked()
{
    if (!db.isOpen())
    {
        return;
    }
    QSqlQuery query(db);
    query.clear();
    bool ok = query.prepare("select * from TUser");
    ok = query.exec();
    while(query.next())//每一行的数据
    {
        QString qvalue = query.value(0).toString();
        QString qvalue1 = query.value(1).toString();
        QString qvalue2 = query.value(2).toString();
        qDebug() << qvalue << qvalue1 << qvalue2 <<endl;
    }
    query.clear();
}

10 过滤查询

void Dialog::on_pushButton_6_clicked()
{
    if (!db.isOpen())
    {
        return;
    }
    QString strid = ui->lineEdit->text();
    QSqlQuery query = QSqlQuery(db);
    query.clear();
    bool ret = query.prepare("select * from TUser WHERE fusername=?");
    query.bindValue(0,strid);
    bool ok = query.exec();
    while(query.next())//每一行的数据
    {
        QString qvalue = query.value("fusername").toString();
        QString qvalue1 = query.value("fpassword").toString();
        qDebug() << qvalue << qvalue1 <<endl;
    }
    query.clear();
}

11.删除表

void Dialog::on_pushButton_8_clicked()
{
    QSqlQuery query = QSqlQuery(db);
    query.clear();
    query.exec("drop table user");
    query.clear();
}

12.关闭数据库

void Dialog::on_pushButton_9_clicked()
{
    if(db.isOpen())
    {
        db.close();
        model->clear();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/663403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

别再瞎搞了,耳朵都竖起来听我说,新手小白开发应该如何选择最合适你的JetBrains IDE版本类型和版本号! 今天一次性给你说清楚!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

windows环境下搭建redis集群

下面记录一下windows10环境下搭建redis3主3从集群&#xff0c;将过程分享出来&#xff0c;仅供学习研究使用。 1、redis集群 Redis集群关键点就是去掉中心化(与哨兵模式的区别)&#xff0c;当主机宕机&#xff0c;从节点回自动升级为主节点&#xff0c;具体请参考官网或相关大…

机器学习——KNN算法(手动代码,含泪)

徒手实现代码的过程&#xff0c;真是含泪和心酸&#xff0c;浪费了生命中的三天&#xff0c;以及工作中的划水一小时 终于滤清思路后&#xff0c;自己实现了KNN 都说KNN是最基础&#xff0c;最简单的分类器 放屁&#xff01;骗纸&#xff01;&#xff01;&#xff01;它的想法是…

第八章——向量代数与空间解析几何

目录 一、运算公式 二、平面的法线向量 注&#xff1a;加粗体为向量 一、运算公式 1.若a//b&#xff0c;那么aλb 若a⊥b&#xff0c;那么a*b0 2.若A(x1,y1,z1)&#xff0c;B(x2,y2,z2) 中点坐标&#xff1a;AB中点M(x1x2/2,y1y2/2,z1z2/2) 两点间的距离和模的计算&#x…

第3章 信息系统治理

文章目录 3.1.1 IT治理基础1. IT治理的驱动因素2. IT治理的目标价值3. IT治理的管理层次 3.1.2 IT治理体系1. IT治理关键决策2. IT治理体系框架3. IT治理核心内容4. IT治理机制经验&#xff08;建立IT治理机制的原则&#xff1a;简单、透明、适合&#xff09; 3.1.3 IT治理任务…

工作流引擎Flowable

这里写目录标题 1.Flowable基础1.1 入门学习 2.流程图设计器2.1 FlowableUI2.1.1 绘制流程图 1.Flowable基础 官方手册 1.1 入门学习 一、依赖 <dependencies><dependency><groupId>org.flowable</groupId><artifactId>flowable-engine</…

jenkins——Git版本管理

这里写目录标题 一、Jenkins Git 版本管理1、Git 的集成2、在执行job的机器上安装好Git3、无法连接仓库&#xff0c;问题解决解决方法1&#xff1a;&#xff08;不推荐&#xff09;1、把仓库设置成公开的&#xff0c;然后重新添加仓库地址 解决方法2&#xff1a;通过凭证的方式…

打破Spring的垄断,云原生Java框架Micronaut

文章目录 什么是Micronaut&#xff1f;Micronaut的功能特性相较于Spring的优势 Micronaut框架的使用安装Micronaut cli创建Micronaut项目 Micronaut应用的部署micronaut反应式编程 MCNU云原生&#xff0c;文章首发地&#xff0c;欢迎微信搜索关注&#xff0c;更多干货&#xff…

基于springboot的文件的上传到本地和云上传(阿里云)

1.文件上传 1.介绍 文件上传&#xff0c;是指将本地图片、视频、音频等文件上传到服务器&#xff0c;供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛&#xff0c;我们经常发微博、发微信朋友圈都用到了文件上传功能。 2.前端的文件上传–form表单 将静态的页面…

接口自动化测试面试问题及答案

目录 1.请问你是如何做接口测试的&#xff1f; 2.接口测试如何设计测试用例&#xff1f; 3.接口测试执行中需要比对数据库吗&#xff1f; 4.接口测试质量评估标准是什么&#xff1f; 5.接口产生的垃圾数据如何清理 6.其他接口要先获取接口信息&#xff0c;如何让登录的接口…

化工园区人员全过程轨迹化安全解决方案

1、项目背景 化工园区化工厂是生产安全重点单位&#xff0c;对人员定位管理需求强烈。对人员定位主要需求是&#xff1a;一般区域人数统计、人员轨迹、重点区域人员实时精准定位。 华安联大安全化工园区人员全过程轨迹化安全解决方案通过人员实时定位管理、移动轨迹追溯、险情…

《项目实战》构建SpringCloud alibaba项目(二、构建微服务鉴权子工程store-authority-service)

系列文章目录 构建SpringCloud alibaba项目&#xff08;一、构建父工程、公共库、网关&#xff09; 构建SpringCloud alibaba项目&#xff08;二、构建微服务鉴权子工程store-authority-service&#xff09; 文章目录 系列文章目录前言1、在公共库增加 UserInfo类2、微服务鉴权…

初识SLAM

SLAM的作用 想象一个叫小萝卜的机器人&#xff0c;小萝卜在未知环境走&#xff0c;肯定想让小萝卜在脑海中记住两件事&#xff1a; 1. 我在什么地方&#xff1f;——定位。 2. 周围环境是什么样&#xff1f;——建图。 这就和我们逛一个旅游景点一样&#xff0c;我们会潜意识…

清华青年AI自强作业hw3_3:用NN网络拟合MNIST手写数字分类

清华青年AI自强作业hw3_3&#xff1a;用NN网络拟合MNIST手写数字分类 实现过程具体思路多分类网络模型训练结果分析 相关链接 一起学AI系列博客&#xff1a;目录索引 hw3_3&#xff1a;用NN网络拟合MNIST手写数字分类 体会神经网络设计和TF框架编程 对比hw3_1两者的模型、效果…

CLIP和GPT

CLIP CLIP下游应用&#xff1a;VQGAN、DALL-ECLIP-Event:Connecting Text and Images with Event StructuresHierarchical Text-Conditional Image Generation with CLIP LatentsGPT系列算法GPT-1&#xff1a;GPT-2&#xff1a;GPT-3&#xff1a;GPT-3应用&#xff1a;Evaluati…

关于Win搜索太慢我自己写了一个Everything

文章目录 前言使用工具使用技术实现功能关于使用的技术比较OUTJDBC构建数据库FileMetasize处理文件最后修改时间equals重写其他方法 dao数据库源头获取连接关闭资源连接 FileDao初始化插入文件/目录到数据库中查询数据删除数据 特殊处理方法实现测试 服务初始化服务方法 操作单…

简要介绍 | 基于Python的图像形态学处理概述

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对基于Python的图像形态学处理进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 基于Python的图像形态学处理概述 Digital terrain models from airborne laser scanning for the automatic extra…

蓝牙芯片PHY6222的一些基本信息

摘要&#xff1a;本文简要介绍一下硬件工程师需要关注的PHY6222蓝牙芯片重点信息。 这个蓝牙芯片&#xff0c;支持蓝牙5.2. 内核是ARM Cortex™-M0 32-bit processor &#xff0c;这就证明它可以像开发STM32那样来为它开发程序。 具有SWD调试接口&#xff0c;那么就可以用少到…

论文解读:Splicing ViT Features for Semantic Appearance Transfer

Project webpage: https://splice-vit.github.io Abstruct 将两张图片中语义相近的目标的结构和风格&#xff08;外观&#xff09;拼接 • 输入一个 Structure/ Appearence 图像对 &#xff1a; 训练生成器 。 • 关键思想是利用 预训练 和固定的视觉转换器 ( ViT ) 模型&…

Smartbi内置用户登陆绕过漏洞复现

0x01 产品简介 Smartbi大数据分析产品融合BI定义的所有阶段&#xff0c;对接各种业务数据库、数据仓库和大数据分析平台&#xff0c;进行加工处理、分析挖掘和可视化展现&#xff1b;满足所有用户的各种数据分析应用需求&#xff0c;如大数据分析、可视化分析、探索式分析、复杂…