【MySql】Linux连接MySql && C_API

头文件:#include "/usr/include/mysql/mysql.h"

链接库: mysqlclient

/usr:存放操作系统软件资源所放置的目录,所有系统默认的软件都会放置到/usr

/usr/include:第三方库安装时,头文件就放在/usr/include


1、初始化mysql,为执行数据库连接( mysql_real_connect() )做准备

MYSQL *mysql_init(MYSQL *mysql)//
  • 返回值:成功返回一个MYSQL*连接句柄失败返回NULL(没有足够的内存来分配新对象)
  • 参数:如果mysql是NULL指针,则由函数进行分配(mysql是传出指针)
//1、
MYSQL *mysql = NULL;
if(mysql_init(mysql) == NULL)
{
    //error:错误处理
}

//2、
if( (mysql = mysql_init(NULL)) == NULL )
{
    //error:错误处理
}

 

2、与数据库进行连接

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*/
                          );
  • 返回值:成功返回MYSQL*连接句柄失败返回NULL
  • 第六个参数port:通常为0;如果port不为0,则该值用作TCP / IP连接的端口号。( host参数确定连接的类型)
  • 第七个参数unix_socket:通常为NULL;如果不为NULL,该字符串描述了应使用套接字或管道。( host参数确定连接的类型)
  • 第八个参数client_flag:通常为0;也能将其设置为下述标志的组合,以允许特定功能

    标志名称

    标志描述

    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,该选项不应由应用程序设置,而是在客户端库内部设置。

  • 错误码:可以用调用mysql_error(mysql)返回包含失败的最近调用的API函数的错误消息的字符串

    错误码

    错误描述

    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:错误处理
}

 

3、返回错误信息

const char *mysql_error(MYSQL *mysql)
  • 返回值:返回包含失败的最近调用的API函数的错误消息的字符串。如果函数没有失败,则返回值可以是先前的错误, 也可以是空字符串,表示没有错误。

 

4、执行sql语句

int mysql_query(MYSQL *mysql, const char *stmt_str)
  • 返回值:成功返回0失败返回非0值
  • 第一个参数:MYSQL*连接句柄
  • 第二个参数:sql语句(以NULL结尾的字符串)
  • 错误:可以用调用mysql_error(mysql)返回包含失败的最近调用的API函数的错误消息的字符串

    错误码

    错误描述

    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
        }	
    }
}

5、显示查询数据库中数据表的内容

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)//


 

 

 

 

 

 

 

你可能感兴趣的:(C,Linux,C)