副标题#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笑