在c程序中使用mysql需包含下面的头文件:
#include <mysql/mysql.h>
按顺序调用下面的函数:
mysql *mysql_init(MYSQL *mysql)
这个函数用来分配或者初始化一个MYSQL对象,用于连接mysql服务端。如果你传入的参数是NULL指针,它将自动为你分配一个MYSQL对象,如果这个MYSQL对象是它自动分配的,那么在调用mysql_close的时候,会释放这个对象。那么,这就有可能出现一个问题,就是,当你主动调用mysql_close之后,可能因为某些原因,又调用一次mysql_close,第二次调用,有可能因为mysql已经是野指针导致程序崩溃。另外,在我的实际运用过程中,有出现一些api调用过程中出错时,自动调用了mysql_close的情况。由于这种自动调用不会被程序感知,因此程序主动close的时候会导致崩溃。为了安全起见,建议不要让mysql_init api自动创建MYSQL对象,而由自己管理这个对象,并且传入地址让它完成初始化,这样,即使你多次调用close函数,也不会出现程序崩溃的现象。
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 *为mysql_init函数返回的指针,host为null或 localhost时链接的是本地的计算机,当mysql默认安装在unix(或类unix)系统中,root账户是没有密码的,因此用户名使用root,密码为null,当db为空的时候,函数链接到默认数据库,在进行 mysql安装时会存在默认的test数据库,因此此处可以使用test数据库名称,port端口为0,使用 unix连接方式,unix_socket为null时,表明不使用socket或管道机制,最后一个参数经常设置为0
int mysql_select_db(MYSQL *mysql, const char *db)
使由db指定的数据库成为由mysql指定的连接上的默认数据库(当前数据库)。在后续查询中,该数据库将是未包含明确数据库区分符的表引用的默认数据库。返回0表示成功,非0值表示出现错误。(若在mysql_real_connect中已指定db,此函数也可不用调用)
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)
执行由“query”指向的SQL查询,它应是字符串长度字节“long”。正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(’;’)或“\g”。如果允许多语句执行,字符串可包含由分号隔开的多条语句。
如果查询成功,返回0。如果出现错误,返回非0值。
int mysql_query(MYSQL *mysql, const char *query)
执行由“Null终结的字符串”查询指向的SQL查询。正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(’;’)或“\g”。如果允许多语句执行,字符串可包含多条由分号隔开的语句。mysql_query()不能用于包含二进制数据的查询,应使用mysql_real_query()取而代之(二进制数据可能包含字符’\0’,mysql_query()会将该字符解释为查询字符串结束)。
MYSQL_RES *mysql_store_result(MYSQL *mysql)
将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。如果查询未返回结果集,mysql_store_result()将返回Null指针.如果读取结果集失败,mysql_store_result()还会返回Null指针。
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
检索结果集的下一行
void mysql_close(MYSQL *mysql)
关闭前面打开的连接。如果句柄是由mysql_init()或mysql_connect()自动分配的,mysql_close()还将解除分配由mysql指向的连接句柄。
const char *mysql_error(MYSQL *mysql)
对于由mysql指定的连接,对于失败的最近调用的API函数,mysql_error()返回包含错误消息的、由Null终结的字符串。如果该函数未失败,mysql_error()的返回值可能是以前的错误,或指明无错误的空字符串。