Linux下mysql简单编程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31029351/article/details/72773539

一、获取错误信息

(1)unsigned int mysql_errno(MYSQL *mysql)
描述

对于由mysql指定的连接,mysql_errno()返回最近调用的API函数的错误代码,该函数调用可能成功也可能失败。“0”返回值表示未出现错误。在MySQL errmsg.h头文件中,列出了客户端错误消息编号。在附录B:错误代码和消息中,也列出了这些错误。

注意,如果成功,某些函数,如mysql_fetch_row()等,不会设置mysql_errno()。
经验规则是,如果成功,所有向服务器请求信息的函数均会复位mysql_errno()。

返回值
如果失败,返回上次mysql_xxx()调用的错误代码。“0”表示未出现错误。
错误
无。

(2)const char *mysql_error(MYSQL *mysql)

描述

对于由mysql指定的连接,对于失败的最近调用的API函数,mysql_error()返回包含错误消息的、由Null终结的字符串。如果该函数未失败,mysql_error()的返回值可能是以前的错误,或指明无错误的空字符串。

经验规则是,如果成功,所有向服务器请求信息的函数均会复位mysql_error()。

对于复位mysql_errno()的函数,下述两个测试是等效的:

if(mysql_errno(&mysql))
{

// an error occurred

}

if(mysql_error(&mysql)[0] != ‘\0’)
{

// an error occurred

}

通过重新编译MySQL客户端库,可以更改客户端错误消息的语言。目前,能够选择数种语言显示错误消息,请参见5.10.2节,“设置错误消息语言”。

返回值
返回描述错误的、由Null终结的字符串。如果未出现错误,返回空字符串。

错误
无。

二、连接服务器

(1)MYSQL *mysql_init(MYSQL *mysql)
描述
分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。
返回值

初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。
错误
(2)void mysql_close(MYSQL *mysql)

描述
关闭前面打开的连接。如果句柄是由mysql_init()或mysql_connect()自动分配的,mysql_close()还将解除分配由mysql指向的连接句柄。

返回值
无。

错误
无。
在内存不足的情况下,返回NULL。

(3)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_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须成功完成。

参数

Mysql *mysql:
第1个参数应是已有MYSQL结构的地址。调用mysql_real_connect()之前,必须调用mysql_init()来初始化MYSQL结构
const char *host:
“host”的值必须是主机名或IP地址。如果“host”是NULL或字符串”localhost”,连接将被视为与本地主机的连接。如果操作系统支持套接字(Unix)或命名管道(Windows),将使用它们而不是TCP/IP连接到服务器。
const char *user:
“user”参数包含用户的MySQL登录ID。如果“user”是NULL或空字符串”“,用户将被视为当前用户。在UNIX环境下,它是当前的登录名。
const char *passwd:
“passwd”参数包含用户的密码。如果“passwd”是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。这样,数据库管理员就能按特定的方式设置MySQL权限系统,根据用户是否拥有指定的密码,用户将获得不同的权限。
const char *db:
“db”是数据库名称。如果db为NULL,连接会将默认的数据库设为该值。
unsigned int port
如果“port”不是0,其值将用作TCP/IP连接的端口号。注意,“host”参数决定了连接的类型。
const char *unix_socket
如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道。注意,“host”参数决定了连接的类型。
unsigned long client_flag
client_flag的值通常为0,但是,也能将其设置为下述标志的组合.

返回值
如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。
错误
返回消息列表错误

三、数据查询

1、int mysql_query(MYSQL *mysql, const char *query) //执行SQL语句

描述
执行由“Null终结的字符串”查询指向的SQL查询。正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。
mysql_query()不能用于包含二进制数据的查询,应使用mysql_real_query()取而代之(二进制数据可能包含字符‘\0’,mysql_query()会将该字符解释为查询字符串结束)。

返回值
如果查询成功,返回0。如果出现错误,返回非0值。

2、MYSQL_RES *mysql_store_result(MYSQL *mysql)

描述
(1)mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。
(2)对于其他查询,不需要调用mysql_store_result()或mysql_use_result(),但是如果在任何情况下均调用了mysql_store_result(),它也不会导致任何伤害或性能降低。通过检查mysql_store_result()是否返回0,可检测查询是否没有结果集(以后会更多)。
(3)如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。
(4)如果读取结果集失败,mysql_store_result()还会返回Null指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。
(5)如果未返回行,将返回空的结果集。(空结果集设置不同于作为返回值的空指针)。
一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。
可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。
一旦完成了对结果集的操作,必须调用mysql_free_result()。

