【C++SQL查询器】

使用C++实现一个简单的SQL语句词法分析器 不多说,直逼主题 1. Token的结构 了解过词法分析器应该都知道,实现一个程序经过词法分析器之后,会生成一个Token,供语法分析器使用。我们在这里就先实现这个token的结构,很简单。 struct Token{ string cifadanyuan; string cisu; Token(){ } Token(string cifadanyuan,string cisu){ ... 阅读详情
#include <iostream>
#include <fstream> // 文件输入流
#include <string>
#include <windows.h>
#include <sqltypes.h>
#include <sql.h>
#include <sqlext.h>
#include <ctime>
#include <iomanip>
#include <thread>

// 全局变量,用于保存上一次查询的行数
int previousRowCount = 0;

// 函数用于获取当前时间的带前缀的字符串
std::string getTimePrefix() {
    std::time_t current_time;
    std::time(&current_time);
    std::tm current_time_info;
    localtime_s(&current_time_info, &current_time);
    char timeBuffer[22];
    int ret = strftime(timeBuffer, sizeof(timeBuffer), "[%Y-%m-%d %T]", &current_time_info);
    return std::string(timeBuffer) + " ";
}

// 函数用于执行 SQL 查询并返回结果以及行数
int executeSQLQuery(SQLHDBC dbc, const std::string& query) {
    SQLHSTMT stmt;
    SQLRETURN ret;
    SQLCHAR outstr[4096];
    SQLSMALLINT outstrlen;
    int rowCount = 0;

    SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
    ret = SQLExecDirectA(stmt, (SQLCHAR*)query.c_str(), SQL_NTS);

    if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
        SQLGetDiagRecA(SQL_HANDLE_STMT, stmt, 1, NULL, NULL, outstr, sizeof(outstr), &outstrlen);
        std::cerr << getTimePrefix() << "执行 SQL 查询时出错:" << outstr << std::endl;
        SQLFreeHandle(SQL_HANDLE_STMT, stmt);
        return -1;
    }

    // 获取结果集中列的数量
    SQLSMALLINT numCols;
    SQLNumResultCols(stmt, &numCols);

    while (SQLFetch(stmt) == SQL_SUCCESS) {
        rowCount++; // 每获取一行数据,行数加一

        if (rowCount > previousRowCount) {
            std::cout << getTimePrefix() << "发现新增数据:";

            // 输出每一列的名称和数据
            for (int i = 1; i <= numCols; ++i) {
                SQLCHAR columnName[256];
                SQLCHAR columnData[256];
                SQLLEN indicator;
                ret = SQLDescribeColA(stmt, i, columnName, sizeof(columnName), NULL, NULL, NULL, NULL, NULL);
                if (ret == SQL_SUCCESS) {
                    ret = SQLGetData(stmt, i, SQL_C_CHAR, columnData, sizeof(columnData), &indicator);
                    if (ret == SQL_SUCCESS) {
                        // 输出列名和数据
                        std::cout << (i > 1 ? ", " : "") << (char*)columnName << ": " << (char*)columnData;
                    }
                }
            }
            std::cout << std::endl;
        }
    }

    SQLFreeHandle(SQL_HANDLE_STMT, stmt);
    return rowCount; // 返回行数
}

// 函数用于执行检测操作
void performDetection(SQLHDBC dbc, const std::string& query) {
    int currentRowCount = executeSQLQuery(dbc, query);

    if (currentRowCount > previousRowCount) {
        std::cout << getTimePrefix() << "发现新增行数:" << currentRowCount - previousRowCount << std::endl;

        // 提示新增的 Beep 声音
        Beep(1000, 500);
        Beep(2000, 500);
        Beep(3000, 500);
        Beep(4000, 500);
    }
    else {
        std::cout << getTimePrefix() << "查询到的行数:" << currentRowCount << std::endl;
    }

    // 更新上一次查询的行数
    previousRowCount = currentRowCount;
}


int main() {
    // 从文件中读取连接字符串
    std::ifstream file("conn.txt");//DRIVER={SQL Server};SERVER=192.168.1.102;DATABASE=myserver;UID=sa;PWD=123456
    if (!file.is_open()) {
        std::cerr << "无法打开文件 conn.txt" << std::endl;
        return 1;
    }

    std::string connectionString;
    std::getline(file, connectionString);

    file.close();

    if (connectionString.empty()) {
        std::cerr << "连接字符串为空" << std::endl;
        return 1;
    }

    SQLHENV env;
    SQLHDBC dbc;
    SQLRETURN ret;

    // 初始化 SQL 环境
    ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
    ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);

    // 连接到数据库
    ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
    ret = SQLDriverConnectA(dbc, NULL, (SQLCHAR*)connectionString.c_str(), connectionString.size(), NULL, 0, NULL, SQL_DRIVER_COMPLETE);

    if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
        SQLCHAR outstr[4096];
        SQLSMALLINT outstrlen;
        SQLGetDiagRecA(SQL_HANDLE_DBC, dbc, 1, NULL, NULL, outstr, sizeof(outstr), &outstrlen);
        std::cerr << getTimePrefix() << "连接到数据库时出错:" << outstr << std::endl;
        return 1;
    }

    // 定义要执行的查询语句
    std::string query = "SELECT * FROM myserver.dbo.alarmevent";

    // 首次执行检测操作
    performDetection(dbc, query);

    std::cout << "\n";
    std::cout << "\t _   _    _    _   _ _  __\n";
    std::cout << "\t| | | |  / \\  | \\ | | |/ /\n";
    std::cout << "\t| |_| | / _ \\ |  \\| | ' /\n";
    std::cout << "\t|  _  |/ ___ \\| |\\  | . \\\n";
    std::cout << "\t|_| |_/_/   \\_\\_| \\_|_|\\_\\\n";
    std::cout << "\n";

    // 每小时的特定分钟执行检测操作
    while (true) {
        std::time_t current_time;
        std::time(&current_time);
        std::tm current_time_info;
        localtime_s(&current_time_info, &current_time);
        if (current_time_info.tm_min % 5 == 0) {
            performDetection(dbc, query);
            Sleep(1000*60);
        }
        Sleep(1000);
    }

    // 断开连接并清理资源
    SQLDisconnect(dbc);
    SQLFreeHandle(SQL_HANDLE_DBC, dbc);
    SQLFreeHandle(SQL_HANDLE_ENV, env);

    return 0;
}

