c/c++调用mysql存储过程
时间:2009-05-22 来源:sss0213
     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存储过程可以实现相当强大的功能,这里只是抛砖引玉的做一些实践,期望能够给大家一些帮助。也欢迎大家交流…
  
   相关阅读 更多 + 
    
  









