MySql 版本:MySql-5.6.16-winx64
VS版本:visual stadio 2010(以上)
Mysql_install_path = E:\wangdao\MySql\mysql-5.6.19-win32\mysql-5.6.19-winx64
我们只关心该目录下的include和lib两个文件夹。
①右键项目 ->属性->配置属性->C/C++ -> 常规 –>附件包含目录
编辑附加包含目录,将mysql_install_path目录下的include添加进来。
②新建一个C源文件。
输入:
#include
#include “mysql.h”
#include
#include
Int main()
{
System(“pause”);
Return 0 ;
}
保存该源文件。
编译连接。如果编译通过会在项目目录下产生一个debug目录(里面包含可执行程序)。该目录正是我们所需要的。
③将mysql_install_path目录下lib目录下的 libmysql.lib和libmysql.dll拷贝到上一步产生的debug目录下(libmysql.dll要和可执行程序在同一个目录下)。
右键项目->属性->配置属性->VC++目录 -> 库目录。
编辑库目录,将源文件编译产生的debug目录的路径添加进来。
④ 右键项目->属性->配置属性->连接器->输入->附加依赖项。
编辑附加依赖项,添加libmysql.lib
然后修改源程序
#include
#include "mysql.h"
#include
#include
#define HOST "127.0.0.1"
#define PORT 3306
#define USR "root"
#define PWD "123456"
#define DB "test"
#define TABLE1 "student"
#define TABLE2 "account"
int main()
{
MYSQL *con;
// char *myhost="127.0.0.1";
// char *myusr="root";
// char *mypwd="123456";
// char *mydb="test";
// char *mytable1="student";
// char *mytable2="account";
// int myport=3306;
MYSQL_RES *res;
MYSQL_ROW row;
char name[100]="liubin";
char sql_line[1024]="";
int rt,index_field,count;
con = mysql_init((MYSQL *)0);
if(!mysql_real_connect(con,HOST,USR,PWD,DB,PORT,NULL,0)) //mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接
{
printf("mysql connect failed !\n"); //连接失败返回NULL
system("pause");
exit(-1);
}
printf("connect successful!\n");
//select * from student;
sprintf(sql_line,"select * from %s where usr_name='%s' ",TABLE2,name); //使用语句数组赋值 table2 table2是表的名字
rt=mysql_real_query(con,sql_line,strlen(sql_line)); // 通过中间的的数组中的查询语句进行查询 参数 :MYSQL *mysql, const char *query, unsigned long length
if (rt) //
{
printf("mysql_real_query error !\n");
system("pause");
exit(-1);
}
else
{
res=mysql_store_result(con); //记录检索到的信息
//printf("Insert successful!\n");
//printf("Delete successful!\n");
//printf("Update successful!\n");
//count=0;
// row=mysql_fetch_row(res);
// printf("%s",row[1]);
while(row = mysql_fetch_row(res))
{
//printf("|");
for(index_field =0; index_field
下面是一些报错情况解决, 上面教程兼容32系统, 但在64位系统下需要修改一些东西
64位系统通过上面的配置依然会报错:
报错会出 错误如下:
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_close@4,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_fetch_row@4,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_store_result@4,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_query@8,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_real_connect@32,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_options@12,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_init@4,该符号在函数 _main 中被引用
解决方案:
第一步:
项目->属性->vc++目录。 在"包含目录"中添加"E:\wangdao\MySql\mysql-5.6.19-win32\mysql-5.6.19-winx64\include"
若编译依然不通过,报错后 按照下面方法:
我使用的系统是win8x64,MySQL 64位的lib也是64位的接口。所以解决方法如下:
项目->属性->配置管理器 活动解决方案平台 (对话框右上角),win32处 下拉选新建,
出现一个新的对号框,在键入选择新平台中选择X64
然后F5运行一下 找到当前程序所在目录
会生成一个新文件夹叫 X64 ,里面有一个新的Debug文件夹 , 将libmysql.lib 和libsql.dll放到新生成文件夹的Debug下
然后重新运行程序 成功。
下面是一些程序用的函数或者变量的讲解:
真正的连接
定义MYSQL结构体变量
MYSQL *CON;
然后是初始化连接
con = mysql_init((MYSQL *)0);
然后是真正的连接数据库
mysql_real_connect(con "HOST", "USR", "PWD", "DB", "PORT", 0, NULL);
第一个参数不说了;第二个参数是数据库所在的主机地址;第三、四个参数是用户名、密码;第五个参数是要连接的数据库名称;第六个参数是端口号,可以指定也可以赋为0;第七个参数是指定连接的套接字,也不用管;第八个参数一般情况下都是0。
注意函数的返回值和PHP的不一样。连接成功返回0,否则返回非0。出错信息可以调用sql_error(MYSQL* )来查看。
定义sql语句(最后没有分号):
char sqlbuf[100] = "select * from student ";
sprintf(sql_line,"select * from %s ",TABLE1);
下面让MySQL执行sql语句:
rt=mysql_real_query(con,sql_line,strlen(sql_line));
该函数也是成功(即使没有查询到数据)返回0,失败返回非0。
查询到了数据后就是获取查询结果了,这里还要定义两个结构体:查询结果结构体和记录结构体(保存一条记录)
MYSQL_RES *res;
MYSQL_ROW row; // 本质上就是二维数组
获取查询结果
res = mysql_store_result(con);
获取每一条记录
while (row = mysql_fetch_row(res))
{
for(index_field =0; index_field
printf("%-10s|\t",row[index_field]);
}
// 添加自己的存储查询结果代码
}
释放查询结果:
mysql_free_result(res);
关闭MySQL连接:
mysql_close(con);
如果是INSERT、UPDATE等非查询语句mysql_real_query()就可以结束了,因为没有结果可存。
下面是一下文件中用的函数的文档摘要:
参考MySQL shou手册API和库
MYSQL *mysql_init(MYSQL *mysql)
描述
分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。
返回值
初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。
错误
在内存不足的情况下,返回NULL。
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()调用,可更改多种连接选项。。
· “host”的值必须是主机名或IP地址。如果“host”是NULL或字符串"localhost",连接将被视为与本地主机的连接。如果操作系统支持套接字(Unix)或命名管道(Windows),将使用它们而不是TCP/IP连接到服务器。
· “user”参数包含用户的MySQL登录ID。如果“user”是NULL或空字符串"",用户将被视为当前用户。在UNIX环境下,它是当前的登录名。在Windows ODBC下,必须明确指定当前用户名。
· “passwd”参数包含用户的密码。如果“passwd”是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。这样,数据库管理员就能按特定的方式设置MySQL权限系统,根据用户是否拥有指定的密码,用户将获得不同的权限。
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)
描述
执行由“query”指向的SQL查询,它应是字符串长度字节“long”。正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。如果允许多语句执行,字符串可包含由分号隔开的多条语句。
对于包含二进制数据的查询,必须使用mysql_real_query()而不是mysql_query(),这是因为,二进制数据可能会包含‘\0’字符。此外,mysql_real_query()比mysql_query()快,这是因为它不会在查询字符串上调用strlen()。
如果希望知道查询是否应返回结果集,可使用mysql_field_count()进行检查mysql_field_count()
返回值
如果查询成功,返回0。如果出现错误,返回非0值。
错误
· CR_COMMANDS_OUT_OF_SYNC
以不恰当的顺序执行了命令。
· CR_SERVER_GONE_ERROR
MySQL服务器不可用。
· CR_SERVER_LOST
在查询过程中,与服务器的连接丢失。
· CR_UNKNOWN_ERROR
出现未知错误。
MYSQL_RES *mysql_store_result(MYSQL *mysql)
描述
对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result() 。
对于其他查询,不需要调用mysql_store_result()或mysql_use_result(),但是如果在任何情况下均调用了mysql_store_result(),它也不会导致任何伤害或性能降低。通过检查mysql_store_result()是否返回0,可检测查询是否没有结果集(以后会更多)。
如果希望了解查询是否应返回结果集,可使用mysql_field_count()进行检查。
mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。
如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。
如果读取结果集失败,mysql_store_result()还会返回Null指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。
如果未返回行,将返回空的结果集。(空结果集设置不同于作为返回值的空指针)。
一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。
可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。
一旦完成了对结果集的操作,必须调用mysql_free_result()。
返回值
具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL。
错误
如果成功,mysql_store_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
出现未知错误。
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
出现未知错误。
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的语句)。在下面的示例中,介绍了执行该操作的方式。
返回值
表示结果集中行数的无符号整数。
错误
无。
void mysql_free_result(MYSQL_RES *result)
描述
释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。
释放完成后,不要尝试访问结果集。
返回值
无。
错误
无。
void mysql_close(MYSQL *mysql)
描述
关闭前面打开的连接。如果句柄是由mysql_init()或mysql_connect()自动分配的,mysql_close()还将解除分配由mysql指向的连接句柄。
返回值
无。
错误
无。