C++连接MySQL数据库

一、 创建项目并配置所需头文件及库

(一)     创建空项目

使用VS2015创建空项目

(二)     添加项目所需头文件所在文件夹

右键项目选择属性,进入C/C++ => 常规 => 附加包含目录,添加D:\mysql-5.7.19-win64\include(根据自己安装的MySQL版本及地址填写)

 

 

(三)     添加所需库

仍在属性页,进入链接器 => 常规 => 附加库目录,添加D:\mysql-5.7.19-winx64\lib(根据自己情况填写)

 

 

(四)     添加libmysql.dll

在项目的.\x64\Debug\中添加libmysql.dll(从计算机的资源管理器中添加),该dll文件在D:\mysql-5.7.19-winx64\lib目录下

 

 

若为执行这步会出现以下错误:

 

二、 代码测试

(一)     添加项,将下列代码复制运行即可

#include "stdio.h"
#include "mysql.h"

int main()
{
    MYSQL * con; //= mysql_init((MYSQL*) 0); 
    MYSQL_RES *res;
    MYSQL_ROW row;
    char tmp[400];
    //database configuartion
    char dbuser[30] = "root";
    char dbpasswd[30] = "123456"; // it must be    changed
    char dbip[30] = "localhost";
    char dbname[50] = "hospital";
    char tablename[50] = "bl";
    char *query = NULL;

    int x;
    int y;
    int rt;//return value  
    unsigned int t;

    int count = 0;

    con = mysql_init((MYSQL*)0);

    if (con != NULL && mysql_real_connect(con, dbip, dbuser, dbpasswd, dbname, 3306, NULL, 0)) {
        if (!mysql_select_db(con, dbname)) {
            printf("Select successfully the database!\n");
            con->reconnect = 1;
            query = "set names \'GBK\'";
            rt = mysql_real_query(con, query, strlen(query));
            if (rt) {
                printf("Error making query: %s !!!\n", mysql_error(con));
            }
            else {
                printf("query %s succeed!\n", query);
            }
        }
    }
    else {
        MessageBoxA(NULL, "Unable to connect the database,check your configuration!", "", NULL);
    }

    //sprintf(tmp, "insert into %s values(%s,%d,%d)", tablename, "null", x, y); //注意如何向具有自增字段的数据库中插入记录
    sprintf(tmp, "insert into bl values(null,'x','x','x','x')");


    rt = mysql_real_query(con, tmp, strlen(tmp));
    if (rt)
    {
        printf("Error making query: %s !!!\n", mysql_error(con));
    }
    else
    {
        printf("%s executed!!!\n", tmp);
    }

    sprintf(tmp, "select * from %s", tablename);
    rt = mysql_real_query(con, tmp, strlen(tmp));
    if (rt)
    {
        printf("Error making query: %s !!!\n", mysql_error(con));
    }
    else
    {
        printf("%s executed!!!\n", tmp);
    }
    res = mysql_store_result(con);//将结果保存在res结构体中

    while (row = mysql_fetch_row(res)) {
        for (t = 0; t<mysql_num_fields(res); t++) {
            printf("%s  ", row[t]);
        }
        printf(".............\n");
        count++;
    }

    printf("number of rows %d\n", count);
    printf("mysql_free_result...\n");
    mysql_free_result(res);
    mysql_close(con);
    system("pause");
    return 0;
}

(二)     连接Mysql和从MySql中取出数据的部分API介绍

1.  mysql_real_connect()

1) 函数原型

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)

2) 参数及说明

• 第一个参数应该是一个现存MYSQL结构的地址。在调用mysql_real_connect()之前,你必须调用mysql_init()初始化MYSQL结构。见下面的例子。

• host值可以是一个主机名或一个IP地址。如果host是NULL或字符串"localhost",假定是到本地主机的一个连接。如果OS支持套接字(Unix)或命名管道(Win32),使用他们而不是TCP/IP与服务器连接。

• user参数包含用户的MySQL登录ID。如果user是NULL,假定是当前用户。在Unix下,它是当前登录名。在Windows ODBC下,必须明确地指定当前用户名字。见16.4 怎样填写ODBC管理程序中各种域。

