QT 连接SQLServer数据库

news2024/11/24 5:37:18

1、安装SQLServer数据库后

在SQL Server 配置管理器中

设置后,需要重新启动SQL Server服务 

2、重点* 配置ODBC数据源

由于没有配置ODBC,一直无法连接

开始——ODBC数据源管理程序(64位)

之后选择:使用用户输入登录ID和密码的SQL Server验证

连接SQL Server以获得其他配置选项的默认设置

登录ID:sa

密码:xxx

之后更改默认数据库

选择下一步,点击测试数据源——如果显示 测试成功,则完成

3、QT 编写代码,连接数据库

DatabaseProject.pro  添加sql

#include "widget.h"

#include <QApplication>
#include <QDebug>
#include <QSqlDatabase>
#include <QMessageBox>
#include <QSqlError>

bool OpenDatabase()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    qDebug()<<"ODBC driver is valid: "<<db.isValid();

    QString dsn = QString::fromLocal8Bit("QTDSN");
    db.setHostName("localhost");
    db.setDatabaseName(dsn);
    db.setUserName("sa");
    db.setPassword("xxx");

    if(db.open())  // 注意此处,是open(),不是isOpen()
    {
        qDebug()<<"open database success!";
        return true;
    }
    else
    {
        qDebug()<<db.lastError().text();
        QMessageBox::critical(0, QObject::tr("Database error"), db.lastError().text());
        return false;
    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    OpenDatabase();

    return a.exec();
}

输出open database success,则为连接 数据库成功

4、尝试实现远程电脑连接数据库

连接远程电脑数据库

首先,明确远程电脑ip地址,ping后看能否成功

其次,如果连接不上,查看是否关闭了电脑的防火墙

然后,在ODBC数据源管理中,在服务器处填写ip地址

最后,选择指定的数据库,测试查看是否连接成功

5、实现增删改查功能

#include "widget.h"

#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlQuery>
#include <sql_info.h>

// 连接sqlserver 数据库
// Qt GUI应用程序 《 Qt QODBC 数据库驱动 《 SQL数据库

// 目标:
// 连接主机数据库,获取数据库表中数据
// 实现add delete update select 表中数据,向一个表实现即可

// 向指定表中插入数据
// 增加数据
bool insert_info(QSqlDatabase db, QString insert_command, Sql_Info *info)
{
    QSqlQuery ins_qry(db);
    ins_qry.prepare(insert_command);
    ins_qry.bindValue(":xx", info->get_xx());
    ins_qry.bindValue(":xx", info->get_xx());
    ins_qry.bindValue(":xx", info->get_xx());
    ins_qry.bindValue(":xx", info->get_xx());
    ins_qry.bindValue(":xx", info->get_xx());
    ins_qry.bindValue(":xx", info->get_xx());
    ins_qry.bindValue(":xx", info->get_xx());
    ins_qry.bindValue(":xx", info->get_xx());
    bool ins_res = ins_qry.exec();
    if(ins_res)
        qDebug()<<"插入数据成功";
    else
        qDebug()<<"插入数据失败";

    return ins_res;
}

// 删除数据
bool delete_info(QSqlDatabase db, QString del_command, QString del_name)
{
    QSqlQuery del_qry(db);
    del_qry.prepare(del_command);
    del_qry.addBindValue(del_name);
    bool del_res = del_qry.exec();
    if(del_res)
        qDebug()<<"删除成功";
    else
        qDebug()<<"删除失败";

    return del_res;
}

// 修改表中数据
bool update_info(QSqlDatabase db, QString update_command, int xx, int xx, QString xx)
{
    QSqlQuery update_qry(db);
    update_qry.prepare(update_command);
    update_qry.addBindValue(xx);
    update_qry.addBindValue(xx);
    update_qry.addBindValue(xx);
    bool update_res = update_qry.exec();
    if(update_res)
        qDebug()<<"更新成功";
    else
        qDebug()<<"更新失败";

    return update_res;
}

// 查询指定表中数据
QList<Sql_Info*> query_table_info(QSqlDatabase db, QString query_command)
{
    QList<Sql_Info*> sql_list;

    // 查询
    QSqlQuery qry(db); // 获取数据库
    if(qry.exec(query_command)){
        int sql_size = 0; // 记录表中数据数量
        while(qry.next())
        {
            if(qry.isValid())
            {
                int xx= qry.value(0).toUInt();
                QString xx= qry.value(1).toString();
                QString xx= qry.value(2).toString();
                int xx= qry.value(3).toUInt();
                Sql_Info * si = new Sql_Info(xx, xx, xx, xx);
                sql_list.append(si);

                qDebug()<<QString("xx:%1; xx:%2; xx:%3").arg(xx).arg(xx).arg(xx);
            }

            sql_size++;
        }
    }

    //qDebug()<<sql_list[1]->get_name();

    return sql_list;
}