返回值
具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL。

3、MYSQL_RES *mysql_use_result(MYSQL *mysql)

(1)mysql_use_result()将初始化结果集检索,但并不像mysql_store_result()那样将结果集实际读取到客户端。它必须通过对mysql_fetch_row()的调用,对每一行分别进行检索。这将直接从服务器读取结果,而不会将其保存在临时表或本地缓冲区内,与mysql_store_result()相比,速度更快而且使用的内存也更少。客户端仅为当前行和通信缓冲区分配内存,分配的内存可增加到max_allowed_packet字节。

(2)使用mysql_use_result()时,必须执行mysql_fetch_row(),直至返回NULL值,否则,未获取的行将作为下一个检索的一部分返回。C API给出命令不同步错误,如果忘记了执行该操作,将不能运行该命令。

4、void mysql_free_result(MYSQL_RES *result)

描述:释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。
释放完成后,不要尝试访问结果集。
返回值 无。
错误 无。

5、MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result) //返回列的字段
描述
对于结果集,返回所有MYSQL_FIELD结构的数组。每个结构提供了结果集中1列的字段定义。

返回值
关于结果集所有列的MYSQL_FIELD结构的数组。

错误
无。

6、unsigned int mysql_num_fields(MYSQL_RES *result)
要想传递MYSQL*参量取而代之,请使用无符号整数mysql_field_count(MYSQL *mysql)。

描述
返回结果集中的列数。
注意,你可以从指向结果集的指针或指向连接句柄的指针获得行数。如果mysql_store_result()或mysql_use_result()返回NULL,应使用连接句柄(因而没有结果集指针)。在该情况下,可调用mysql_field_count()来判断mysql_store_result()是否生成了非空结果。这样,客户端程序就能采取恰当的行动,而不需要知道查询是否是SELECT语句(或类似SELECT的语句)。在下面的示例中,介绍了执行该操作的方式。
返回值
表示结果集中行数的无符号整数。
错误
无。

7、unsigned int mysql_field_count(MYSQL *mysql)

描述
返回作用在连接上的最近查询的列数。

该函数的正常使用是在mysql_store_result()返回NULL(因而没有结果集指针)时。在这种情况下,可调用mysql_field_count()来判定mysql_store_result()是否应生成非空结果。这样,客户端就能采取恰当的动作,而无需知道查询是否是SELECT(或类似SELECT的)语句。在这里给出的示例中,演示了完成它的方法。
返回值
表示结果集中列数的无符号整数。
错误
无。

8、MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

描述
检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。
行内值的数目由mysql_num_fields(result)给出。如果行中保存了调用mysql_fetch_row()返回的值,将按照row[0]到row[mysql_num_fields(result)-1],访问这些值的指针。行中的NULL值由NULL指针指明。
可以通过调用mysql_fetch_lengths()来获得行中字段值的长度。对于空字段以及包含NULL的字段,长度为0。通过检查字段值的指针,能够区分它们。如果指针为NULL,字段为NULL,否则字段为空。
返回值
下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL。

9、unsigned long *mysql_fetch_lengths(MYSQL_RES *result)

描述
返回结果集内当前行的列的长度。
如果打算复制字段值,该长度信息有助于优化,这是因为,你能避免调用strlen()。此外,如果结果集包含二进制数据,必须使用该函数来确定数据的大小,原因在于,对于包含Null字符的任何字段,strlen()将返回错误的结果。
对于空列以及包含NULL值的列,其长度为0。要想了解区分这两类情况的方法,请参见关于mysql_fetch_row()的介绍。
返回值
无符号长整数的数组表示各列的大小(不包括任何终结NULL字符)。如果出现错误,返回NULL。
错误
mysql_fetch_lengths()仅对结果集的当前行有效。如果在调用mysql_fetch_row()之前或检索了结果集中的所有行后调用了它,将返回NULL。

三、Mysql的事务处理

事务处理是用来维护数据库的完整性的,它保证成批的MySQL操作要么完全执行,要么完成不执行。

1、开启事务 START TRANSACTION
2、静止自动提交 set autocommit=0
3、开启自动提交事务 set autocommit=1
4、提交事务 commit
5、事务回滚 rollback

