连接到数据库
mysql_init(MYSQL *pmysql);
MYSQL *mysql_real_connect(MYSQL * pmysql,const char * hostname,const char *usename,const char *passwd,const char *dbname,0,0,0);
连接到MySQL必须先调用mysql_init初始化
之后调用mysql_real_connect连接到数据库
mysql_real_connect成功返回指向MySQL连接的指针,失败返回NULL;
执行SQL语句
int mysql_query(MYSQL *pmysql,const char *sql);
参数pmysql是连接到mySQL的指针。
参数sql是要执行的SQL语句。
成功返回0,失败返回非0。
Linux下,printf函数必须以'\n'结尾才可以输出到屏幕,如果没有'\n'直到输出缓冲区满了以后才会打印到屏幕上(敲击换行也算),这里可以使用write函数代替。
//数据库编程
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "mysql/mysql.h"

#define GTC_DEBUG

#ifdef GTC_DEBUG
#define GTC_LOG(format,...) fprintf(stderr, format, ##__VA_ARGS__); fprintf(stderr, "\n")
#else
#define GTC_LOG(format,...)
#endif

/*
 * mysql编程步骤
 * 第一步:头文件 #include "mysql/mysql.h"
 * 第二步:makefile文件链接时添加动态库-lmysqlclient
 *
 *
 * 数据库client与server之间也是采用TCP/IP协议
 * 1.初始化client
 * 2.建立连接
 * 3.client向server发送SQL语句,server将执行SQL语句的结果返回client
 * 4.断开连接
 * */