// 打开数据库,查看是否连接成功
bool OpenDatabase()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); // 数据库驱动类型SQLServer
    qDebug()<<"ODBC driver is valid: "<<db.isValid();

    QString dsn = QString::fromLocal8Bit("QTHostDBDSN");  // 数据库名称
    db.setHostName("10.40.19.9");
    db.setDatabaseName(dsn);
    db.setUserName("sa");
    db.setPassword("123");

    if(db.open())
    {
        qDebug()<<"数据库打开成功";

        // 查询数据库中指定表数据
        //QString command = "SELECT * FROM xx表";
        //QList<Sql_Info*> res = query_table_info(db, command);

        // 向表中插入数据
        //QString insert_command = "INSERT INTO xx表(xx,xx,xx,xx,xx,xx,xx,xx) VALUES (:xx,:xx,:xx,:xx,:xx,:xx,:xx,:xx)";
        //Sql_Info *v = new Sql_Info("12345679", "张三", 2, "xx", 9, 10, 80, 0);
        //insert_info(db, insert_command, v);

        QSqlQuery insert_qry(db);
        QString sel_command = "SELECT * FROM xx表";
        if(insert_qry.exec(sel_command))
        {
            QString ins_qry_str = "INSERT INTO xx表"
        }

        // 删除表中数据
        //QString delete_command = "DELETE FROM xx表 WHERE xx=?";
        //QString delete_name = "张三";
        //delete_info(db, delete_command, delete_name);

        // 修改表中数据
        //QString update_command = "UPDATE xx表 SET xx=?, xx=? WHERE xx=?";
        //update_info(db, update_command, 11, 80, "xx");

        return true;
    }
    else
    {
        qDebug()<<"数据库打开失败";
        qDebug()<<db.lastError();
        QMessageBox::critical(0, QObject::tr("Database Error"), db.lastError().text());
        return false;
    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    OpenDatabase();

    return a.exec();
}

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

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

相关文章

Improving 3D Imaging with Pre-Trained Perpendicular 2D Diffusion Models

使用预先训练的垂直 2D 扩散模型改进 3D 成像 论文链接&#xff1a;https://arxiv.org/abs/2303.08440 项目链接&#xff1a;https://github.com/hyn2028/tpdm Abstract 扩散模型由于其众多的优点已经成为一种流行的图像生成和重建方法。然而&#xff0c;大多数基于扩散的逆…

只有68g的电竞鼠标,软硬件都能自定义,雷柏VT9Pro上手

最近雷柏的轻量化无线鼠标又出了一款新品VT9PRO&#xff0c;这款鼠标相比于之前的VT9升级不少&#xff0c;不仅机身更轻盈&#xff0c;而且配置更高&#xff0c;采用了原相定制3398光学引擎&#xff08;3395高定版&#xff09;&#xff0c;外加欧姆龙5000万次轻脆微动等专业级配…

Jmeter安装与测试

目录 一&#xff1a;JMeter简介&#xff1a; 二&#xff1a;JMeter安装与配置 三&#xff1a;JMeter主要原件 一&#xff1a;JMeter简介&#xff1a; JMeter&#xff0c;一个100&#xff05;的纯Java桌面应用&#xff0c;由Apache组织的开放源代码项目&#xff0c;它是功能 …

链式法则:概率论描述语言模型

目录 1.事件相互独立 2.链式法则 3.示例 4.语言模型中的链式法则 1.事件相互独立 事件相互独立就是&#xff1a;一个事件的发生与否&#xff0c;不会影响另外一个事件的发生。 当a和b两个事件互相独立时&#xff0c;有&#xff1a; P(a | b) P(a) 推广到3个事件就有下面…

windows2003 IIS6.0解析漏洞

一、漏洞说明 &#xff08;1&#xff09;当建立*.asa、.asp格式的文件夹时&#xff0c;其目录下的任意文件都将被IIS当做asp文件解析。 &#xff08;2&#xff09;当文件.asp&#xff1a;1.jpg IIS6.0同样会将文件当做asp文件解析。 二、搭建环境 Windows server2003安装iis6.0…

内网隧道代理技术(二十五)之 ICMP隧道反弹SHELL

ICMP隧道反弹SHELL ICMP隧道原理 由于ICMP报文自身可以携带数据,而且ICMP报文是由系统内核处理的,不占用任何端口,因此具有很高的隐蔽性。把数据隐藏在ICMP数据包包头的data字段中,建立隐蔽通道,可以实现绕过防火墙和入侵检测系统的阻拦。 ICMP隧道有以下的优点: ICMP…

Mybatis sql参数自动填充

问题描述 在日常开发中&#xff0c;经常会遇到Mybatis sql语句的操作问题&#xff0c;由于Mybatis实现sql的动态拼接&#xff0c;开发过程中&#xff0c;为了验证sql是否书写正确&#xff0c;通常需要获取的控制台打印的sql语句来检查是否拼接正确。如下图所示&#xff1a; 那…