• passwd参数为user包含口令。如果passwd是NULL,只有在user表中对于有一个空白口令字段的用户的条目将被检查一个匹配。这允许数据库主管设置MySQL权限,使用户获得不同的口令,取决于他们是否已经指定一个口令。注意:不要试图在调用mysql_real_connect()前加密口令;口令加密自动被客户API处理。

• db是数据库名。如果db不是NULL,连接将缺省数据库设置为这个值。

• 如果port不是0,值对于TCP/IP连接将用作端口号。注意host参数决定连接的类型。

• 如果unix_socket不是NULL,字符串指定套接字或应该被使用的命名管道。注意host参数决定连接的类型。

• client_flag值通常是0,但是在很特殊的情况下可以被设置为下列标志的组合:

标志名字 意味着的标志

CLIENT_FOUND_ROWS 返回找到的(匹配的)行数,不是受到影响的行数。

CLIENT_NO_SCHEMA 不允许db_name.tbl_name.col_name语法。这是为了ODBC;如果你使用该语法,导致语法分析器产生一个错误,它是为在一些ODBC程序捕捉错误是有用。

CLIENT_COMPRESS 使用压缩协议。

CLIENT_ODBC 客户是一个ODBC客户。这使mysqld变得对ODBC更友好。

该函数用于连接数据库

3) 返回值

如果连接成功,一个 MYSQL*连接句柄。如果连接失败,NULL。对一个成功的连接,返回值与第一个参数值相同,除非你传递NULL给该参数。

4) 错误

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;

不能在 Win32 上创建一个命名管道。

CR_NAMEDPIPEWAIT_ERROR;

不能在 Win32 上等待一个命名管道。

CR_NAMEDPIPESETSTATE_ERROR;

不能在 Win32 上得到一个管道处理器。

2.  mysql_select_db()

1) 函数原型

int mysql_select_db(MYSQL *mysql, const char *db)

2) 参数及说明

使得由db指定的数据库成为 在由mysql指定的连接上的缺省(当前)数据库。在随后的查询中,这个数据库对于不包括一个显式的数据库指定符的表的引用是缺省数据库。

除非连接的用户能被认证允许使用数据库,否则mysql_select_db()失败。

3) 返回值

成功,零。如果发生一个错误,非零。

4) 错误

CR_COMMANDS_OUT_OF_SYNC

命令以一个不适当的次序被执行。

CR_SERVER_GONE_ERROR

MySQL服务器关闭了。

CR_SERVER_LOST

对服务器的连接在查询期间失去。

CR_UNKNOWN_ERROR

发生一个未知的错误。

3.  mysql_real_query

1) 函数原型

int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)

2) 参数及说明

执行由query指向的SQL查询,它应该是一个length个字节的字符串。查询必须由一个单个的SQL语句组成。你不应该在语句后增加一个终止的分号(“;”)或\g。

对于包含二进制数据的查询,你必须使用mysql_real_query()而不是mysql_query(),因为二进制代码数据可能包含“\0”字符,而且,mysql_real_query()比mysql_query()更快,因为它对查询字符串调用strlen()。

3) 返回值

如果查询成功,零。如果发生一个错误,非零。

4) 错误

CR_COMMANDS_OUT_OF_SYNC

命令以一个不适当的次序被执行。

CR_SERVER_GONE_ERROR

MySQL服务器关闭了。

CR_SERVER_LOST

对服务器的连接在查询期间失去。

CR_UNKNOWN_ERROR

发生一个未知的错误。 

4.  mysql_store_result

1) 函数原型

MYSQL_RES *mysql_store_result(MYSQL *mysql)

2) 参数及说明

用于将mysql_real_query查询结果返回

3) 返回值

返回MYSQL_RES结构,如果获取失败则返回空

5.   mysql_fetch_row()

1) 函数原型

MYSQL_ROW *mysql_fetch_row(MYSQL_RES* res)

2) 参数及说明

用于读取MYSQL_RES

3) 返回值

返回表示MYSQL_RES的下一行的MYSQL_ROW

 

posted @ 2017-11-25 20:18  黑白条纹  阅读(64099)  评论(0编辑  收藏  举报