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存储过程可以实现相当强大的功能,这里只是抛砖引玉的做一些实践,期望能够给大家一些帮助。也欢迎大家交流…
  • 相关阅读:
    Eclipse / android studio 添加第三方jar包 步骤
    Android checkbox 自定义点击效果
    Android 程序打包和安装过程
    Android 基础
    (转)Genymotion安装virtual device的“unable to create virtual device, Server returned Http status code 0”的解决方法
    (转)eclipse 导入Android 项目 步骤
    微信开放平台注册 步骤
    Android Studio 初级安装
    数组
    作用域问题代码
  • 原文地址:https://www.cnblogs.com/cy163/p/1312277.html
Copyright © 2011-2022 走看看