njsuntop 发表于 2018-10-2 11:11:06

mysql api---从一个小例子开始mysql编程入门(1)

  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 -odm01_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_v0gxx_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+0x0): undefined reference to__gxx_personality_v0'
  分析:由undefined reference to `__gxx_personality_v0'可知没有链接 libstdc++.so,只需-lstdc++即可
  于是:
  MySQL开发环境GCC写法
  gcc -odm01_hello dm01_hello.c -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient -ldl -lpthread -lm -lrt-lstdc++
  以上一般针对64位系统出现的问题,对于32位系统无需这样,只需
  gcc -odm01_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_hellodm02_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.cdm02_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]
查看完整版本: mysql api---从一个小例子开始mysql编程入门(1)