一、 创建项目并配置所需头文件及库
1.首先安装mysql
具体教程可以参考https://blog.csdn.net/zhouzezhou/article/details/52446608
注意安装产品的时候记得选择MySQL Connector C,如图
2.安装好mysql之后,就开始配置,点击项目->点击项目属性:
3.选择C/C++,在常规中的附加包含目录添加mysql安装地址中include文件的地址,如本人的是C:\Program Files\MySQL\MySQL Connector C 6.1\include,如图:
4.选择链接器,在常规中的附加库目录中添加mysql安装地址中lib文件的地址,如本人是C:\Program Files\MySQL\MySQL Connector C 6.1\lib,如图:
5.点击链接器中的输入,在附加依赖项中添加libmysql.lib,注意是libmysql.lib而不是libmysql.dll,如图:
6.然后把C:\Program Files\MySQL\MySQL Connector C 6.1\lib中的libmysql.dll复制到项目的x64中,如图:
注意路径
7.把运行平台改为x64,如图:
出现的问题
如果你只是下载了mysql sever,你会出现如下图所示无法定位序数3283的问题,解决方法是安装MySQL Connector C。
运行mysql的安装程序,在安装产品那里把MySQL Connector C勾上,再按照上面的流程来一遍就可以了。
二、 代码测试
(一) 添加项,将下列代码复制运行即可
#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