#define BEGIN_TRAN              "START TRANSACTION"
#define SET_TRAN                "SET AUTOCOMMIT=0" 
#define UNSET_TRAN              "SET AUTOCOMMIT=1"
#define COMMIT_TRAN            "COMMIT"
#define ROLLBACK_TRAN  "ROLLBACK"

int mysql_BeginTran(MYSQL *mysql)
{
        int ret = 0;

        //--执行事务开始SQL
        ret = mysql_query(mysql, BEGIN_TRAN);
        if (ret != 0)
        {
                printf("func mysql_query() err: %d\n", ret);
                return ret;
        }

        //--设置事务手动提交
        ret = mysql_query(mysql, SET_TRAN);
        if (ret != 0)
        {
                printf("func mysql_query() err: %d\n", ret);
                return ret;
        }

        return ret;
}


int mysql_Rollback(MYSQL *mysql)
{
        int ret = 0;

        //--事务回滚操作
        ret = mysql_query(mysql, ROLLBACK_TRAN);
        if (ret != 0)
        {
                printf("func mysql_query() err: %d\n", ret);
                return ret;
        }

        //--恢复事务自动提交标志
        ret = mysql_query(mysql, UNSET_TRAN);
        if (ret != 0)
        {
                printf("func mysql_query() err: %d\n", ret);
                return ret;
        }

        return ret;
}

int mysql_Commit(MYSQL *mysql)
{
        int ret = 0;

        //--执行事务提交SQL
        ret = mysql_query(mysql, COMMIT_TRAN);
        if (ret != 0)
        {
                printf("func mysql_query() err: %d\n", ret);
                return ret;
        }

        //--恢复自动提交设置
        ret = mysql_query(mysql, UNSET_TRAN);
        if (ret != 0)
        {
                printf("func mysql_query() err: %d\n", ret);
                return ret;
        }

        return ret;
}
#include <stdio.h>
#include <mysql/mysql.h>

MYSQL *Mysql_Init()
{
    //数据库句柄初始化
    MYSQL *mysql = mysql_init(NULL); //分配或初始化与mysql_real_connect()相适应的MYSQL对象。
    //如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。
    if(mysql == NULL)
    {
        printf("mysql_init error: %s\n",mysql_error(mysql));
        //对于由mysql指定的连接,对于失败的最近调用的API函数,mysql_error()返回包含错误消息的、由Null终结的字符串。
        return NULL;
    }

    //连接服务器

    MYSQL *conn = mysql_real_connect(mysql,"localhost","root","123456","my_db",0,NULL,0);

    if(conn == NULL)
    {
        printf("mysql_real_connect error : %s\n",mysql_error(mysql));
        return NULL;
    }

    printf("连接数据库my_db...\n");

    //设置中文显示,解决中文乱码的问题
    mysql_query(mysql,"set names utf8");

    return mysql;
}

int mysql_exec(MYSQL *mysql,const char *sql) //sql 为MYSQL语句
{
    //查询数据库
    int ret = mysql_query(mysql,sql);

    if(ret != 0)
    {
        printf("mysql_query error: %s\n",mysql_error(mysql));
        return -1;
    }

    //从数据库把数据下载到本地
    MYSQL_RES * mysql_res = mysql_store_result(mysql);
    //如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。
    if(mysql_res == NULL)
    {
        //通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,
        //或mysql_field_count()是否返回0,可以检查是否出现了错误。
        if(mysql_errno(mysql) == 0)
        {
            printf("\nQuery Ok\n");
            return 0;
        }
        else
        {
            printf("mysql_store_result : %s\n",mysql_error(mysql));
            return -1;
        }
    }

    //返回列数
    int i;
    unsigned char num_fields = mysql_num_fields(mysql_res);

    MYSQL_FIELD *fields = mysql_fetch_fields(mysql_res);

    for(i = 0; i < num_fields; i++)
    {
        printf("%-8s",fields[i].name);

    }
    printf("\n");

    //显示数据库的内容

    MYSQL_ROW row; //数组

    while(row = mysql_fetch_row(mysql_res))
    {
        for(i = 0; i < num_fields; i++)
        {
            printf("%-8s",row[i]);
        }
        printf("\n");
    }
}

int main()
{
    MYSQL *mysql = Mysql_Init();

    if(mysql == NULL)
    {
        printf("mysql_init error : %s\n",mysql_error(mysql));
        return -1;
    }

    mysql_exec(mysql,"select * from students");
    return 0;
}
阅读更多
换一批

没有更多推荐了,返回首页