zoukankan      html  css  js  c++  java
  • 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 * 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存储过程可以实现相当强大的功能,这里只是抛砖引玉的做一些实践,期望能够给大家一些帮助。也欢迎大家交流…
  • 相关阅读:
    python学习day3--python基础
    python学习day2--python基础
    python学习day1--python基础
    包导入原则
    模块搜索路径
    继承顺序
    继承,派生,组合
    面向对象程序设计
    类和对象
    递归
  • 原文地址:https://www.cnblogs.com/cy163/p/1312277.html
Copyright © 2011-2022 走看看