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

转自http://blog.csdn.net/testcs_dn/article/details/19039953

mysql5.0支持存储过程后,现在mysql6.0Alpha 版本也是可用的。6.0不仅支持大型数据库(如 oracle和如此的大多数功能(如存储过程、视图、触发器、作业等,并修复了这些功能存在的bug,6.0.1 版还支持windows 64 位 和表空间。
C/c + + 要访问 mysql,只是一些简单的常用操作,c嵌入式简单查询、插入、更新和其他操作的使用可以。这些语句作为业务复杂、完整的业务功能需要的sql 操作,很大一部分是嵌入c 代码c 代码会导致更多和更复杂的不清楚这一次自然的存储过程来封装所有数据库逻辑思想,简单地通过调用mysql 存储的过程 c 接口可以实现他们的目标大大减少工作量的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- Character ID 1-digital id      
           #  
           out out_ret int,                # Returns the result   
           out out_name varchar(20),        # First name   
           out out_age   int                # Age       
    )  
    label_a:begin  
           declare v_name varchar(20) ;  
           declare v_age tinyint ;  
           # Parameters determine   
           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'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 的存储过程可以实现相当强大的功能,这里只是一些基本的用法,希望能给你一些帮助

7、个人使用经验心得

像C#调用都可以绑定输出参数,直接通过输出参数得到值,但是c++中使用prepare绑定输出参数,却返回以下错误信息:

Error Code: 1414. OUT or INOUT argument 2 for routine knockout_dbo.ko_SignUpYoungBoxer is not a variable or NEW pseudo-variable in BEFORE trigger

以下链接是找到的相关问题讨论:

http://forums.mysql.com/read.PHP?38,505961

http://bugs.mysql.com/bug.php?id=25970

下面是一个c++的MySQL封装

http://tangentsoft.NET/mysql++/

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值