温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-07-04 12:51:02 来源:网络 阅读:2034 作者:baiweibi 栏目:软件技术

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':<br/>dso_dlfcn.c:(.text+0x31): undefined reference todlopen'
dso_dlfcn.c:(.text+0x44): undefined reference to dlsym'<br/>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'<br/>/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'<br/>/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'<br/>/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'<br/>/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即可!<br/>典型错误3 <br/>dm01_hello.c:70: 警告:初始化将指针赋给整数,未作类型转换<br/>//导致没有链接 libstdc++.so<br/>/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)
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI