首页 > 解决方案 > C - MySQL API 准备好的语句

问题描述

我已经完全按照这个MySQL 手册进行了操作,并对其稍作更改以尝试制作一个将 4 个值插入表中的程序。表的结构是:

MariaDB [(none)]> desc analytics.live;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| dat_sent     | int(11)     | NO   |     | NULL    |       |
| machine_id   | varchar(33) | YES  |     | NULL    |       |
| foreign_addr | varchar(50) | YES  |     | NULL    |       |
| con_state    | varchar(50) | YES  |     | NULL    |       |
| count        | int(11)     | NO   |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+

我已经编译了它,并且可以成功写入数据库。但是我很难理解如何将参数传递到脚本中。

我的目标是拥有它,以便我可以从 cli 以时尚的方式将 4 个参数传递到脚本中:-

./a.out 0 "989b3gf047196h2243bd395a97cde4c" "192.168.0.1" "ESTABLISHED"

此刻,代码库在这里:https ://pastebin.com/npP1C8uz

我的问题是,我将如何使它接受每个 argv[] 作为 INSERT 的一部分?

标签: mysqlcbashprepared-statement

解决方案


我只对字符串使用了一个数组,需要为每个字段使用一个数组(以及随附的计数)

得到它的工作:)

完成代码-

https://pastebin.com/WS1Qx050

我必须将每个字段绑定到它们自己的数据字符串。为此,我必须首先相应地定义每个字段:

    MYSQL *mysql = mysql_init(NULL);
    MYSQL_STMT    *stmt;
    MYSQL_BIND    bind[4];
    int           param_count;
    // short         small_data;

    int           f1_data;
    char          f2_data[STRING_SIZE];
    char          f3_data[STRING_SIZE];
    char          f4_data[STRING_SIZE];

    unsigned long f2_length;
    unsigned long f3_length;
    unsigned long f4_length; 

然后,在进入 INSERT 阶段之前,我将每个绑定的 .buffer 属性声明为指向其各自数组的指针。

 
    /* Bind data for all 4 parameters */
    memset(bind, 0, sizeof(bind));
 
    /* INTEGER PARAM */
    bind[0].buffer_type= MYSQL_TYPE_LONG;
    bind[0].buffer= (char *)&f1_data;
    bind[0].is_null= 0;
    bind[0].length= 0;
 
    /* STRING PARAM */
    bind[1].buffer_type= MYSQL_TYPE_STRING;
    bind[1].buffer= (char *)f2_data;
    bind[1].buffer_length= STRING_SIZE;
    bind[1].is_null= 0;
    bind[1].length= &f2_length;
 
    /* STRING PARAM */
    bind[2].buffer_type= MYSQL_TYPE_STRING;
    bind[2].buffer= (char *)f3_data;
    bind[2].buffer_length= STRING_SIZE;
    bind[2].is_null= 0;
    bind[2].length= &f3_length;
 
    /* STRING PARAM */
    bind[3].buffer_type= MYSQL_TYPE_STRING;
    bind[3].buffer= (char *)f4_data;
    bind[3].buffer_length= STRING_SIZE;
    bind[3].is_null= 0;
    bind[3].length= &f4_length;
 

这样做让我可以正确地将插入查询提交给 MySQL,在第 8 行定义的准备好的语句中填写所有的?


推荐阅读