linux下mysql的操作与存储过程

来源:互联网 发布:如何软件绘制横道图 编辑:程序博客网 时间:2024/06/18 01:54

这里的大部分代码参考了MySQL发行包里面的.c源文件,大家也可以去里面找找相关的代码,下面这段代码实现了连接到本地MySQL服务器上9tmd_bbs_utf8数据库,从数据表tbb_user中根据输入的userid取得该用户的用户名并打印输出到终端。

 

#if defined(_WIN32) || defined(_WIN64) //为了支持windows平台上的编译

nclude

#endif

nclude

nclude

nclude "mysql.h" //我的机器上该文件在/usr/local/include/mysql

 

//定义数据库操作的宏,也可以不定义留着后面直接写进代码

#define SELECT_QUERY "select username from tbb_user where userid %d"

 

int main(int argc, char **argv) //char **argv相当于 char *argv[]

{

MYSQL mysql,*sock; //定义数据库连接的句柄,它被用于几乎所有的MySQL函数

MYSQL_RES *res; //查询结果集,结构类型

MYSQL_FIELD *fd //包含字段信息的结构

MYSQL_ROW row //存放一行查询结果的字符串数组

char qbuf[160]; //存放查询sql语句字符串

 

if (argc != 2) //检查输入参数

fprintf(stderr,"usage mysql_select \n\n");

exit(1);

}

 

mysql_init(&mysql);

if (!(sock mysql_real_connect(&mysql,"localhost","dbuser","dbpwd","9tmd_bbs_utf8",0,NULL,0))) {

fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(&mysql));

perror("");

exit(1);

}

 

sprintf(qbuf,SELECT_QUERY,atoi(argv[1]));

if(mysql_query(sock,qbuf)) {

fprintf(stderr,"Query failed (%s)\n",mysql_error(sock));

exit(1);

}

 

if (!(res=mysql_store_result(sock))) {

fprintf(stderr,"Couldn't get result from %s\n", mysql_error(sock));

exit(1);

}

 

printf("number of fields returned: %d\n",mysql_num_fields(res));

 

while (row mysql_fetch_row(res)) {

printf("Ther userid #%d 's username is: %s\n", atoi(argv[1]),(((row[0]==NULL)&&(!strlen(row[0]))) "NULL" row[0])) ;

puts( "query ok !\n" ;

}

 

mysql_free_result(res);

mysql_close(sock);

exit(0);

return 0; //.为了兼容大部分的编译器加入此行

}

编译的时候,使用下面的命令

 

gcc -o mysql_select ./mysql_select.c -I/usr/local/include/mysql -L/usr/local/lib/mysql -lmysqlclient (-lz) (-lm)后面两个选项可选,根据您的环境情况

运行的时候,执行下面的命令

 

./mysql_select 1

将返回如下结果:

 

number of fields returned: 1

Ther userid #1 's username is: Michael

query ok !




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存储过程可以实现相当强大的功能,这里只是抛砖引玉的做一些实践,期望能够给大家一些帮助。也欢迎大家交流…
0 0
原创粉丝点击