设为首页 收藏本站
查看: 682|回复: 0

[经验分享] mysql api---从一个小例子开始mysql编程入门(1)

[复制链接]

尚未签到

发表于 2018-10-2 11:11:06 | 显示全部楼层 |阅读模式
  C APIs包含在mysqlclient库文件当中,与MySQL的源代码一块发行,用于连接到数据库和执行数据库查询
  locate mysql.h   命令可以查看mysql.h 位于/user/include/mysql/mysql.h
  一个小例子来看一下mysql api 大概用法,用于打印hello world:
  int main()
  {
  int         ret = NULL;
  

MYSQL       mysql;  
MYSQL       *connect;
  
//MYSQL_RES     *res;
  
//MYSQL_ROW row;
  
//char      *query;
  
//int       t, r;
  

  
/*
  
if (mysql_library_init(0, NULL, NULL)) {
  fprintf(stderr, "could not initialize MySQL library\n");
  exit(1);
  
}
  
*/
  
mysql_init(&mysql);//初始化mysql
  
/*
  MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user,
  const char *passwd, const char *db, unsigned int port, const char *unix_socket,
  unsigned long client_flag)
  
*/
  

  
/*
  unsigned int mysql_errno(MYSQL *mysql);
  const char *mysql_error(MYSQL *mysql);
  
*/
  

  
connect = mysql_real_connect(&mysql, "localhost", "root", "mysql", "pos", 0, NULL, 0 );
  
if (connect == NULL)
  
{
  ret = mysql_errno(connect);
  printf("func mysql_real_connect() err\n");
  return ret;
  
}
  
else
  
{
  printf(" ok......\n");
  
}
  

  
printf("connect:%d &mysql:%d \n",connect, &mysql );
  

  
mysql_close(connect);
  

  
//mysql_library_end();
  

  }
  从上面可以看出有几个比较重要的函数
  (1)MYSQL mysql_init(MYSQL mysql)
  描述
  分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。
  返回值
  初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。
  错误
  在内存不足的情况下,返回NULL。
  (2) mysql_real_connect()
  MYSQL mysql_real_connect(MYSQL mysql, const char host, const char user, const char passwd, const char db, unsigned int port, const char *unix_socket, unsigned long client_flag)
  描述
  mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须成功完成。
  参数的指定方式如下:
  ·         第1个参数应是已有MYSQL结构的地址。调用mysql_real_connect()之前,必须调用mysql_init()来初始化MYSQL结构。通过mysql_options()调用,可更改多种连接选项。
  ·         “host”的值必须是主机名或IP地址。如果“host”是NULL或字符串"localhost",连接将被视为与本地主机的连接。如果操作系统支持套接字(Unix)或命名管道(Windows),将使用它们而不是TCP/IP连接到服务器。
  ·         “user”参数包含用户的MySQL登录ID。如果“user”是NULL或空字符串"",用户将被视为当前用户。在UNIX环境下,它是当前的登录名。在Windows ODBC下,必须明确指定当前用户名。
  ·         “passwd”参数包含用户的密码。如果“passwd”是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。这样,数据库管理员就能按特定的方式设置MySQL权限系统,根据用户是否拥有指定的密码,用户将获得不同的权限。
  注释:调用mysql_real_connect()之前,不要尝试加密密码,密码加密将由客户端API自动处理。
  ·         “db”是数据库名称。如果db为NULL,连接会将默认的数据库设为该值。
  ·         如果“port”不是0,其值将用作TCP/IP连接的端口号。注意,“host”参数决定了连接的类型。
  ·         如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道。注意,“host”参数决定了连接的类型。
  ·         client_flag的值通常为0,但是,也能将其设置为下述标志的组合,以允许特定功能:
  1.CLIENT_MULTI_STATEMENTS
  通知服务器,客户端可能在单个字符串内发送多条语句(由‘;’隔开)。如果未设置该标志,将禁止多语句执行。
  2.CLIENT_COMPRESS
  使用压缩协议。
  3.CLIENT_SSL
  使用SSL(加密协议)。该选项不应由应用程序设置,它是在客户端库内部设置的
  MySQL开发环境熟悉
  mysq的开发头文件目录为  /usr/include/mysql  可以用locate mysql.h或者find命令查看(find / -name "mysql.h" -type f -print)
  
  mysq的开发 动态库同上可以查找到libmysqlclient.so 在/usr/lib64/mysql下
  编译命令:
  gcc -o  dm01_hello dm01_hello.c -I/usr/include/mysql -L/usr/lib64/mysql –lmysqlclient (-I 指定头文件路径 -L指定库路径)
  典型错误1
  /
  /usr/lib64/mysql/libmysqlclient.a(dso_dlfcn.o): In function dlfcn_globallookup':dso_dlfcn.c:(.text+0x31): undefined reference todlopen'
  dso_dlfcn.c:(.text+0x44): undefined reference to dlsym'dso_dlfcn.c:(.text+0x4f): undefined reference todlclose'
  //libmysqlclient.a dlfcn_globallookup undefined reference to `dlopen'
  /
  分析:由dlopen ,dllsym可知缺少dl库 只需 编译时加上 -ldl
  典型错误2
  /
  dm01_hello.c:49: 警告:初始化将指针赋给整数,未作类型转换
  /usr/lib64/mysql/libmysqlclient.a(net_serv.cc.o):(.data.DW.ref.gxx_personality_v0[DW.ref.gxx_personality_v0]+0x0): undefined reference to __gxx_personality_v0'/usr/lib64/mysql/libmysqlclient.a(password.c.o): In functionscramble_323':
  /pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to floor'/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference tofloor'
  /pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to floor'/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference tofloor'
  /pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to floor'/usr/lib64/mysql/libmysqlclient.a(password.c.o):/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: more undefined references tofloor' follow
  /usr/lib64/mysql/libmysqlclient.a(my_getsystime.c.o): In function `my_getsystime':
  /
  分析: 由undefined reference to floor‘’ 可知缺少数学库,链接上数学库 -lm -lrt即可!典型错误3 dm01_hello.c:70: 警告:初始化将指针赋给整数,未作类型转换//导致没有链接 libstdc++.so/usr/lib64/mysql/libmysqlclient.a(net_serv.cc.o):(.data.DW.ref.__gxx_personality_v0[DW.ref.__gxx_personality_v0]+0x0): undefined reference to__gxx_personality_v0'
  分析:由undefined reference to `__gxx_personality_v0'可知没有链接 libstdc++.so,只需-lstdc++即可
  于是:
  MySQL开发环境GCC写法
  gcc -o  dm01_hello dm01_hello.c -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient -ldl -lpthread -lm -lrt  -lstdc++
  以上一般针对64位系统出现的问题,对于32位系统无需这样,只需
  gcc -o  dm01_hello dm01_hello.c -lmysqlclient 即可!
  因为32位环境下已经做了相应的工作!
  上面写的是不是很麻烦呢!有没有简单一点的写法呢?有,引入makefile
  MySQL开发环境makefile写法
  .PHONY:clean all  #声明为伪目标
  CC=gcc
  CFLAGS=-Wall -g
  LFLAGS=-L/usr/lib64/mysql -lmysqlclient -ldl -lpthread -lm -lrt -lstdc++
  BIN=dm01_hello  dm02_query
  all:$(BIN)
  %.o:%.c
  $(CC) $(CFLAGS)  -c $<  -o   $@
  dm01_hello:dm01_hello.o
  $(CC) $(CFLAGS) $^  $(LFLAGS) -o  $@
  dm02_query:dm02_query.o
  $(CC) $(CFLAGS) $^  $(LFLAGS) -o  $@
  clean:
  rm -f *.o $(BIN)
  大概说一下几个细节:
  %.o:%.c
  $(CC) $(CFLAGS)  -c $<  -o   $@
  其中%.o 和%.c会自动展开
  $@目标 $< 第一个依赖 $^所有依赖
  如上:
  dm01_hello.o dm02_query.o : dm01_hello.c  dm02_query.c
  gcc -Wall -g -c dm01_hello.c -o dm01_hello.o
  gcc -Wall -g -c dm02_query.c -o dm02_query.o
  大概就是这个意思
  

下面将接着说,请看下一节!  
mysql api---从一个小例子开始mysql编程入门(2)



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-607490-1-1.html 上篇帖子: 编译安装mysql, mysql官网下载源码包 下篇帖子: MySQL常用操作(2)MySQL用户管理、常用sql语句、 MySQL数据库备份恢复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表