C语言写二进制数据到mysql的Blob字段

2023-05-16

 -- 引子--

  由于调试需要,需直接往数据库里写入二进制数据。本来这些数据是由上层软件来写的,用的是C#。为了熟悉C语言的数据库操作,还是决定用C来写这段调试代码。

概况:

  表名:Task

  涉及的字段及属性:

       NumDestint(11)  用于存储目标数目

       destIDs:   blob        用于存储具体的目标ID

废话不多说,入正题。



--二进制数据写入--

  二进制数据最为常见的就是图片等一些文件信息。虽然我这里不是这类型信息,但确实是二进制数据。

  具体步骤:

1、  定义一个buffer(如数组)来存储sql语句

2、  把涉及到二进制数据之前的sql语句添加到buffer中,可用sprintfstrcpy等。

3、  mysql_real_escape_string()函数添加二进制数据到buffer中。

4、  加上剩余的sql语句,形成完整的sql语句。

5、  利用mysql_real_query()函数来执行sql语句。

具体代码如下:


#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>
#include <stdint.h>
#include <string.h>

int main(int argc, char *argv[])
{
    MYSQL mysql;
    char sql[256], *end;
    int index, i;
    uint32_t *destIDs;

    if(argc != 2)
    {
        printf("enter error!\n");
        exit(1);
    }
    index = atoi(argv[1]);
    printf("index: %d\n", index);
    destIDs = (uint32_t *)malloc(index * sizeof(uint32_t));
    if(destIDs == NULL)
        printf("malloc error\n");
    for(i=0; i<index; i++)
        destIDs[i] = i + 1;
mysql_init(&mysql);
    if(!(mysql_real_connect(&mysql, "localhost", "root", "654321", "dbname", 0, NULL, 0)))
    {
        fprintf(stderr, "Couldn't connect to engine!\n%s\n", mysql_error(&mysql));
        perror("");
        exit(1);
    }
    
    sprintf(sql, "INSERT INTO Task(NumDest, DestIDs) VALUE (%u, ", index );
    end = sql + strlen(sql);
    *end++ = '\'';
    end += mysql_real_escape_string(&mysql, end,(char *)destIDs, index*sizeof(uint32_t));
    *end++ = '\'';
    *end++ = ')';

    printf("end - sql: %d\n", (unsigned int)(end - sql));

    if(mysql_real_query(&mysql, sql, (unsigned int)(end - sql)))
    {
        fprintf(stderr, "Query failed (%s)\n", mysql_error(&mysql));
        exit(1);
    }
mysql_close(&mysql);
    exit(0);
#endif
    return 0;
}




--读取二进制文件--

对于二进制文件的读取,也类似。

具体步骤:

    1,构造查询字串.

2,执行mysql _query查询. (网上有说用mysql_real_query,未实验)

3,mysql_store_result存储结果.

4,mysql_fetch_row取出一条记录处理.

具体代码如下:


#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <mysql/mysql.h>
#include <string.h>

int main(void)
{
    int ret, i;
    char sql[256];
    MYSQL mysql;
    MYSQL_RES *result;
    MYSQL_ROW row;
    uint32_t *destIDs, *temp;
    unsigned int destNum = 0;

    mysql_init(&mysql);
    if(!(mysql_real_connect(&mysql, "localhost", "root", "654321", "dbname", 0, NULL, 0)))
    {
        fprintf(stderr, "Couldn't connect to engine!\n%s\n",
                mysql_error(&mysql));
                perror("");
                exit(1);
    }

    sprintf(sql,
            "SELECT TaskID, NumDest, DestIDs FROM Task");
    ret = mysql_query(&mysql, sql);
    if(ret != 0)
    {
        printf( "Failed to query task table: %s\n",
                mysql_error(&mysql));
        return ret;
    }

    result = mysql_store_result(&mysql);
    if(result == NULL)
    {
        ret = mysql_errno(&mysql);
        printf( "Failed to store query result from task table:%s\n",
                mysql_error(&mysql));
        return ret;
    }

    if((row = mysql_fetch_row(result)) != NULL)
    {
        sscanf(row[1], "%u", &destNum);

        destIDs = (uint32_t *)malloc(destNum * sizeof(uint32_t));
        if(destIDs == NULL)
        {
            printf("malloc error!\n");
            exit(1);
        }
        memcpy(destIDs, row[2], destNum * sizeof(uint32_t));   
    }

    mysql_free_result(result);

    printf("destNum: %d\n", destNum);
    temp = destIDs;
    for(i=0; i<destNum; i++)
    {
        printf("destIDs[%d]:%d\t", i+1, *temp++);
    }

    return ret;
}


