当前位置:天才代写 > tutorial > C语言/C++ 教程 > c / c + +中如何挪用mysql存储进程

c / c + +中如何挪用mysql存储进程

2017-11-01 08:00 星期三 所属: C语言/C++ 教程 浏览:111

副标题#e#

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;  
       }


#p#副标题#e#

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++/

作者:csdn博客 微wx笑

 

    关键字:

天才代写-代写联系方式