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字段 的相关文章

  • MySQL MIN/MAX 所有行

    我有桌子Races与行ID Name and TotalCP 我选择分钟 TotalCP FROM Races 但是我想选择具有最小值的整行 我如何在单个查询中做到这一点 从聚合值获取整行的一般形式是 SELECT FROM Races W
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl
  • gem install mysql:无法构建 gem 本机扩展 (Mac Lion)

    我为 Mac OS X Lion 安装了 MySQL 5 5 27 来自 dmg 现在我尝试安装 mysql gem gem install mysql Building native extensions This could take
  • MySQL 查询到 CSV [重复]

    这个问题在这里已经有答案了 有没有一种简单的方法来运行MySQL查询来自linux命令行并以csv格式输出结果 这就是我现在正在做的事情 mysql u uid ppwd D dbname lt lt EOQ sed e s g tee l
  • PDO PHP 连接,致命错误

    我的连接类 firstcode php class DB functions public db function construct try db new PDO mysql localhost dbname xxx charset ut
  • 如何使用 Perl 更改 mysql 密码

    我需要使用 Perl 脚本更改一些 mysql 密码 以下内容在更改数据库条目时有效 但是当我针对 mysql 用户更改修改它时 它将它们重置为空白密码 最后 刷新权限 也很好 但我还没有找到方法 usr bin perl use DBI
  • Bugzilla 中分离客户端的基本权限

    我正在尝试配置一个 Bugzilla 实例 这将允许我的客户登录并为其正在开发 维护的网站提交错误 例如 我创建了 2 个名为 TestProject TestProject2 的产品和一个名为 TestClient 的用户 我想要实现的是
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • POINT 列上的 MySQL INSERT/UPDATE

    我正在尝试用我国家的地理位置填充我的数据库 我的一张表有 4 个字段 ID PK 纬度 经度和地理点 EDIT SCDBs Punto Geografico SET lat 18 469692 SET lon 63 93212 SET g
  • 在mysql中的单个查询中更新多个表

    我有三个查询 我想要一个 这是我的查询 UPDATE tab1 SET a WHERE id 3 UPDATE tab2 SET b WHERE id 9 UPDATE tab3 SET c WHERE id 5 您可以尝试下面的代码 UP
  • 海量记录的bulk_create最佳实践

    I use bulk create将 1 mio 记录插入到新表中 需要 80 秒 Django 只使用一个 CPU 核心 大约 25 CPU 但没有一个核心达到 100 我相信有改进的潜力 这是代码 class Stock models
  • 在 C# 中,当有人插入、删除或修改记录时,如何从 MySQL 获取事件?

    我正在 WPF Net 中开发一个程序 我需要知道何时有人对数据库的任何表进行更改 这个想法是在数据库发生更改时从数据库接收一个事件 我读了很多文章 但找不到解决我的问题的方法 亲切的问候 最好的解决方案是使用消息队列 在您的应用程序向数据
  • 在 MySQL 中对整数字段运行带引号的数字(字符串)查询时会发生哪些复杂情况

    在 SQL 中 不应引用整数 因为如果引用 它将是一个字符串 但我很好奇如果我这样做会出现什么问题 并发症 例如 SELECT FROM table WHERE id 1 正确的 vs SELECT FROM table WHERE id
  • db:schema:load 与 db:migrate 使用 capistrano

    我有一个 Rails 应用程序 我正在将其移动到另一台服务器 我认为我应该使用 db schema load 来创建 mysql 数据库 因为这是推荐的 我的问题是我正在使用 capistrano 进行部署 并且它似乎默认为 rake db
  • 如何在 blob 类型中使用 UTF-8?

    我必须通过 csv 文件导出表 csv 文件数据来自服务器 按 Blob 类型 Blob size 2067 type text csv async exportDocumentsByCsv this commonStore setLoad
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • mysql转储到derby

    我正在使用 derby 在 eclipse 中进行开发 是否可以从 MySQL 转储表并以某种方式将其用于 derby 我知道 ddl 和 dml 对于两个 dbms 来说是不同的 但我正在寻找一种除了转储 导出之外的合适方法 我可以找到两
  • 每月获取记录,但如果该月没有记录,则为零

    如果我有以下 SQL 表 Tests id type receiveDate 1 Blood 2012 01 18 2 Blood 2012 01 20 3 Blood 2012 01 18 4 Blood 2012 03 01 5 Blo
  • 无法在 Mac 上启动 MySQL

    使用 Brew 安装后 我无法运行 MySQL 我使用的是 OS X El Capitan 版本 10 11 3 和 MySQL Server 版本 5 7 11 当我启动服务器时 我收到 启动 MySQL 错误 服务器退出而不更新 PID
  • ORDER BY 字段内的 MySQL 子查询。 (没有内连接)

    有很多与此相关的问题 但都具有使用内部联接的相同答案 这 我认为 在这里是不可能的 如果我错了请告诉我 我现在正在做的是调用两个不同的 mysql 查询来获取结果 它工作完美 db gt query SELECT FROM meta WHE

随机推荐

  • 树莓派 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