头文件:#include "/usr/include/mysql/mysql.h"
链接库: mysqlclient
/usr:存放操作系统软件资源所放置的目录,所有系统默认的软件都会放置到/usr
/usr/include:第三方库安装时,头文件就放在/usr/include
MYSQL *mysql_init(MYSQL *mysql)//
//1、
MYSQL *mysql = NULL;
if(mysql_init(mysql) == NULL)
{
//error:错误处理
}
//2、
if( (mysql = mysql_init(NULL)) == NULL )
{
//error:错误处理
}
MYSQL *mysql_real_connect(MYSQL *mysql /*指定现有的指向MYSQL结构的地址*/,
const char *host, /*主机名*/
const char *user, /*用户名*/
const char *password, /*密码*/
const char *db, /*数据库名*/
unsigned int port, /*0*/
const char *unix_socket, /*NULL*/
unsigned int client_flag /*0*/
);
port
不为0,则该值用作TCP / IP连接的端口号。( host
参数确定连接的类型)host
参数确定连接的类型) 标志名称 |
标志描述 |
CLIENT_COMPRESS |
使用压缩协议。 |
CLIENT_FOUND_ROWS |
返回发现的行数(匹配的),而不是受影响的行数。 |
CLIENT_IGNORE_SPACE |
允许在函数名后使用空格。使所有的函数名成为保留字。 |
CLIENT_INTERACTIVE |
关闭连接之前,允许interactive_timeout秒的不活动时间。 |
CLIENT_LOCAL_FILES |
允许LOAD DATA LOCAL处理功能。 |
CLIENT_MULTI_STATEMENTS |
通知服务器,客户端可能在单个字符串内发送多条语句。 |
CLIENT_MULTI_RESULTS |
通知服务器,客户端能够处理来自多语句执行。 |
CLIENT_NO_SCHEMA |
禁止db_name.tbl_name.col_name语法。 |
CLIENT_ODBC |
客户端是ODBC客户端。它将mysqld变得更为ODBC友好。 |
CLIENT_SSL |
使用SSL,该选项不应由应用程序设置,而是在客户端库内部设置。 |
错误码 |
错误描述 |
CR_CONN_HOST_ERROR | 无法连接到MySQL服务器 |
CR_CONNECTION_ERROR | 无法连接到本地MySQL服务器 |
CR_IPSOCK_ERROR | 无法创建IP套接字(unix_socket) |
CR_OUT_OF_MEMORY | 内存溢出 |
CR_SOCKET_CREATE_ERROR | 无法创建Unix套接字(unix_socket) |
CR_UNKNOWN_HOST | 无法找到主机名的IP地址(host) |
CR_VERSION_ERROR | 协议不匹配 |
CR_NAMEDPIPEOPEN_ERROR | 无法在Windows平台下创建命名管道(unix_socket) |
CR_NAMEDPIPEWAIT_ERROR | 在Windows平台下等待命名管道失败(unix_socket) |
CR_NAMEDPIPESETSTATE_ERROR | 在Windows平台下获取管道处理程序失败(unix_socket) |
CR_SERVER_LOST | 如果connect_timeout> 0,而且在连接服务器时所用时间长于connect_timeout秒,或在执行init-command时服务器消失。 |
char *host = "/*主机名*/";
char *user = "/*用户名*/";
char *password = "/*密码*/";
char *db = "/*数据库名*/";
if ((mysql_real_connect(mysql, host, user, password, db, 0, NULL, 0)) == NULL)
{
//error:错误处理
}
const char *mysql_error(MYSQL *mysql)
int mysql_query(MYSQL *mysql, const char *stmt_str)
错误码 |
错误描述 |
CR_COMMANDS_OUT_OF_SYNC | 命令以不正确的顺序执行 |
CR_SETVER_GONE_ERROR | MySQL服务器已经消失了 |
CR_SERVER_LOST | 查询期间丢失了与服务器的连接 |
CR_UNKNOWN_ERROR | 出现未知错误 |
使用mysql_field_count()检查语句是否返回结果集
if (mysql_query(mysql, sql) != 0)
{
//error:错误处理
}
//创建:
int create_index(char *sql)
{
if (mysql_query(mysql, sql) != 0)
{
//error
}
printf("创建成功...\n");
return 1;
}
//插入:
int insert_index(char *sql)
{
if (mysql_query(mysql, sql) != 0)
{
//error
}
printf("插入字段成功...\n");
return 1;
}
//删除
int delete_index(char *sql)
{
if (mysql_query(mysql, sql) != 0)
{
//error
}
printf("删除成功...\n");
return 1;
}
//查询:检查字段
int check_index(char *sql)
{
if (mysql_query(mysql, sql) != 0)
{
//error
}
else
{
res = mysql_use_result(mysql);
if(res)
{
if((row = mysql_fetch_row(res)) == NULL)//查询成功,处理查询返回的数据
{
mysql_free_result(res);
//return
}
else
{
mysql_free_result(res);
//return
}
}
else
{
//return
}
}
}
mysql_query() + mysql_store_result() / mysql_use_result()
调用之后mysql_query() 或者mysql_real_query()之后,必须调用mysql_store_result()或者my_use_result() 来产生一个结果集
......./*其他操作*/..........
+my_free_result()
完成结果集后,还必须调用my_free_result()释放结果集
//查询结果集
MYSQL_RES *res = NULL;
///////////////
MYSQL_RES *mysql_store_result(MYSQL *mysql)
//将查询的整个结果读取到客户端,将结果放入MYSQL_RES结构中
MYSQL_RES *mysql_use_result(MYSQL *mysql)
//启动结果集检索,必须通过调用mysql_fetch_row()来单独检索每一行,直到返回NULL值,
//否则未提取的行将作为下一个查询的结果集的一部分返回
MYSQL_RES
结果的指针。失败返回NULL
(语句未返回结果集或发生错误)mysql_store_result()和my_use_result() 的区别:
- mysql_store_result() 将查询的整个结果读取到客户端
- mysql_use_result() 直接从服务器读取查询结果,实际上并没有将结果集读取到客户端中(不会将其存储在临时表或本地缓冲区)这样会比mysql_store_result()更快并且使用的内存要少得多
为什么mysql_store_result()有时在mysql_query()返回Success后返回NULL?
有一个
malloc()
故障(例如,结果集过大)无法读取数据(连接发生错误)
该查询返回任何数据(例如,sql语句是INSERT,UPDATE,DELETE语句,返回的是空结果集)
+mysql_field_count() 从结果集获取列来知道语句是否应返回结果集
+mysql_fetch_fields() 从结果集获取表头
+mysql_fetch_row() 从结果集获取行
unsigned int mysql_field_count(MYSQL *mysql)
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
仅在mysql_store_result()查询之后可以使用:
+mysql_row_seek() 获取或设置结果集中的当前行位置
+mysql_row_tell() 获取或设置结果集中的当前行位置
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset)//
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result)//