c/c++调用mysql存储过程

c/c++调用mysql存储过程

c/c++调用mysql存储过程

mysql5.0以后就支持存储过程了,目前mysql的6.0Alpha版也已经推出。6.0不仅支持大型数据库如oracle等的绝大部分功能,如存储过程、视图、触发器、job等等,而且修正了这些功能所存在的bug,其中6.0.1还支持64位windows,以及表空间。

在c/c++中访问mysql,常见的只是一些简单的业务,使用c中嵌入简单的查询、插入、更新等操作即可。随着业务的复杂化,完成一个业务功能需要非常多的sql操作环节,把这些语句都嵌入c代码中会导致c代码越来越繁琐、不清晰,这时候,自然就想到了存储过程来封装所有的数据库逻辑,通过c简单调用mysql存储过程接口即可达到目的,极大地减轻了c程序员的工作量,也便于前端业务处理逻辑与数据库处理逻辑的分离。下面就介绍c语言调用存储过程的简单的方法。

1、首先创建一张表

用于存放用户信息

Create table student(

id int auto_increment,

name varchar(20),

age tinyint,

remark varchar(50),

primary key(id)

);

2、插入几条信息

Insert into student values(1,"zhouys",90, "");

commit;

3、查看用户信息

mysql> select * fromstudent;

+------+-----------+------+----------+

| id |name | age | remark |

+------+-----------+------+----------+

| 1 | zhouys| 90 | |

+------+-----------+------+-----------+

1 row in set (0.00 sec)

mysql>

4、创建存储过程

如下:

delimiter //

create procedure querystudent(

in in_id int , #0-字符id 1-数字id

#

out out_retint, #返回结果

out out_name varchar(20), #名字

out out_age int #年龄

)

label_a:begin

declare v_name varchar(20) ;

declare v_age tinyint ;

#参数判断

if (in_id<=0) then

set out_ret=-1; #id error

leave label_a;

end if;

SELECT name,age into v_name,v_age from student where id=in_id limit 1;

if v_age is NULL then

set out_ret=-2; #don't found

leave label_a;

end if;

set out_ret=0;

set out_name=v_name;

set out_age=v_age;

end;

//

delimiter ;

5、c语言调用存储过程

调用方法或步骤:

5.1、初始化Mysql句柄

if(!mysql_init(&mysql))

{

printf("mysql_init failed!\n");

return 0;

}

5.2、连接到mysql

//login or connect

if(!mysql_real_connect(&mysql,"localhost","root","","billingdb",0,NULL,CLIENT_MULTI_STATEMENTS))

{

printf("mysql_real_connect() failed!\n");

mysql_close(&mysql);

return 0;

}

5.3、调用存储过程

//call

strcpy(query,"call querystudent (1,@ret,@ out_name,@ out_age)");

printf("query sql=[%s]\n",query);

ret=mysql_real_query(&mysql,query,(unsigned int)strlen(query));

5.4、查询结果集并保存

mysql_query(&mysql,"SELECT @ret,@ out_name,@ out_age ");

//get result

if (ret)

{

printf("Error exec query: %s\n",mysql_error(&mysql));

}

else

{

printf("[%s] exec...\n", query);

}

results = mysql_store_result(&mysql);

5.5、获取查询结果

while((record =mysql_fetch_row(results))) {

printf("[%s]-[%s]-[%s]\n", record[0], record[1],record[2]);

}

一般存储过程只会有一行的返回结果,^_^.

5.6、释放资源与mysql连接句柄

mysql_free_result(results);

mysql_close(&mysql);

6、结束语

Mysql存储过程可以实现相当强大的功能,这里只是抛砖引玉的做一些实践,期望能够给大家一些帮助。也欢迎大家交流…

相关推荐

《魔兽世界》大女皇夏柯扎拉介绍
best365官网登录入口

《魔兽世界》大女皇夏柯扎拉介绍

📅 10-14 👀 4060
转转几天自动确认收货
天天365彩票软件官方下载3D

转转几天自动确认收货

📅 07-14 👀 9532
巴西队世界杯历史阵容回顾
best365官网登录入口

巴西队世界杯历史阵容回顾

📅 08-27 👀 5353
辅助装升级顺序:别乱出装害队友
天天365彩票软件官方下载3D

辅助装升级顺序:别乱出装害队友

📅 10-01 👀 1077
个人信用贷款最长年限及还款方式
天天365彩票软件官方下载3D

个人信用贷款最长年限及还款方式

📅 07-20 👀 3013
自定义注解(注解扫描)
beat365官方网站

自定义注解(注解扫描)

📅 08-19 👀 1693
自定义注解(注解扫描)
beat365官方网站

自定义注解(注解扫描)

📅 08-19 👀 1693
支付宝红包多久能扫?详解红包类型及使用规则
best365官网登录入口

支付宝红包多久能扫?详解红包类型及使用规则

📅 07-29 👀 1500
怎么计算装货柜?详解多种装柜计算方法
best365官网登录入口

怎么计算装货柜?详解多种装柜计算方法

📅 10-13 👀 3396