由于我这里可以根据NumDest获取到二进制的长度,所以不用再用函数去获取。

据网上信息,获取二进制信息长度应该这样:“如果取出来的是二进制的数据,要确定它的长度,必须要用mysql_fetch_lengths函数取得其长度”


int num_fields = mysql_num_fields(result);
        unsigned long *lengths = mysql_fetch_lengths(result);
        for(i=0; i<num_fields; i++)
            printf("Column: %u\t %lu bytes\n", i+1, lengths[i]);
        destIDs = (uint32_t *)malloc(lengths[2]);
        if(destIDs == NULL)
        {
            printf("malloc error!\n");
            exit(1);
        }
        memcpy(destIDs, row[2], lengths[2]);




才疏学浅,欢迎拍砖!
参考资源:
http://djy0011.blog.163.com/blog/static/138197453201083054918451/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言写二进制数据到mysql的Blob字段 的相关文章

随机推荐

  • 树莓派 Ubuntu mate 18.04 修改为清华源

    1 备份源 cp etc apt sources list etc apt sources list bck 2 root身份打开 etc apt sources list 将每个 http ports ubuntu com 都替换为 ht
  • 动手学深度深度学习-pycharm中配置mxnet开发环境

    1 文件准备 1 下载包含本书全部代码的压缩包 我们可以在浏览器的地址栏中输https zh d2l ai d2l zh 1 0 zip 下载后解压 2 由于近来 2019 05 05 国内conda源被迫关闭 xff0c 因此通过cond
  • dbm和db的关系与区别

    db是无量纲单位 xff0c 它表示两个信号之间的幅度差 dbm是有量纲单位 xff0c 它表示以1毫瓦为基准时的计量单位 1 dbm dbm是一个考征功率绝对值的值 xff0c 计算公式为 xff1a 10lg10 xff08 P 1mw
  • linux.和stm32驱动的区别

    linux下的驱动和stm32驱动的区别 xff1f stm32的驱动分为2部分 xff0c 初始化和发送接收数据 xff0c 这个理论概括了spi xff0c iic xff0c uart xff0c sdio xff0c usb 在li
  • SUMO入门(四) - 需求建模 车辆和路线的定义

    SUMO入门 四 需求建模 车辆和路线的定义 Demand Introduction to demand modelling in SUMO 在生成网络之后 xff0c 可以使用SUMO GUI来查看它 xff0c 但是没有汽车可以行驶 人
  • 图像处理特征可视化方法总结(特征图、卷积核、类可视化CAM)(附代码)

    一 前言 众所周知 xff0c 深度学习是一个 34 黑盒 34 系统 它通过 end to end 的方式来工作 xff0c 输入数据例如RGB图像 xff0c 输出目标例如类别标签 回归值等 xff0c 中间过程不可得知 如何才能打开
  • deian10 安装aptitude

    debian10系统不会默认安装aptitude xff0c 导致需要处理大量依赖关系的软件安装变得很麻烦 常规的apt源可以安装aptitude xff0c 但是需要手动处理大量的依赖包安装 可以通过如下apt源使用apt get来安装a
  • DJI OSDK开发笔记(N3飞控)(1)——开发工作流程

    DJI OSDK开发笔记 xff08 N3飞控 xff09 xff08 1 xff09 开发工作流程 API层次结构硬件设置一般设置数据串口 连接器引脚排列连接到记载计算机 软件环境设置所有平台下载SDK和所需工具更新固件启用OSDK AP
  • Windows Vista 交互式服务编程

    Windows Vista 对快速用户切换 xff0c 用户账户权限 xff0c 以及服务程序所运行的会话空间都作了很大的改动 xff0c 致使一些原本可以工作的程序不再能够正常工作了 xff0c 我们不得不进行一些改进以跟上 Vista
  • Windows2000 服务器端应用程序开发设计指南-信任成员的管理

    Microsoft的开发者已经完成Microsoft Windows 2000安全性特色的设计工作 xff0c 这些安全性特色比大多数人所习惯的环境更复杂且更有弹性 事实上 xff0c 若加上适当的管理和软件开发 xff0c Windows
  • NoDriveTypeAutoRun键值的作用

    常见的Autorun inf文件格式大致如下 xff1a AutoRun 表示AutoRun部分开始 xff0c 必须输入 icon 61 C ixigua ico 指定给C盘一个个性化的盘符图标C ico open 61 C ixigua
  • Windows系统调用架构分析—也谈KiFastCallEntry函数地址的获取 .

    为什么要写这篇文章 1 因为最近在学习 软件调试 这本书 xff0c 看到书中的某个调试历程中讲了Windows 的系统调用的实现机制 xff0c 其中讲到了从Ring3 跳转到Ring0 之后直接进入了KiFastCallEntry 这个
  • ubuntu rc.local不能正常运行

    查了下rc local有时不能正常运行的原因 xff1a Ubuntu默认将 bin sh链接到 bin dash xff0c 而 etc rc local脚本中用的正是 bin sh xff0c 导致出错 将默认的shell改成bash的
  • 关于建设symbol store的建议

    xfeff xfeff 一 symbol store的需求分析 xff1a 1 我们现在的调试环境严重依赖开发人员自己使用的开发环境 xff0c 缺点在于其他人要进行调试要么搭建一个同样的环境 xff0c 严重地占去大家不必要花费的工作时间
  • 进程防结束之PS_CROSS_THREAD_FLAGS_SYSTEM

    有人投到黑防去了 xff0c 不过黑防不厚道 xff0c 竟然没给完整的代码 xff0c 自己整理一份备用吧 xff0c 驱网 DebugMan 邪八的那群人直接飘过吧 这种方法的关键在于给线程的ETHREAD CrossThreadFla
  • CNN实现入侵检测(kdd99)

    文章目录 1 实验说明2 实验过程2 1 数据预处理2 1 1 导入数据2 1 2 one hot编码2 1 3 归一化2 1 4 标签编码 2 2 数据加载2 3 搭建模型2 4 模型训练 3 实验结果4 完整代码 1 实验说明 CNN模
  • All about VDIs

    This tutorial is an experiment to see if forum users find it useful to have a single collected reference for some common
  • PUTTY无法远程连接服务器故障解决

    对于一个刚刚了解putty工具的新手来说 xff0c 在putty工具使用中有时出现了问题而无法解决 今天就来介绍怎么解决putty无法远程连接服务器的故障 用putty远程连接服务器时 提示错误 server unexpectedlycl
  • 驱动中获取进程名的正确方法

    这是个古老的话题 xff0c 没有技术含量 xff0c 只不过看到网上很多驱动代码在获取进程名时总喜欢去读偏移 EPROCESS ImageFileName xff0c 感觉比较误导新人 这个方法其实很不科学 xff0c 硬编码偏移带来的兼
  • C语言写二进制数据到mysql的Blob字段

    引子 由于调试需要 xff0c 需直接往数据库里写入二进制数据 本来这些数据是由上层软件来写的 xff0c 用的是 C 为了熟悉 C 语言的数据库操作 xff0c 还是决定用 C 来写这段调试代码 概况 xff1a 表名 xff1a Tas