分享封装好的异步Mysql动态的库(DyNetMysql.dll) + 项目源码

在做C++项目时,经常会用到Mysql数据库,Mysql接口提供给我们的数据是相当原始的,如:字段名、字段类型,字段长度等等,一般情况我们都想一种更方便获得数据

如:

XXXStruct pRecourdInfo = (const XXXStruct)(mysql获得的数据指针);

直接转换字段对应的结构来,这样能大大方便我们使用

这个功能已经在我之前发表上一篇文章<<分享一直在维护简单实用高效的C++Socket框架Swa-server(开源+源码)>>中实现,现在是将它封装成为一个dll

最近有点时间,就学习了dll相关知识,然后将封装成一个dll,这样方便使用及移植到其他项目。于是将swa-server中的mysql异步处理功能代码分离出来,创建一个DyNetMysql项目,设置为dll项目

关于dll项目及导出不要这里讲述,园友自己百度查询(zf把谷歌封了真是服了)

根据园友性格就先上代码(_

cpp;gutter:true; // TestDll.cpp : 定义控制台应用程序的入口点。 //</p> <h1>include "stdafx.h"</h1> <h1>include "../../DyNetServer/NetServer.h"</h1> <h1>include "../../DyNetMysql/DbSession.h"</h1> <h1>include "../../DyNetMysql/DbRecordSet.h"</h1> <h1>include</h1> <p>using namespace std;</p> <p>NetServer<em> gNetServer; IDbSession</em> gDataBase;</p> <p>void OnNetMsgEnter( NetSocket& rSocket ); void OnNetMsgExit( NetSocket& rSocket ); void OnNetMsg( NetSocket& rSocket , NetMsgHead* pHead );</p> <h1>pragma pack(push,1)</h1> <p>struct CharacterInfo { int64 type_idx; char nick[32]; int32 level; };</p> <h1>pragma pack(pop)</h1> <p>void DBCallbase(void<em> pUser, const void</em> pMsg) { const DbRecordSet<em> pRecordSet = static_cast(pMsg); for (int32 i = 0 ; i < pRecordSet->CountRecord();++i ) { const CharacterInfo</em> pInfo = static_cast(pRecordSet->GetRecordBuff(i)); printf("id:%ld nick:%s level:%d \n",pInfo->type_idx,pInfo->nick,pInfo->level); } }</p> <p>int _tmain(int argc, _TCHAR* argv[]) {</p> <pre><code>// 启动msyql gDataBase = DbSessionMgr::Instance()->AddDatabase("127.0.0.1", "root", "root", "swa_data", false); ASSERT(gDataBase); // 初始化Scoket服务 gNetServer = NetServerMgr::Instance()->AddNetServer(); gNetServer->SetAddress("127.0.0.1", 4321); gNetServer->SetHandler(OnNetMsgEnter, OnNetMsg, OnNetMsgExit); // 启动Socket服务 gNetServer->Start(); gDataBase->ExecuteAsyncSQL("SELECT type_idx,, FROM ",NULL,DBCallbase); while (true) { Sleep(1); NetServerMgr::Instance()->Update(0); //逻辑处理 DbSessionMgr::Instance()->Update(0); //SQL处理及回调 } return 0; </code></pre> <p>}</p> <p>void OnNetMsgEnter(NetSocket& rSocket) { int a = 1; }</p> <p>void OnNetMsg(NetSocket& rSocket, NetMsgHead* pHead) { int a = 1; }</p> <p>void OnNetMsgExit(NetSocket& rSocket) { int a = 1; }</p> <pre><code> 这里启动创建一个Mysql连接对象,如果成功返回!null,然后可以异步执行sql及设置回调(可以不设置回调) 上述代码运行效果图如下(为什么用printf,如果是字符放在第二以上显示为 ![](//images0.cnblogs.com/blog2015/425928/201504/232146125465965.png) 其实实现将数据直接转结构体也不是很难,即每行给一个char buffer[65536],然后将mysql的字段内存拷贝进去,之后再转为结构体即可 这里需要注意的,如果是char或varchar字段的,转出来要知道mysql是用什么字符编码,如果是utf-8则它byte最大长度为定义长度*3,本dynetmysql是按utf-8,且长度默认为字节长度,所以存储是中文时要注意,一个中文是用3个长度。 相关类部分代码1: </code></pre> <p>DbRecordSet& m_rRecordSet; vector m_vecFields; char m_arrRowBuff[65536]; // 每一行内容记录,每个字段记录它的开始位置即可,则一行记录最大为64k uint32 m_nBuffBegin; // 已经使用的位置</p> <pre><code> 相关类部分代码2: </code></pre> <p>switch (nType) { case FIELD_TYPE_TINY: { mI64Val = pszValue ? atol(pszValue) : 0; memcpy(&m_arrRowBuff[m_nBuffBegin], &mI64Val, 1); m_nBuffBegin += 1; } break; case FIELD_TYPE_SHORT: { mI64Val = pszValue ? atol(pszValue) : 0; memcpy(&m_arrRowBuff[m_nBuffBegin], &mI64Val, 2); m_nBuffBegin += 2; } break; case FIELD_TYPE_LONG: { mI64Val = pszValue ? atol(pszValue) : 0; memcpy(&m_arrRowBuff[m_nBuffBegin], &mI64Val, 4); m_nBuffBegin += 4; } break; case FIELD_TYPE_FLOAT: { mF64Val = pszValue ? atof(pszValue) : 0; memcpy(&m_arrRowBuff[m_nBuffBegin], &mF64Val, 4); m_nBuffBegin += 4; } break; case FIELD_TYPE_LONGLONG: { mI64Val = pszValue ? atol(pszValue) : 0; memcpy(&m_arrRowBuff[m_nBuffBegin], &mI64Val, 8); m_nBuffBegin += 8; } break; case FIELD_TYPE_DOUBLE: { mF64Val = pszValue ? atof(pszValue) : 0; memcpy(&m_arrRowBuff[m_nBuffBegin], &mF64Val, 8); m_nBuffBegin += 8; } break; case FIELD_TYPE_STRING:// char case FIELD_TYPE_VAR_STRING:// var_char { memcpy(&m_arrRowBuff[m_nBuffBegin], pszValue, nLen / 3); // mysql char 定义大小会按最大长底去计算长度,这里限制按字节大小去截断 m_nBuffBegin += nLen / 3; } break; case MYSQL_TYPE_TINY_BLOB: case MYSQL_TYPE_MEDIUM_BLOB: case MYSQL_TYPE_LONG_BLOB: case MYSQL_TYPE_BLOB: { memcpy(&m_arrRowBuff[m_nBuffBegin], pszValue, nLen); m_nBuffBegin += nLen; } break;

目前这个DyNetMysql.dll还不完善,如果是直接select 则可以创建结构体与它对应则可直接转结构体,如果是其它如update,delete乖等,则建议设置不使用回调或使用存储过程。

测试代码中也用到了最近封装一个异步Socket的dll,如果大家感兴趣, 请留言和推荐吧,我才会有动力跟园友一起分享!如果有问题,可以留言或qq296464231问我

分享封装好的异步Mysql动态的库(DyNetMysql.dll) + 项目源码

项目源码下载

Original: https://www.cnblogs.com/hellohuang/p/4452038.html
Author: HolleHuang
Title: 分享封装好的异步Mysql动态的库(DyNetMysql.dll) + 项目源码

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612655/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • [spring]spring的bean自动装配机制

    是spring满足bean依赖的一种方式 spring会在上下文中自动寻找,并自动给bean装配属性 spring的装配方式: (1)手动装配 在people类中依赖了cat和do…

    数据库 2023年6月16日
    086
  • vue导入UEditor报错问题分析

    直接上报错信息,如下。。。。 1.看看js是否导入 2.看看ue是否加入 F12 控制台输入则可看见那就是导入了,不是这个问题。 在查看问题的目标方向……….

    数据库 2023年6月6日
    0138
  • Mysql_范式入门

    MySQL 三大范式 为什么需要数据规范化 信息重复 更新异常 插入异常 无法正常显示信息 删除异常 丢失有效的信息 设计关系型数据库时,遵从不同的规范要求,设计出合理的关系型数据…

    数据库 2023年6月11日
    097
  • MySQL-过滤数据(WHERE语句)

    1、使用WHERE子句 在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名( FROM子句)之后给出,如下所示: 这条语句从products…

    数据库 2023年6月16日
    0131
  • 7、解决swagger测试接口报错:TypeError: Failed to execute ‘fetch‘ on ‘Window‘: Request with GET/HEAD method cannot have body

    一、Swagger报错: 1、报错类型: TypeError: Failed to execute ‘fetch’ on ‘Window&#82…

    数据库 2023年6月6日
    086
  • mysql中文乱码记录

    0.中文乱码 1.查看mysql中表结构 show create table log_data charset为utf8,代码端:通过gorm修改 在创建表时候修改( 这里在连接数…

    数据库 2023年5月24日
    096
  • day05-离线留言和离线文件

    多用户即时通讯系统05 4.编码实现04(拓展) 拓展功能: 实现离线留言,如果某个用户不在线 ,当登陆后,可以接收离线的消息 实现离线发文件,如果某个功能没有在线,当登录后,可以…

    数据库 2023年6月11日
    081
  • 最左前缀有手就会,那索引下推呢?

    联合指数的最左侧前缀原则属于高频面试题,大多数学生都必须知道,但不符合最左侧前缀的部分会发生什么(指数向下推) [En] The leftmost prefix principle…

    数据库 2023年5月24日
    087
  • Django配置redis缓存

    Django配置redis缓存 (1)首先安装django-redis pip install django-redis (2)在settings中配置如下所示: 改配置仅为示例,…

    数据库 2023年6月14日
    096
  • RadonDB MySQL Kubernetes 2.2.0 发布!

    摘要 RadonDB MySQL Kubernetes v2.2.0 于近日发布!该版本开始支持 MySQL 8.0,备份功能优化,并全面提升高可用稳定性。社区同步发起&#8221…

    数据库 2023年5月24日
    0107
  • Java 中的异常处理机制

    本篇文章主要介绍了 Java 中的异常 如何处理函数抛出的异常 处理异常的原则 异常处理时,性能开销大的地方 Java 语言在设计之初就提供了相对完善的异常处理机制。 我们首先介绍…

    数据库 2023年6月11日
    0105
  • MySQL 事务和锁

    事务概述 当多个用户访问相同的数据时,在更改数据的过程中,其他用户可能会同时发起更改请求,为了确保数据库记录的更新从一种一致性状态更改为另一种一致性状态,需要使用事务处理,它具有以…

    数据库 2023年5月24日
    069
  • DevOps

    Docker: ## 安装Docker yum remove docker docker-client docker-client-latest docker-common doc…

    数据库 2023年6月9日
    076
  • jsp规范

    jsp&#x89C4;&#x8303; 一。jsp介绍:来自于javaee规范里面的一种jsp规范制定了如何开发jsp文件代替响应对象将处理结果写入到响应体的开发流…

    数据库 2023年6月11日
    089
  • Java的try-resource

    原来是这个,这个是之前的try catch,包括最后进行关流等操作。 private String getBodyString(final ServletRequest reque…

    数据库 2023年6月11日
    074
  • MySQL的FIND_IN_SET函数

    语法:FIND_IN_SET(str,strlist) https://www.cnblogs.com/xiaoxi/p/5889486.html Original: https:…

    数据库 2023年6月16日
    062
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球