mysql stmt

stmt主要的介绍可以参考: https://blog.csdn.net/zhouxinfeng/article/details/77891771 主要的操作是将MYSQL_BIND 与 查询的参数和查询的结果相绑定,再按行进行输出。 参见:http://blog.chinaunix.net/uid-24219701-id-1745030.html

函数:

MYSQL_STMT *mysql_stmt_init(MYSQL *mysql)    

    创建MYSQL_STMT句柄。对于该句柄,应使用mysql_stmt_close(MYSQL_STMT *)释放

int mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, unsigned long length)

准备字符串查询指向的SQL语句,并返回状态值。字符串长度应由“length”参量给出

my_bool mysql_stmt_bind_param(MYSQL_STMT *stmt, MYSQL_BIND *bind)

    用于为SQL语句中的参数标记符绑定数据

my_bool mysql_stmt_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind)

用于将结果集中的列与数据缓冲和长度缓冲关联(绑定)起来

int mysql_stmt_execute(MYSQL_STMT *stmt)

   执行与语句句柄相关的预处理查询

int mysql_stmt_store_result(MYSQL_STMT *stmt)

    以便后续的mysql_stmt_fetch()调用能返回缓冲数据

int mysql_stmt_fetch(MYSQL_STMT *stmt)

返回结果集中的下一行

my_bool mysql_stmt_close(MYSQL_STMT *)

    关闭预处理语句

MYSQL_RES *mysql_stmt_result_metadata(MYSQL_STMT *stmt)

描述

如果传递给mysql_stmt_prepare()的语句能够成生结果集,mysql_stmt_result_metadata()将以指针的形式返回结果集元数据,该指针指向MYSQL_RES结构,可用于处理元信息,如总的字段数以及单独的字段信息。该结果集指针可作为参量传递给任何基于字段且用于处理结果集元数据的API函数,如:

·         mysql_num_fields()

·         mysql_fetch_field()

·         mysql_fetch_field_direct()

·         mysql_fetch_fields()

·         mysql_field_count()

·         mysql_field_seek()

·         mysql_field_tell()

·         mysql_free_result()

完成操作后,应释放结果集结构,可通过将其传递给mysql_free_result()完成。它与释放通过mysql_store_result()调用获得的结果集的方法类似。

mysql_stmt_result_metadata()返回的结果集仅包含元数据。不含任何行结果。与mysql_stmt_fetch()一起使用语句句柄,可获取行。

返回值

MYSQL_RES结果结构。如果不存在关于预处理查询的任何元信息,返回NULL。

错误

·         CR_OUT_OF_MEMORY

内存溢出。

·         CR_UNKNOWN_ERROR

出现未知错误。

示例:

关于mysql_stmt_result_metadata()的用法,请参见MySql 中文文档 - 27.7.10.11 mysql_stmt_fetch() | Docs4dev中给出的示例。

MySQL :: MYSQL_BIND with C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql.h>
#include <errmsg.h>

#define QUERY "SELECT Symbol,GeneID,Refseq_dna FROM GIDCON_man WHERE EnsemblID like '%s'"

int main(int argc, char *argv[])
{
MYSQL *mysql;
MYSQL_STMT *stmt;
MYSQL_BIND bind[1];
MYSQL_BIND result[3];
MYSQL_RES *prepare_meta_result;

char int_data[20];
char int_result[4];
int int_result1;
char int_result2[20];
int affecteds_rows = 0;
int column_count;
int param_count;
unsigned long length;

int is_null;
char *server = "localhost";
char *user = "root";
char *password = ""; /* set me first */
char *database = "Id_list";

mysql = mysql_init(NULL);
mysql_real_connect(mysql, server,user, password, database, 0, NULL, 0);

stmt = mysql_stmt_init(mysql);

if (mysql_stmt_prepare(stmt, QUERY, strlen(QUERY)))
{
printf("error\n");
}

param_count = mysql_stmt_param_count(stmt);
bzero((char*) bind, sizeof(bind));


strcpy(int_data,"ENSG00000121410");
int size=strlen(int_data);

printf("Input=%s,%d \n",int_data,size);

memset(bind, 0, sizeof(bind));
bind[0].buffer_type = MYSQL_TYPE_BLOB;
bind[0].buffer = (char *)&int_data;
bind[0].buffer_length =sizeof int_data;
bind[0].is_null = 0;
bind[0].length =&length;


if (mysql_stmt_bind_param(stmt, bind))
{ printf("error\n"); }

prepare_meta_result = mysql_stmt_result_metadata(stmt);
column_count= mysql_num_fields(prepare_meta_result);

if (mysql_stmt_execute(stmt))
{ printf("error\n"); }


bzero((char*) result, sizeof(result));

result[0].buffer_type = MYSQL_TYPE_BLOB;
result[0].buffer = (char *)&int_result;
result[0].buffer_length =4;
result[0].is_null=0;
result[0].length = &length;


result[1].buffer_type = MYSQL_TYPE_LONG;
result[1].buffer = (char *)&int_result1;
result[1].is_null=0;
result[1].length = &length;

result[2].buffer_type = MYSQL_TYPE_BLOB;
result[2].buffer = (char *)&int_result2;
result[2].buffer_length =20;
result[2].is_null=0;
result[2].length = &length;


if (mysql_stmt_bind_result(stmt, result))
{ printf("error\n"); }
if (mysql_stmt_store_result(stmt))
{ printf("error\n"); }

while (!mysql_stmt_fetch(stmt))
{ printf("id = %s, %i,%s \n", int_result,int_result1,int_result2); }

mysql_free_result(prepare_meta_result);
mysql_stmt_close(stmt);
mysql_close(mysql);
return EXIT_SUCCESS;
}

g++ main.cpp   `mysql_config --cflags --libs`

一个例子

mysql 预处理stmt操作(写入数据库和从数据库中取出)_路边闲人2的博客-CSDN博客

GitHub - alongL/mysqlmgr: A good c++ wrapper for mysql c API. It use stmt prepare and is very easy to use.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值