Mysql数据库的操作(C编程)

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

Mysql数据库是一种开源的关系型数据库系统(RDBMS),使用常用的数据库管理语言-结构性查询语言(SQL)进行数据库管理.
Mysql数据库因为其速度 可靠性和适应性而备受关注.大多数人都认为再不需要事物话的处理情况下,Mysql是管理内容最好的选择. 当然在嵌入式系统中,Mysql数据库也得到了广泛应用.
以下我们将通过具体的C语言代码,详细说明Mysql数据库的操作:
一, API解析

1. MYSQL *mysql_init(MYSQL *mysql)
描述
分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。
返回值
初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。
错误
在内存不足的情况下,返回NULL2. mysql_real_connect()
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()必须成功完成。
参数的指定方式如下:
·         第1个参数应是已有MYSQL结构的地址。调用mysql_real_connect()之前,必须调用mysql_init()来初始化MYSQL结构。通过mysql_options()调用,可更改多种连接选项。请参见25.2.3.48节,“mysql_options()”。
·         “host”的值必须是主机名或IP地址。如果“host”是NULL或字符串"localhost",连接将被视为与本地主机的连接。如果操作系统支持套接字(Unix)或命名管道(Windows),将使用它们而不是TCP/IP连接到服务器。
·         “user”参数包含用户的MySQL登录ID。如果“user”是NULL或空字符串"",用户将被视为当前用户。在UNIX环境下,它是当前的登录名。在Windows ODBC下,必须明确指定当前用户名。请参见26.1.9.2节,“在Windows上配置MyODBC DSN”。
·         “passwd”参数包含用户的密码。如果“passwd”是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。这样,数据库管理员就能按特定的方式设置MySQL权限系统,根据用户是否拥有指定的密码,用户将获得不同的权限。
注释:调用mysql_real_connect()之前,不要尝试加密密码,密码加密将由客户端API自动处理。
·         “db”是数据库名称。如果db为NULL,连接会将默认的数据库设为该值。
·         如果“port”不是0,其值将用作TCP/IP连接的端口号。注意,“host”参数决定了连接的类型。
·         如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道。注意,“host”参数决定了连接的类型。
·         client_flag的值通常为0,但是,也能将其设置为下述标志的组合,以允许特定功能:
标志名称标志描述CLIENT_COMPRESS使用压缩协议。CLIENT_FOUND_ROWS返回发现的行数(匹配的),而不是受影响的行数。CLIENT_IGNORE_SPACE允许在函数名后使用空格。使所有的函数名成为保留字。CLIENT_INTERACTIVE关闭连接之前,允许interactive_timeout(取代了wait_timeout)秒的不活动时间。客户端的会话wait_timeout变量被设为会话interactive_timeout变量的值。CLIENT_LOCAL_FILES允许LOAD DATA LOCAL处理功能。CLIENT_MULTI_STATEMENTS通知服务器,客户端可能在单个字符串内发送多条语句(由‘;’隔开)。如果未设置该标志,将禁止多语句执行。CLIENT_MULTI_RESULTS通知服务器,客户端能够处理来自多语句执行或存储程序的多个结果集。如果设置了CLIENT_MULTI_STATEMENTS,将自动设置它。CLIENT_NO_SCHEMA禁止db_name.tbl_name.col_name语法。它用于ODBC。如果使用了该语法,它会使分析程序生成错误,在捕获某些ODBC程序中的缺陷时,它很有用。CLIENT_ODBC客户端是ODBC客户端。它将mysqld变得更为ODBC友好。CLIENT_SSL使用SSL(加密协议)。该选项不应由应用程序设置,它是在客户端库内部设置的。
对于某些参数,能够从选项文件获得取值,而不是取得mysql_real_connect()调用中的确切值。为此,在调用mysql_real_connect()之前,应与MYSQL_READ_DEFAULT_FILE或MYSQL_READ_DEFAULT_GROUP选项一起调用mysql_options()。随后,在mysql_real_connect()调用中,为准备从选项文件读取值的每个参数指定“无值”值:
·         对于host,指定NULL值或空字符串("")。
·         对于user,指定NULL值或空字符串。
·         对于passwd,指定NULL值。(对于密码,mysql_real_connect()调用中的空字符串的值不能被选项文件中的字符串覆盖,这是因为,空字符串明确指明MySQL账户必须有空密码)。
·         对于db,指定NULL值或空字符串
·         对于port,指定“0”值。
·         对于unix_socket,指定NULL值。
对于某一参数,如果在选项文件中未发现值,将使用它的默认值,如本节前面介绍的那样。
返回值
如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。
错误
·         CR_CONN_HOST_ERROR
无法连接到MySQL服务器。
·         CR_CONNECTION_ERROR
无法连接到本地MySQL服务器。
·         CR_IPSOCK_ERROR
无法创建IP套接字。
·         CR_OUT_OF_MEMORY
内存溢出。
·         CR_SOCKET_CREATE_ERROR
无法创建Unix套接字。
·         CR_UNKNOWN_HOST
无法找到主机名的IP地址。
·         CR_VERSION_ERROR
协议不匹配,起因于:试图连接到具有特定客户端库(该客户端库使用了不同的协议版本)的服务器。如果使用很早的客户端库来建立与较新的服务器(未使用“--old-protocol”选项开始的)的连接,就会出现该情况。
·         CR_NAMEDPIPEOPEN_ERROR
无法在Windows平台下创建命名管道。
·         CR_NAMEDPIPEWAIT_ERROR
在Windows平台下等待命名管道失败。
·         CR_NAMEDPIPESETSTATE_ERROR
在Windows平台下获取管道处理程序失败。
·         CR_SERVER_LOST
如果connect_timeout > 0,而且在连接服务器时所用时间长于connect_timeout秒,或在执行init-command时服务器消失。
3.  mysql_options()
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)
描述
可用于设置额外的连接选项,并影响连接的行为。可多次调用该函数来设置数个选项。
应在mysql_init()之后、以及mysql_connect()或mysql_real_connect()之前调用mysql_options()。
选项参量指的是你打算设置的选项。Arg参量是选项的值。如果选项是整数,那么arg应指向整数的值。
可能的选项值:
选项参量类型功能MYSQL_INIT_COMMANDchar *连接到MySQL服务器时将执行的命令。再次连接时将自动地再次执行。MYSQL_OPT_COMPRESS未使用使用压缩客户端/服务器协议MYSQL_OPT_CONNECT_TIMEOUTunsigned int *以秒为单位的连接超时。MYSQL_OPT_GUESS_CONNECTION未使用对于与libmysqld链接的应用程序,允许库“猜测”是否使用嵌入式服务器或远程服务器。“猜测”表示,如果设置了主机名但不是本地主机,将使用远程服务器。该行为是默认行为。 可使用MYSQL_OPT_USE_EMBEDDED_CONNECTION 和MYSQL_OPT_USE_REMOTE_CONNECTION覆盖它。对于与libmysqlclient链接的应用程序,该选项将被忽略。MYSQL_OPT_LOCAL_INFILE指向单元的可选指针如果未给定指针,或指针指向“unsigned int != 0”,将允许命令LOAD LOCAL INFILE。MYSQL_OPT_NAMED_PIPE未使用使用命名管道连接到NT平台上的MySQL服务器。MYSQL_OPT_PROTOCOLunsigned int *要使用的协议类型。应是mysql.h中定义的mysql_protocol_type的枚举值之一。MYSQL_OPT_READ_TIMEOUTunsigned int *从服务器读取信息的超时(目前仅在Windows平台的TCP/IP连接上有效)。MYSQL_OPT_RECONNECTmy_bool *如果发现连接丢失,启动或禁止与服务器的自动再连接。从MySQL 5.0.3开始,默认情况下禁止再连接,这是5.0.13中的新选项,提供了一种以显式方式设置再连接行为的方法。MYSQL_OPT_SET_CLIENT_IPchar *对于与libmysqld链接的应用程序(具备鉴定支持特性的已编译libmysqld),它意味着,出于鉴定目的,用户将被视为从指定的IP地址(指定为字符串)进行连接。对于与libmysqlclient链接的应用程序,,该选项将被忽略。MYSQL_OPT_USE_EMBEDDED_CONNECTION未使用对于与libmysqld链接的应用程序,对于连接来说,它将强制使用嵌入式服务器。对于与libmysqlclient链接的应用程序,,该选项将被忽略。MYSQL_OPT_USE_REMOTE_CONNECTION未使用对于与libmysqld链接的应用程序,对于连接来说,它将强制使用远程服务器。对于与libmysqlclient链接的应用程序,,该选项将被忽略。MYSQL_OPT_USE_RESULT未使用不使用该选项。MYSQL_OPT_WRITE_TIMEOUTunsigned int *写入服务器的超时(目前仅在Windows平台的TCP/IP连接上有效)。MYSQL_READ_DEFAULT_FILEchar *从命名选项文件而不是从my.cnf读取选项。MYSQL_READ_DEFAULT_GROUPchar *从my.cnf或用MYSQL_READ_DEFAULT_FILE指定的文件中的命名组读取选项。MYSQL_REPORT_DATA_TRUNCATIONmy_bool *通过MYSQL_BIND.error,对于预处理语句,允许或禁止通报数据截断错误(默认为禁止)。MYSQL_SECURE_AUTHmy_bool*是否连接到不支持密码混编功能的服务器,在MySQL 4.1.1和更高版本中,使用了密码混编功能。MYSQL_SET_CHARSET_DIRchar*指向包含字符集定义文件的目录的路径名。MYSQL_SET_CHARSET_NAMEchar*用作默认字符集的字符集的名称。MYSQL_SHARED_MEMORY_BASE_NAMEchar*命名为与服务器进行通信的共享内存对象。应与你打算连接的mysqld服务器使用的选项“-shared-memory-base-name”相同。
注意,如果使用了MYSQL_READ_DEFAULT_FILE或MYSQL_READ_DEFAULT_GROUP,总会读取客户端组。
选项文件中指定的组可能包含下述选项:
选项描述connect-timeout以秒为单位的连接超时。在Linux平台上,该超时也用作等待服务器首次回应的时间。compress使用压缩客户端/服务器协议。database如果在连接命令中未指定数据库,连接到该数据库。debug调试选项。disable-local-infile禁止使用LOAD DATA LOCAL。host默认主机名。init-command连接到MySQL服务器时将执行的命令。再次连接时将自动地再次执行。interactive-timeout等同于将CLIENT_INTERACTIVE指定为mysql_real_connect()。请参见25.2.3.51节,“mysql_real_connect()”。local-infile[=(0|1)]如果无参量或参量!= 0,那么将允许使用LOAD DATA LOCAL。max_allowed_packet客户端能够从服务器读取的最大信息包。multi-results允许多语句执行或存储程序的多个结果集。multi-statements允许客户端在1个字符串内发送多条语句。(由“;”隔开)。password默认密码。pipe使用命名管道连接到NT平台上的MySQL服务器。protocol={TCP | SOCKET | PIPE | MEMORY}连接到服务器时将使用的协议。port默认端口号。return-found-rows通知mysql_info()返回发现的行,而不是使用UPDATE时更新的行。shared-memory-base-name=name共享内存名称,用于连接到服务器(默认为"MYSQL")。socket默认的套接字文件。user默认用户。
注意,“timeout”(超时)已被“connect-timeout”(连接超时)取代,但为了保持向后兼容,在MySQL 5.1.2-alpha中仍支持“timeout”(超时)。
关于选项文件的更多信息,请参见4.3.2节,“使用选项文件”。
返回值
成功时返回0。如果使用了未知选项,返回非0值。
5.  mysql_errno()
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”表示未出现错误。
错误
无。
6.  mysql_error()
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终结的字符串。如果未出现错误,返回空字符串。
错误
无。
7.mysql_ping()
int mysql_ping(MYSQL *mysql)
描述
检查与服务器的连接是否工作。如果连接丢失,将自动尝试再连接。
该函数可被闲置了较长时间的客户端使用,用以检查服务器是否已关闭了连接,并在必要时再次连接。
返回值
如果与服务器的连接有效返回0。如果出现错误,返回非0值。返回的非0值不表示MySQL服务器本身是否已关闭,连接可能因其他原因终端,如网络问题等。
错误
·         CR_COMMANDS_OUT_OF_SYNC
以不恰当的顺序执行了命令。
·         CR_SERVER_GONE_ERROR
MySQL服务器不可用。
·         CR_UNKNOWN_ERROR
出现未知错误。
8. mysql_query()
int mysql_query(MYSQL *mysql, const char *query)
描述
执行由“Null终结的字符串”查询指向的SQL查询。正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。如果允许多语句执行,字符串可包含多条由分号隔开的语句。请参见25.2.9节,“多查询执行的C API处理”。
mysql_query()不能用于包含二进制数据的查询,应使用mysql_real_query()取而代之(二进制数据可能包含字符‘\0’,mysql_query()会将该字符解释为查询字符串结束)。
如果希望了解查询是否应返回结果集,可使用mysql_field_count()进行检查。请参见25.2.3.22节,“mysql_field_count()”。
返回值
如果查询成功,返回0。如果出现错误,返回非0值。
错误
·         CR_COMMANDS_OUT_OF_SYNC
以不恰当的顺序执行了命令。
·         CR_SERVER_GONE_ERROR
MySQL服务器不可用。
·         CR_SERVER_LOST
在查询过程中,与服务器的连接丢失。
·         CR_UNKNOWN_ERROR
出现未知错误。
9.mysql_use_result()
MYSQL_RES *mysql_use_result(MYSQL *mysql)
描述
对于成功检索数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN),必须调用mysql_store_result()或mysql_use_result()。
mysql_use_result()将初始化结果集检索,但并不像mysql_store_result()那样将结果集实际读取到客户端。它必须通过对mysql_fetch_row()的调用,对每一行分别进行检索。这将直接从服务器读取结果,而不会将其保存在临时表或本地缓冲区内,与mysql_store_result()相比,速度更快而且使用的内存也更少。客户端仅为当前行和通信缓冲区分配内存,分配的内存可增加到max_allowed_packet字节。
另一方面,如果你正在客户端一侧为各行进行大量的处理操作,或者将输出发送到了用户可能会键入“^S”(停止滚动)的屏幕,就不应使用mysql_use_result()。这会绑定服务器,并阻止其他线程更新任何表(数据从这类表获得)。
使用mysql_use_result()时,必须执行mysql_fetch_row(),直至返回NULL值,否则,未获取的行将作为下一个检索的一部分返回。C API给出命令不同步错误,如果忘记了执行该操作,将不能运行该命令。
不应与从mysql_use_result()返回的结果一起使用mysql_data_seek()、mysql_row_seek()、mysql_row_tell()、mysql_num_rows()或mysql_affected_rows(),也不应发出其他查询,直至mysql_use_result()完成为止。(但是,提取了所有行后,mysql_num_rows()将准确返回提取的行数)。
一旦完成了对结果集的操作,必须调用mysql_free_result()。
使用libmysqld嵌入式服务器时,由于在调用mysql_free_result()之前,内存使用将随着每个检索的行增加,内存效益将基本丧失。
返回值
MYSQL_RES结果结构。如果出现错误,返回NULL。
错误
如果成功,mysql_use_result()将复位mysql_error()和mysql_errno()。
·         CR_COMMANDS_OUT_OF_SYNC
以不恰当的顺序执行了命令。
·         CR_OUT_OF_MEMORY
内存溢出。
·         CR_SERVER_GONE_ERROR
MySQL服务器不可用。
·         CR_SERVER_LOST
在查询过程中,与服务器的连接丢失。
·         CR_UNKNOWN_ERROR
出现未知错误。
10.  mysql_fetch_row()
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。
错误
注意,在对mysql_fetch_row()的两次调用之间,不会复位错误。
·         CR_SERVER_LOST
在查询过程中,与服务器的连接丢失。
·         CR_UNKNOWN_ERROR
出现未知错误。

