不想用ODBC什么的连接数据库,想直接用MySQL提供的接口连接数据库。我用的是VS2005。
网上的一些介绍都是修改项目属性等的设置,我不喜欢那样。首先 我们需要的文件有mysql.h my_alloc.h my_list.h mysql_com.h mysql_time.h mysql_version.h typelib.h 以及libmysql.lib和libmysql.dll全拷到项目文件夹下。 以上提到的文件都在MySQL安装目录下,比如我的是:C:\Program Files\MySQL\MySQL Server 5.5。.h文件在include目录下; .lib和.dll文件在lib目录下。
准备好后,首先包含头文件和链接MySQL库,这里要注意不要忘记包含winsock.h,这是连接数据库必须的,从WorkBench连接数据库时弹出的对话框可以看出是通过TCP连接的。
#include "mysql.h"
#include <winsock.h>
#pragma comment(lib, "libmysql.lib")
定义两个MYSQL结构体变量
MYSQL mysql, *sock;
下面是初始化连接
mysql_init(&mysql);
主要给结构体内的元素赋初值。
接下来是真正的连接
mysql_real_connect(&mysql, "localhost", "USERNAME", "PASSWORD", "DBNAME", NULL, 0, NULL);
第一个参数不说了;第二个参数是数据库所在的主机地址;第三、四个参数是用户名、密码;第五个参数是要连接的数据库名称;第六个参数是端口号,可以指定也可以赋为0;第七个参数是指定连接的套接字,也不用管;第八个参数一般情况下都是0。
注意函数的返回值和PHP的不一样。连接成功返回0,否则返回非0。出错信息可以调用sql_error(MYSQL* )来查看。
定义sql语句(最后没有分号):
char sqlbuf[100] = "SELECT Device_Route FROM Device";
下面让MySQL执行sql语句:
mysql_query(sock, sqlbuf);
该函数也是成功(即使没有查询到数据)返回0,失败返回非0。
查询到了数据后就是获取查询结果了,这里还要定义两个结构体:查询结果结构体和记录结构体(保存一条记录)
MYSQL_RES *res;
MYSQL_ROW row; // 本质上就是二维数组
获取查询结果
res = mysql_store_result(sock);
获取每一条记录
while (row = mysql_fetch_row(res))
{
// 添加自己的存储查询结果代码
}
释放查询结果:
mysql_free_result(res);
关闭MySQL连接:
mysql_close(sock);
sock = NULL;
如果是INSERT、UPDATE等非查询语句到mysql_query()就可以结束了,因为没有结果可存。
完整的实现如下:
#include <winsock.h> #include "accessMySQL.h" #include "mysql.h" void main() { MYSQL mysql, *sock; mysql_init(&mysql); if (!(sock = mysql_real_connect(&mysql, "localhost", "root", "******", "MYDB", 0, NULL, 0))) { printf("Cannot connect to database:%s\n",mysql_error(sock)); return false; } char sqlbuf[200] = "SELECT Device_Route FROM Device limit 0,1"; if (mysql_query(sock, sqlbuf)) { printf("Query Failed:%s", mysql_error(sock)); return 0; } MYSQL_RES *res; MYSQL_ROW row; if (!(res = mysql_store_result(sock))) { printf("Failed to store result:%s", mysql_error(sock)); return 0; } while (row = mysql_fetch_row(res)) { puts(row[0]); } mysql_free_result(res); mysql_close(sock); }The End.