C++连接SQL数据库 一。创建项目并配置头文件和库 1.创建空项目 刚开始配置VS2017连接SQL环境时,无法在项目的属性中找到C\C++。 这是一个BUG,需要写一些代码编译然后才会出来。 2.配置项目所需头文件及其所在文件夹 右键项目选择属性,进入C/C++ => 常规 => 附加包含目录,添加C:\Program Files\MySQL\MySQL Server 8.0\include(这个目录... 阅读详情

相关推荐

SQL Server CONTAINS 全文检索深度解析与生产避坑指南

全文检索是关系型数据库处理非结构化文本的核心能力,其本质是基于倒排索引、分词器、同义词库和停用词表构建的语义匹配系统,区别于传统LIKE的字符扫描。SQL Server的CONTAINS谓词并非语法糖,而是依赖全文目录、全文索引、语言特定分词器(如中文Word Breaker)及thesaurus等四层技术栈协同工作的专用子系统。它在商品描述、用户评论、日志分析等场景中可实现毫秒级关键词检索与布尔逻辑匹配,但性能高度敏感于配置——如语言LCID错配导致中文分词失效、停用词表缺失引发索引膨胀、KEY INDE

weixin_34056162的博客 546

使用c++写sql语句的最佳实践

ccORM是本人的一次c++对sql查询的完美实践,写起来得心应手,效率非常之高,值得推荐。 #include "ccORM.hh" auto d = crow::D("127.0.0.1","mysql_test","root","",3306,"utf8");//D_();//或者可以直接用宏(已经配置好的方式) int main() { using namespace crow; using namespace std; auto q = d.conn();//创建一个连接 q("D.

qq_33359662的博客 3212

C++:使用SQL连接实例编程

在开始之前,我们需要包含适当的头文件和库,以便在C++代码中使用SQL功能。通过上述步骤,我们可以在C++中使用ODBC库连接到SQL数据库实例,并执行查询、插入等操作。请注意,在实际使用中,可能需要根据具体的数据库和ODBC驱动程序进行适当的调整和配置。在C++编程中,我们经常需要与数据库进行交互,执行查询、插入、更新等操作。在连接到数据库之前,我们需要先设置连接参数,如数据库名称、用户名、密码等。在完成与数据库的交互后,我们应该断开与数据库的连接,释放相关的资源。这个示例展示了如何断开与数据库的连接。

DevProPlus的博客 496

跨平台网络通信与服务器框架 acl 服务器框架 3.0.21 版本发布

library 的简称,主要包括网络通信库以及服务器框架库等功能,支持 Linux/Windows/Solaris/FreeBsd/MacOS 平台;整个 acl 项目主要包含三个函数库:lib_acl(纯C开发的基础库,主要包含网络通信及服务器编程框架以及其它丰富的功能)、lib_protocol(包含 HTTP/PING/SMTP 通信协议的C语言实现)、lib_acl_cpp(基于 lib_acl 及 lib_protocol 两个C库,提供了更为强大的编程接口及丰富的功能类);本次 acl 升级的主

zsxxsz的专栏 192

C++通过ODBC方式连接数据库SQLServer及增删查改操作【图书借阅系统为例】

C++通过ODBC方式连接数据库SQLServer及增删查改操作【图书借阅系统为例】 文章目录 前言 一、ODBC如何配置 二、SQL Server如何设置账号密码 三、C++连接数据库以及增删查改操作的代码实现 四、源代码 前言 ​ 大二学习了《数据库原理及应用》,期末做课程设计。因为大一学的C++,所以决定用C++写。这里以《图书借阅系统》为例,该系统做的并不是很完整,但已经能够体现C++如何对数据库SQL Server进行增删查改操作。以下是本人的学习心得,仅供学习参考。 一、ODBC如

m0_53889370的博客 1万+

12V INPUT电源电路设计中的关键保护机制解析【精简】

本文深入解析了12V INPUT电源电路设计中不可或缺的关键保护机制。针对常见的电源反接、过压及浪涌等风险,文章详细拆解了PMOS防反接、TVS过压钳位、OVP芯片关断以及快速断电电路等核心防护方案的设计原理、选型要点与实战优化技巧,旨在帮助工程师构建可靠、经济的电源前端防御体系。

weixin_29158047的博客 228

提供了SQL编辑器、查询器、对象编辑器的数据库开发控件OraDeveloper Tools

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33750452的博客 304

警惕!数字签名伪造的攻防演练:用SigThief克隆证书的真实测试(Windows环境)

本文深入探讨了Windows环境下数字签名伪造的攻防技术,详细介绍了使用SigThief工具进行签名提取与克隆的实战步骤。通过真实测试案例,揭示了数字签名安全机制的潜在漏洞,并提供了有效的防御策略和检测技术,帮助安全人员提升系统防护能力。

weixin_42530732的博客 408

写一个简单高效的 JSON 查询器

  JSON可谓是JavaScript的亮点,它能用优雅简练的代码实现Object和Array的初始化。同样是基于文本的数据定义,它比符号分隔更有语义,比XML更简洁。因此越来越多的JS开发中,使用它作为数据的传输和储存。      JS数组内置了不少有用的方法,方便我们对数据的查询和筛选。例如我们有一堆数据: var heros = [ // 名============攻=====防=======力量====敏捷=====智力==== {name:'冰室女巫',.

liudanyang_21的博客 241

C#面试题及详细答案120道(61-75)-- 多线程与异步

本文摘要了前后端面试题中关于线程与并发的核心知识点,包括线程与进程的区别(61题)、Thread/ThreadPool/Task的对比(62题)、线程安全实现方法(63题)、lock关键字的原理(64题)、Monitor类的进阶用法(65题)以及死锁的成因与避免(66题)。通过C#代码示例和表格对比,清晰展示了多线程编程的关键概念、应用场景及常见问题解决方案,适合开发者快速掌握面试高频考点。完整内容可访问专栏目录获取更多技术面试题解析。

大剑师兰特的GIS世界 1429

Android日志实战——车机日志获取(十五)

这个项目中的 Log 管理系统,其实只是将系统原生 Log 进行输出并导出,并没有太复杂的操作。还有一种 Log 管理系统需要对 Android 原生 Log 系统进行重写,例如我们使用 Log.d(tag, msg) 打印 Log,需要我们根据 tag 信息将不同模块的 Log 数据写入不同的本地文件下,这样可以方便不同模块查看自己的 Log,追踪异常问题。

小旭的专栏 3776

如何列出SQLite数据库中的所有表

SQLite数据库中的信息存在于一个内置表sqlite_master中,在查询器中可以用 select * from sqlite_master来查看,如果只要列出所有表名的话,则只要一个语句: SELECT name FROM sqlite_master WHERE type='table' order by name,因为表的列type固定为'table'。

9107

机器人行业面试全攻略:从0到1拿下心仪Offer,看这一篇就够了

【摘要】2026年机器人行业迎来爆发期,全球市场规模超800亿美元,人才争夺激烈。本文针对机器人行业面试提供系统攻略:首先需明确岗位方向、打造差异化标签并了解目标公司;技术面试高频考点包括ROS框架、SLAM导航、运动控制、深度学习和嵌入式系统;项目介绍需采用STAR+R结构并量化成果;行为面试需注意协作能力与职业规划。文章还总结了简历堆砌、单向输出等五大常见误区,强调长期积累与精准准备的重要性,助力求职者把握行业窗口期机会。

郑伟强dev的专栏 188

Wt::Dbo:C++ ORM实现零SQL持久化与对象关系映射实践

对象关系映射(ORM)是一种将面向对象编程语言中的对象与关系型数据库中的表进行自动转换的技术,其核心原理是通过元数据描述对象与表之间的映射关系,由框架在运行时动态生成SQL语句。这项技术的核心价值在于极大提升了开发效率,减少了手动编写和维护SQL语句的重复劳动,同时通过类型安全查询降低了SQL注入风险。在C++后端开发中,ORM技术尤其适用于需要快速迭代、模型复杂的业务系统,能够显著改善开发体验。Wt::Dbo作为C++ Web框架Wt的组成部分,以其“约定大于配置”和“零重复代码”的设计哲学脱颖而出,通过

weixin_33874713的博客 502

电化学-NanoStat-开源系统的使用说明

本文主要介绍了NanoStat开源系统的使用方法,从硬件打板、设备组装、软件安装3个层次进行了详细说明。整个流程根据作者提供的视频能够很好的完成,不需要太多的技术,对刚入门的新手是一个不错的练手项目。其次软件还有很大的优化空间,能够进一步提高系统的精度,对之后类似恒电位仪系统的开发也有很大的借鉴意义。

分享技术笔记,希望对大家能够有一定的帮助,同时也通过归纳总结提升自己的个人能力。 2000

基于STM32、HAL库的SC16IS752IPW总线转UART驱动程序设计

/ FIFO空间不足。// 设置LCR寄存器的DLAB位为1以访问DLL/DLH。// 设置LCR寄存器,先访问DLL/DLH。// 设置LCR寄存器(不包含DLAB位)

corlin6688的博客 815

SQL数据库编程

一般是 CASE WHEN 参数 IS NULL THEN 年龄 ELSE 参数 END 这种情况下sql编程参数化编程,如果参数不传sql编程参数化编程,就是全部。首先我们需要打开SQL Server Managment管理工具sql编程参数化编程,新建一个表。然后在表中插入一些样例数据sql编程参数化编程,如下图所示。接下来我们在SQL Server Managment中右键单击可编程性,选择新建存储过程。

aoxiangchina的博客 362

Claude Desktop新功能:让非技术人士也能自主编程

摘要: Anthropic近日在Claude桌面应用中集成了Claude Code功能,显著降低了非技术用户的使用门槛。Claude Code作为代理式编程工具,支持多任务并行处理、Git隔离和可视化会话管理,无需命令行操作即可实现代码调试、重构等复杂任务。新增的“计划模式”通过先分析后执行的流程,确保安全性,使产品经理、数据分析师等非开发者也能参与技术工作。这一更新标志着AI技术正打破专业壁垒,让领域专家无需编码背景即可利用高级工具,推动技术民主化。

独立开发,substack顶级编辑 1538

利用函数模板技术,写一个简单高效的 JSON 查询器

  JSON可谓是JavaScript的亮点,它能用优雅简练的代码实现Object和Array的初始化。同样是基于文本的数据定义,它比符号分隔更有语义,比XML更简洁。因此越来越多的JS开发中,使用它作为数据的传输和储存。      JS数组内置了不少有用的方法,方便我们对数据的查询和筛选。例如我们有一堆数据: var heros = [ // 名=====...

weixin_34274029的博客 91

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

SQL:使用char,nchar查询时需要注意

使用Sql Server的Northwind数据库的Customers表 1)代码一 1Declare@cCoustomerIDCHAR(5) 2SELECT@ncCoustomerID=NULL; 3SELECT* 4FROMCUSTOMERS 5WHERECUSTOMERIDLIKEISNULL(@ncCoustomerID,'%') ...

weixin_34308389的博客 211

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++开发的数据库连接查询修改小工具

项目相关地址 源码:https://github.com/easonjim/SQL_Table_Tool bug提交:https://github.com/easonjim/SQL_Table_Tool/issues

weixin_33998125的博客 113

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

安装 MongoDB、与SQL语法对比、Python (异步)操作 mongodb:增、删、改、查

安装 MongoDB、与SQL语法对比、Python (异步)操作 mongodb:增、删、改、查

freeking101的博客 8713

程序员如何巧用Excel提高工作效率

Excel这个家喻户晓的软件,想必在大多数程序员眼中他只过是word的表格版,编辑处理一些表格数据。是财务、仓管和HR的专属软件,其实不然。Excel这个神奇的软件,用来撸代码还是很方便的。比如: 数据格式转换 API对接 批量数据导入 面对以上几个问题,估计很多人会用最苦逼的方式——复制粘贴x N 去解决。最终可能会让你粘到的怀疑人生。如果用Excel来处...

weixin_30877227的博客 133
上一篇: 【89ip可用代理收集】
下一篇: C++HTTP简易留言板
「已注销」
博客等级 码龄14年 71粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值