二, Mysql数据库C编程案例 (对学生表进行数据库管理)

#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>
#include <mysql/mysqld_error.h>
#include <unistd.h>

int main(int argc,char ** argv)
{
    MYSQL mysql;//可以说是mysql数据库的句柄
    char sql[128]={0};//保存sql语句
    int ret;//接收返回值
    MYSQL_RES *res;
    MYSQL_ROW row;


    /****** 初始化数据库 ******/
    mysql_init(&mysql);//实际上是初始化MYSQL结构

    /****** 连接数据库 ******/
    if(!mysql_real_connect(&mysql,"localhost","root","1","mysql",0,NULL,0)){
    /*
        note:localhost->本地链接
             root->数据库用户名
             1->密码
             mysql->数据库名
    */
        printf("%d ERROR: fail to mysql_real_connect->%d:%s\n",__LINE__,mysql_errno(&mysql),mysql_error(&mysql));
        return -1;
    }
    puts("connect OK!");

#if 1  //测试"show tables"命令使用
     if (mysql_query(&mysql, "show tables")) 
    {
            fprintf(stderr, "%s\n", mysql_error(&mysql));
            exit(1);
    }
    printf("MySQL Tables in mysql database:\n");

    res = mysql_use_result(&mysql);

    puts("-------------------------------------------------->");
    while ((row = mysql_fetch_row(res)) != NULL)
    {
        printf("%s \n", row[0]);
    }
    puts("<--------------------------------------------------");
#endif

    /****** 创建数据库 *******/
    ret=mysql_query(&mysql,"create table if not exists stu(id int not null primary key,name varchar(20) not null,score float not null)");
/*
    Note:创建一个stu表(不存在才创建)
         字段为:int类型的id字段(为键)
               varchar类型的name
               float 类型的score 且三个字段都不能为空
*/
    printf("line=%d    ret=%d\n",__LINE__,ret);
    if(ret != 0){
        printf("%d ERROR: fail to crate table->%d:%s\n",__LINE__,mysql_errno(&mysql),mysql_error(&mysql));
        return -1;
    }
    puts("crate table ok!");

    /****** 插入数据 ******/
    //插入一条数据
    ret=mysql_query(&mysql,"insert into stu (id,name,score) values(5,'lihua',56)");
    printf("line=%d    ret=%d\n",__LINE__,ret);
    if(ret != 0){//插入数据
            printf("%d ERROR: fail to insert->%d:%s\n",__LINE__,mysql_errno(&mysql),mysql_error(&mysql));
            if(mysql_errno(&mysql) == 1062){//字段不唯一
                puts("not Unique!");
            }
            else{
                return -1;
            }
    }
    puts("insert table ok!");   

    //插入一条数据
    ret=mysql_query(&mysql,"insert into stu (id,name,score) values(6,'haha',89)");
    printf("line=%d    ret=%d\n",__LINE__,ret);
    if(ret != 0){//插入数据
            printf("%d ERROR: fail to insert->%d:%s\n",__LINE__,mysql_errno(&mysql),mysql_error(&mysql));
            if(mysql_errno(&mysql) == 1062){//字段不唯一
                puts("not Unique!");
            }
            else{
                return -1;
            }
    }
    puts("insert table ok!");   

    //插入一条数据
    ret=mysql_query(&mysql,"insert into stu (id,name,score) values(7,'zhangsan',66)");
    printf("line=%d    ret=%d\n",__LINE__,ret);
    if(ret != 0){//插入数据
            printf("%d ERROR: fail to insert->%d:%s\n",__LINE__,mysql_errno(&mysql),mysql_error(&mysql));
            if(mysql_errno(&mysql) == 1062){//字段不唯一
                puts("not Unique!");
            }
            else{
                return -1;
            }
    }
    puts("insert table ok!");

    //插入一条数据
    ret=mysql_query(&mysql,"insert into stu (id,name,score) values(8,'huli',20)");
    printf("line=%d    ret=%d\n",__LINE__,ret);
    if(ret != 0){//插入数据
            printf("%d ERROR: fail to insert->%d:%s\n",__LINE__,mysql_errno(&mysql),mysql_error(&mysql));
            if(mysql_errno(&mysql) == 1062){//字段不唯一
                puts("not Unique!");
            }
            else{
                return -1;
            }
    }
    puts("insert table ok!");
//当然可以多条同时插入
#if 0
    ret=mysql_query(&mysql,"insert into stu (id,name,score) values(5,'lihua',56),(6,'haha',89),(7,'zhangsan',66),(8,'huli',20)");
    printf("line=%d    ret=%d\n",__LINE__,ret);
    if(ret != 0){//插入数据
            printf("%d ERROR: fail to insert->%d:%s\n",__LINE__,mysql_errno(&mysql),mysql_error(&mysql));
            if(mysql_errno(&mysql) == 1062){//字段不唯一
                puts("not Unique!");
            }
            else{
                return -1;
            }
    }
    puts("insert table ok!");   
#endif


    /****** 修改数据 ******/
    /*float score;
    int id;
    puts("input id>>>");
    scanf("%d",&id);
    puts("input score>>>");
    scanf("%f",&score);
    sprintf(sql,"update stu set score=%f where id=%d",score,id);
    ret=mysql_query(&mysql,sql);
    printf("line=%d    ret=%d\n",__LINE__,ret);
    if(ret != 0){//插入数据
    printf("%d ERROR: fail to insert->%d:%s\n",__LINE__,mysql_errno(&mysql),mysql_error(&mysql));
    if(mysql_errno(&mysql) == 1062){//字段不唯一
        puts("not Unique!");
    }
    else{
        return -1;
    }
    }
    puts("delete table ok!");*/

    /****** 删除数据 ******/
    /*sleep(5);
    ret=mysql_query(&mysql,"delete from stu where id=5");
    printf("line=%d    ret=%d\n",__LINE__,ret);
    if(ret != 0){//插入数据
            printf("%d ERROR: fail to insert->%d:%s\n",__LINE__,mysql_errno(&mysql),mysql_error(&mysql));
            if(mysql_errno(&mysql) == 1062){//字段不唯一
                puts("not Unique!");
            }
            else{
                return -1;
            }
    }
    puts("delete table ok!");*/


    /****** 查找数据 ******/
    //ret=mysql_query(&mysql,"select * from stu");
    //printf("line=%d    ret=%d\n",__LINE__,ret);
    if(mysql_query(&mysql,"select * from stu")){//查找表
        printf("%d ERROR: fail to select->%d:%s\n",__LINE__,mysql_errno(&mysql),mysql_error(&mysql));
        return -1;
    }

    res = mysql_use_result(&mysql);
    puts("-------------------------------------------------->");
    while ((row = mysql_fetch_row(res)) != NULL)
    {
        printf("%-10s  %-10s  %-10s\n", row[0],row[1],row[2]);
    }
    puts("<--------------------------------------------------");


    /****** 释放结果指针 ******/
    mysql_free_result(res);
    /****** 关闭数据库 ******/
    mysql_close(&mysql);


    return 0;
}

猜你喜欢

转载自blog.csdn.net/liebao_han/article/details/75195862