mysql 预处理stmt操作(写入数据库和从数据库中取出)

stmt操作

stmt对于多次执行的语句比直接执行快,主要原因在于,仅对查询执行一次解析操作。在直接执行的情况下,每次执行语句时,均将进行查询。此外,由于每次执行预处理语句时仅需发送参数的数据,从而减少了网络通信量

stmt主要的介绍可以参考:

https://blog.csdn.net/zhouxinfeng/article/details/77891771

主要的操作是将MYSQL_BIND 与 查询的参数和查询的结果相绑定,再按行进行输出。

参见:http://blog.chinaunix.net/uid-24219701-id-1745030.html

写入:

MYSQL_STMT *stmt = mysql_stmt_init(conn); //创建MYSQL_STMT句柄

char *query = "insert into stu values(?, ?);";
if(mysql_stmt_prepare(stmt, query, strlen(query)))
{
	fprintf(stderr, "mysql_stmt_prepare: %s\n", mysql_error(conn));
	return -1;
}

int id; char name[20];
printf("id name: ");
scanf("%d %s", &id, name);

MYSQL_BIND params[2];
memset(params, 0, sizeof(params));
params[0].buffer_type = MYSQL_TYPE_LONG;
params[0].buffer = &id;
params[1].buffer_type = MYSQL_TYPE_STRING;
params[1].buffer = name;
params[1].buffer_length = strlen(name);


mysql_stmt_bind_param(stmt, params);
mysql_stmt_execute(stmt);           //执行与语句句柄相关的预处理

mysql_stmt_close(stmt);             
mysql_close(conn);

 

读出数据:

    MYSQL_STMT *stmt = mysql_stmt_init(conn); //创建MYSQL_STMT句柄
    char *query = "select * from stu;";

    if(mysql_stmt_prepare(stmt, query, strlen(query)))
    {
        fprintf(stderr, "mysql_stmt_prepare: %s\n", mysql_error(conn));
        return -1;
    }
 

    int id; char name[20];
    //printf("id name: ");
    //scanf("%d %s", &id, name);
 

    MYSQL_BIND params[2];
    memset(params, 0, sizeof(params));
    params[0].buffer_type = MYSQL_TYPE_LONG;
    params[0].buffer = &id;

    params[1].buffer_type = MYSQL_TYPE_STRING;
    params[1].buffer = name;
    params[1].buffer_length = sizeof(name);
 

    //mysql_stmt_bind_param(stmt, params);
    mysql_stmt_bind_result(stmt, params); //用于将结果集中的列与数据缓冲和长度缓冲关联(绑定)起来
    mysql_stmt_execute(stmt);           //执行与语句句柄相关的预处理
    mysql_stmt_store_result(stmt);      //以便后续的mysql_stmt_fetch()调用能返回缓冲数据
  

    while(mysql_stmt_fetch(stmt) == 0) //返回结果集中的下一行
    {    
        printf("%d\t%s\n", id, name);
    }

 
    mysql_stmt_close(stmt);             

    mysql_close(conn);

需要注意的是:

当要绑定的是字符串MYSQL_TYPE_VAR_STRING或是不定长的blob的时候,需要将长度设为0,再使用mysql_stmt_fetch_column 获取字段的真实长度分配内存。

(见https://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-fetch.html)

real_length= 0;

bind[0].buffer= 0;
bind[0].buffer_length= 0;
bind[0].length= &real_length
mysql_stmt_bind_result(stmt, bind);

mysql_stmt_fetch(stmt);
if (real_length > 0)
{
  data= malloc(real_length);
  bind[0].buffer= data;
  bind[0].buffer_length= real_length;
  mysql_stmt_fetch_column(stmt, bind, 0, 0);
}

本人参考各种实现,写了一个mysql的 c++封装类,源码下载: https://github.com/alongL/mysqlmgr

欢迎不吝赐教。

 

参考:

1.http://blog.chinaunix.net/uid-24219701-id-1745030.html

2.https://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-execute.html

3.https://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-fetch.html

4.https://github.com/cgy1992/mysql-cpp/

你可能感兴趣的:(c++)