int test()
{
    int errCode = 0;
    MYSQL *handler = NULL;

    /*
    知识补充:
        在一个非多线程的环境中,调用mysql_library_init()可能可以省略,因为 mysql_init()将在必要的时候自动调用它。
        然而mysql_library_init()在多线程环境中并不是安全的,mysql_init()自动调用mysql_library_init()时也同样不安全。
        因此,要么你在增加任何线程之前调用mysql_library_init(),要么使用mutex来保护这个调用(不管是直接调用mysql_library_init()
还是间接通过调用mysql_init()调用)。 这个步骤必须在任何其他客户端库调用之前完成。
*/ //1.全局初始化 mysql_library_init(0, NULL, NULL); do { /* 知识补充: 配或初始化与mysql_real_connect()相适应的MYSQL对象 如果mysql是NULL指针,该函数将分配、初始化、并返回新对象(即系统分配内存) 否则,将初始化对象,并返回对象的地址(即用户自己分配了内存) 如果mysql_init()是由系统分配内存,当调用mysql_close()来关闭连接时。将释放该内存 注意:如果是用户分配了内存,返回的对象就是用户定义变量的地址 */ //2.初始化句柄 handler = mysql_init(NULL); if (NULL == handler) { errCode = -1; GTC_LOG("fail: mysql_init"); break; } /* 知识补充: 如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。 对于成功的连接,返回值与第1个参数的值相同。 */ //3.连接数据库 if (NULL == mysql_real_connect(handler, "192.168.88.120", "root", "ynt#123456", "transaction", 3306, NULL, 0)) { errCode = -1; GTC_LOG("mysql: %s", mysql_error(handler)); break; } { // 4.设置自动重连 my_bool reconnect = 1; mysql_options(handler, MYSQL_OPT_RECONNECT, &reconnect); } //5.设置数据库连接(重要,如果不执行这个SQL语句,mysql不知道需要访问的数据库) mysql_select_db(handler, "transaction"); //6.字符集设置(重要,如果不执行这个SQL语句,数据库不能识别用户输入的sql语句中的中文) mysql_set_character_set(handler, "utf8mb4"); //7.数据库操作 } while (0); //资源释放 if (handler) { mysql_close(handler); handler = NULL; } //全局资源释放(重要,如果不执行mysql_library_end(),将会有部分资源不会被释放) mysql_library_end(); return errCode; } int main(int arg, char *args[]) { test(); printf("------ok-----\n"); return 0; }

 

mysql C语音API进行远程数据查询时,对sql语句的长度有限制,会报的错误经常是语法错误
例如
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right 
syntax to use near 'DROP TABLE default_gh11_1;DROP TABLE default_gh11_10;DROP TABLE d

 

执行SELECT语句得到查询结果
MYSQL_RES *mysql_store_result(MYSQL *pmysql);
成功返回一个查询结果指针,查询无结果或者错误返回NULL。
mysql_free_result(MYSQL_RES *res)
调用完mysql_store_result,一定要用mysql_free_result释放相关的资源。
查看查询结果
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
例子
while(row=mysql_fetch_row(result)!=NULL)
{
    printf("name:%s,sec:%s,age:%s,class:%s\n",row[0],row[1],row[2],row[3]);
}
尽管在表中age是数字,但是Mysql返回的只不过是以NULL结尾的字符串
//数据库编程
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <mysql/mysql.h>

int main(int arg, char *args[])
{
    MYSQL mysql, *connection;

    mysql_init(&mysql);
    connection = mysql_real_connect(&mysql, "localhost", "dbuser1", "123456",
            "db1", 0, 0, 0);
    if (connection == NULL)
    {
        /*mysql_error()打印错误原因*/
        printf("mysql_real_connect() failed ! error message:%s \n",
                mysql_error(&mysql));
        return -1;
    }
    /*执行任何mysql都必须设置字符集*/
    if (mysql_query(connection, "SET NAMES utf8") != 0)
    {
        printf("SET NAMES failed! \n");
    }
    /*mysql_query函数只适合更新操作,因为mysql_query()无法返回数据集,所以需要更多的处理*/
    if (mysql_query(connection, "SELECT * FROM table1") != 0)
    {
        printf("SELECT failed! \n");
    }
    /*
     * 调用mysql_store_result()获取查询结果,结果放到结构MYSQL_RES中
     * */
    MYSQL_RES *result = mysql_store_result(connection);
    if(result==NULL)
    {
        printf("mysql_store_result() failed! \n");
    }
    MYSQL_ROW row ;
    while(1)
    {
        row= mysql_fetch_row(result);
        if(row==NULL) break;
        printf("name:%s;sex:%s;age:%s;class:%s\n", row[0], row[1], row[2], row[3]);
    }
    //释放相关资源
    mysql_free_result(result);
    mysql_close(connection);
    return 0;
}

 

查看查询结果中的字段信息
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);
例子
while(sqlfield=mysql_fetch_field(result)!=NULL)
{
    printf("%s\n",sqlfield->name);
}
//数据库编程
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <mysql/mysql.h>

int main(int arg, char *args[])
{
    MYSQL mysql, *connection;

    mysql_init(&mysql);
    connection = mysql_real_connect(&mysql, "localhost", "dbuser1", "123456",
            "db1", 0, 0, 0);
    if (connection == NULL)
    {
        /*mysql_error()打印错误原因*/
        printf("mysql_real_connect() failed ! error message:%s \n",
                mysql_error(&mysql));
        return -1;
    }
    /*执行任何mysql都必须设置字符集*/
    if (mysql_query(connection, "SET NAMES utf8") != 0)
    {
        printf("SET NAMES failed! \n");
    }
    /*mysql_query函数只适合更新操作,因为mysql_query()无法返回数据集,所以需要更多的处理*/
    if (mysql_query(connection, "SELECT * FROM table1") != 0)
    {
        printf("SELECT failed! \n");
    }
    /*
     * 调用mysql_store_result()获取查询结果,结果放到结构MYSQL_RES中
     * */
    MYSQL_RES *result = mysql_store_result(connection);
    if(result==NULL)
    {
        printf("mysql_store_result() failed! \n");
    }
    /*这里的列是指SELECT查询结果的列,并非是指表所对应的列*/
    MYSQL_FIELD *field ;
    while(1)
    {
        field= mysql_fetch_field(result);
        if(field==NULL) break;
        printf("name=%s\n",field->name);
    }
    //释放相关资源
    mysql_free_result(result);
    mysql_close(connection);
    return 0;
}