1、初始化一个MYSQL结构
MYSQL *mysql_init(MYSQL *mysql)
2、关闭一个服务器连接,并释放与连接相关的内存
void mysql_close(MYSQL *mysql);
3、连接一个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 int client_flag);
参数说明:
host表示MYSQL服务器的主机名或IP
user表示登录的用户名
passwd表示登录的密码
db表示要连接的数据库
port表示MySQL服务器的TCP/IP端口
unix_socket表示连接类型
client_flag表示MySQL运行ODBC数据库的标记
函数返回值: 如果连接成功,一个MYSQL*连接句柄:如果连接失败,NULL
4、返回最新的UPDATE,DELETE或INSERT查询影响的行数
int mysql_query(MYSQL *mysql,const char *query);
query表示执行的SQL语句
函数返回值: 如果查询成功,为零,出错为非零。
补充:对于包含二进制数据的查询,必须使用mysql_real_query()而不是mysql_query(),这是因为,二进制数据可能会包含‘\0’字符。此外,mysql_real_query()比mysql_query()快,这是因为它不会在查询字符串上调用strlen()。
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length);
5、为无缓冲的结果集获得结果标识符
MYSQL_RES *mysql_use_result(MYSQL *mysql);
函数返回值: 一个MYSQL_RES结果结构, 如果发生一个错误发NULL
返回值给其他的函数引用。
6、存储查询结果
MYSQL_RES *mysql_store_result(MYSQL *mysql);
函数返回值: 一个MYSQL_RES结果结构, 如果发生一个错误发NULL
返回值给其他的函数引用。
注意:其中一个方式是通过调用 mysql_store_result()来一次性获得整个查询结果。整个函数从服务器数据库中获得所有的行,并保存在客户端中。第二个方式是通过调用mysql_use_result()来初始化一行一行的读取检索结果。这个函数只进行初始化,实际上并不会从服务器中获取任何的一行。
7、检索一个结果集合的下一行,行内值的数目由mysql_num_fields(result)给出。如果行中保存了调用mysql_fetch_row()返回的值,将按照row[0]到row[mysql_num_fields(result)-1],访问这些值的指针
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
下一行的一个MYSQL_ROW结构。
如果没有更多的行可检索或如果出现一个错误,NULL
在上面两个情况下,你可以通过调用 mysql_fetch_row()来获取每一行。使用mysql_store_result()时,mysql_fetch_row()函数获取每一行,其中数据之前就已经从服务器数据库中获得;使用mysql_use_result()时,mysql_fetch_row()函数实际上是从服务器数据库中实时获取每一行。可以调用mysql_fetch_lengths()来获取每一行数据的大小信息。
当你操作完result集合后,调用 mysql_free_result()来释放之前使用的内存。
8、返回指定结果集中列的数量(row(行),fields(列))
unsigned int mysql_num_fields(MYSQL_RES *res);
mysql_store_result()的其中一个优点是,因为所有的行已经从数据库中获取,因此你不仅可以顺序的获取每一行,还可以使用 mysql_data_seek()或者mysql_row_seek()来改变当前在result集合中读取的位置(行号)。你也可以通过调用 mysql_num_rows()来获知有多少行。另一方面,mysql_store_result()对内存的要求可能会很高(对于很大的result集合来说),因此,你会更大概率上遇到内存不够用的情况。
mysql_use_result()的一个优点是客户端只需要很少的内存空间来存放result集合,因为每次只需要存一行的数据(因为申请的内存空间少了,mysql_use_result()运行速度也更快了)。缺点是你必须快速处理每一行来避免过多占用服务器数据库,而且你也不能在result集合中随机访问每一行,你只能顺序的访问每一行。全部的总行数你是不知道的,直到全部检索完毕。还有,你必须全部检索完所有行,即使当你在中间部分已经找到了想要的结果。
API函数在不需要知道是否是一个SELECT语句的情况下,提供了客户端对操作语句的一个合适的响应。你可以在调用每个mysql_query() (或者 mysql_real_query())函数之后,再调用 mysql_store_result()。如果result集合调用成功,这个操作语句是一个SELECT语句,然后就可以读取每一行。如果返回结果为失败,那么调用 mysql_field_count() 来查看失败结果是否是实际所期待的(你想得到的结果就是失败)。如果mysql_field_count()返回0,操作语句不返回任何数据(说明操作语句是一个INSERT,UPDATE或者DELETE语句等等),因此也不会返回行数据。如果mysql_field_count()返回非零值,那么操作语句本应该返回数据,实际却没有返回。这个表明是一个SELECT操作语句,但是操作失败了。可以去mysql_field_count()查看如何处理这种情况。
mysql_store_result() 和 mysql_use_result() 都可以让你获取有关result集合的字段信息(字段的序号,名称和类型等)。你可以通过重复调用 mysql_fetch_field()来顺序的获取信息,或者调用 mysql_fetch_field_direct()(该函数需要给定序号)来获取某一序号的信息(不需要按顺序获取)。可以通过调用mysql_field_seek()来改变当前字段光标位置。也可以通过调用***mysql_fetch_fields()一次性获取全部字段***。表的“列”称为“字段
对于检测和报告错误,MySQL提供了获取用户信息的渠道,即使用 mysql_errno() 和 mysql_error() 两个函数。这两个函数为最新调用的函数提供了返回错误代号或者错误信息,可以让你知道错误什么时候发生和错误是什么。
9、创建一个数据库
int mysql_create_db(MYSQL *mysql,const char *db);
db:要创建的数据库名
如果数据库成功地被创建,返回零,如果发生错误,为非零。
10、选择一个数据库
int mysql_select_db(MYSQL *mysql,const char *db);
db:要创建的数据库名
如果数据库成功地被创建,返回零,如果发生错误,为非零。
示例:对数据库的基本操作(增删改查)
#include <stdio.h>
#include <mysql.h>
#include <string.h>
int main(int argc, const char *argv[])
{
MYSQL mysql;
MYSQL_RES *res = NULL;
MYSQL_ROW row;
char *query_str = NULL;
int rc, i, fields;
int rows;
if (NULL == mysql_init(&mysql))
{
printf("mysql_init(): %s\n", mysql_error(&mysql));
return -1;
}
if (NULL == mysql_real_connect(&mysql, "localhost", "root", "shallnet", "db_users", 0, NULL,0))
{
printf("mysql_real_connect(): %s\n", mysql_error(&mysql));
return -1;
}
printf("1. Connected MySQL successful! \n");
//执行插入请求
query_str = "insert into tb_users values (12345, 'justtest', '2015-5-5')";
rc = mysql_real_query(&mysql, query_str, strlen(query_str));
if (0 != rc)
{
printf("mysql_real_query(): %s\n", mysql_error(&mysql));
return -1;
}
//执行删除请求
query_str = "delete from tb_users where userid=10006";
rc = mysql_real_query(&mysql, query_str, strlen(query_str));
if (0 != rc)
{
printf("mysql_real_query(): %s\n", mysql_error(&mysql));
return -1;
}
//然后查询插入删除之后的数据
query_str = "select * from tb_users";
rc = mysql_real_query(&mysql, query_str, strlen(query_str));
if (0 != rc)
{
printf("mysql_real_query(): %s\n", mysql_error(&mysql));
return -1;
}
res = mysql_store_result(&mysql);
if (NULL == res)
{
printf("mysql_restore_result(): %s\n", mysql_error(&mysql));
return -1;
}
rows = mysql_num_rows(res);
printf("The total rows is: %d\n", rows);
fields = mysql_num_fields(res);
printf("The total fields is: %d\n", fields);
while ((row = mysql_fetch_row(res)))
{
for (i = 0; i < fields; i++)
{
printf("%s\t", row[i]);
}
printf("\n");
}
mysql_free_result(res);
mysql_close(&mysql);
return 0;
}