ClientDataSet运行中出现“ClientDataSet:dataset not in edit or insert mode”(二)

接前期《ClientDataSet运行中出现“ClientDataSet&#xff1a;dataset not in edit or insert mode”&#xff08;一&#xff09;》中&#xff0c;提出的解决方案&#xff0c;本人作进一步探索&#xff1a; 一、编写一个返回ClientDataSet的状态函数 function Get_Client_stat…

SpringBoot项目中使用poi-tl打成jar包后常见问题及解决

目录 前言 一、场景描述 1、打成jar包运行后模板找不到 2、文件只能下载一次 二、正确示范 1、Controller下载方法定义 2、文档生成 总结 前言 在前面的博客中&#xff0c;介绍了如何在Java中根据模板动态写入数据到word模板中&#xff0c;原文地址&#xff1a;Java使用…

Solidity 小白教程:15. 异常

Solidity 小白教程&#xff1a;15. 异常 这一讲&#xff0c;我们介绍solidity三种抛出异常的方法&#xff1a;error&#xff0c;require和assert&#xff0c;并比较三种方法的gas消耗。 异常 写智能合约经常会出bug&#xff0c;solidity中的异常命令帮助我们debug。 Error …

企业如何实时监管员工聊天红包转账记录?

1 你还在担心员工飞单吗&#xff1f; 2 你还在担心员工私单吗&#xff1f; 3 你还在担心员工辱骂删除客户吗&#xff1f; 4 你还在担心员工工作量无法统计吗&#xff1f; 5 你还在担心员工离职带走客户资源吗&#xff1f; 。。。。。。 互联网时代&#xff0c;微信应用…

QCustomPlot绘图类详解(大白话)

本文假定你会使用Qt开发&#xff0c;但未接触过QCustomPlot绘图类或者是刚接触。 如何往Qt中引入QCustomPlot 首先&#xff0c;去官网下载最新版本的源码&#xff0c;注意是QCustomPlot.tar.gz这个文件&#xff0c;里面包含源码和示例。实际上&#xff0c;我们只需要qcustompl…

Hadoop-Hive

1. hive安装部署 2. hive基础 3. hive高级查询 4. Hive函数及性能优化 1.hive安装部署 解压tar -xvf ./apache-hive-3.1.2-bin.tar.gz -C /opt/soft/ 改名mv apache-hive-3.1.2-bin/ hive312 配置环境变量&#xff1a;vim /etc/profile #hive export HIVE_HOME/opt/soft/hive…

【深度学习 AIGC】stablediffusion-infinity 在无界限画布中输出绘画 Outpainting

代码&#xff1a;https://github.com/lkwq007/stablediffusion-infinity/tree/master 启动环境&#xff1a; git clone --recurse-submodules https://github.com/lkwq007/stablediffusion-infinity cd stablediffusion-infinity conda env create -f environment.yml conda …

笔记(三)传统图机器学习的特征工程-节点

1、不同种类的任务 2、传统图机器学习的几个层面 &#xff08;人工特征工程机器学习&#xff09; 3、属性特征-节点本身的特征 4、连接特征-节点的结构信息 5、训练-预测 6、好模型需要好数据 -人工构造的特征&#xff08;特征工程&#xff09;-节点、连接、全图-无向图 7、节…

算法训练 第二周

一、赎金信 本题给出了两个字符串ransomNote和magazine&#xff0c;需要让我们判断ransomNote中的字符能不能由magazine中的字符构成&#xff0c;也就是说我们需要将所有ransomNote中的字符找到一个在magazine中与这个字符相同的字符&#xff0c;且每个字符只能使用一次&#x…

openssl websockets

1. HTTPS通信的C实现 - 知乎

【干货】Anaconda导出环境配置文件

【干货 | 项目导出安装环境要求】 方法yml文件req.txt文件 参考 方法 yml文件 激活虚拟环境&#xff08;fyp是我的虚拟环境名称&#xff0c;请根据你自己的名称进行修改&#xff09; conda activate fyp运行此代码 conda env export > environment.ymlreq.txt文件 激活…

runtime过程中,常见jar问题解决

io.netty java.lang.NoSuchMethodError: io.netty.buffer.PooledByteBufAllocator.<init>此类问题报错&#xff0c;主要是io.netty 多个jar 冲突导致。、 使用以下命令查看同一个jar 有哪些版本 mvn dependency:resolve -Dclassifiersources对一些不愿意引入的依赖加上…

VIGC:自问自答,高质量视觉指令微调数据获取新思路

从今年四月份开始&#xff0c;随着MiniGPT-4, LLaVA, InstructBLIP等多模态大模型项目的开源&#xff0c;大模型的火从NLP领域烧到了计算机视觉及多模态领域。 多模态大模型需要高质量的图文对话数据进行指令微调&#xff0c;而当前多模态指令微调数据多基于纯文本GPT-4构建&am…