cc++调用mysql存储过程,并获得返回值

    技术2022-05-11  11

    文章来自:http://blog.csdn.net/jccz_zys/archive/2007/07/08/1682810.aspx

        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 * from student; +------+-----------+------+----------+ | 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_ret int,                # 返回结果        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 存储过程可以实现相当强大的功能,这里只是抛砖引玉的做一些实践,期望能够给大家一些帮助。也欢迎大家交流…

    最新回复(0)