最近在做一个 twitter 的数据分析,要导一些个数据到数据库中,数据量在亿行这个数量级,由于没什么经验,打算先搞个几百万或者千万行试试,在写导入的时候,由于贪图 PHP 和 MySQL 的无缝配合,所以拿着 PHP 就上了,结果发现效果惨不忍睹,效率完全没法满足需求,于是开始考虑转向 C,在网上搜罗了好一会,C 连接 MySQL 的文章倒是有不少,但是都不怎么清晰明了,直到看到这篇,http://www.cnblogs.com/lovebre…
安装完MySQL之后,将安装目录中的include目录下的libmysql.lib文件拷到VS2008安装目录中的VC\lib\下,然后在 项目-选项-c/c++-常规 中的附加包含目录以及 链接器-常规 中的附加库目录中加入“c:\MySQL\include\”,并且在 链接器-输入 中的附加依赖项内添加“libmysql.lib”,这样即可使编译器找到mysql.h头文件,并可在程序中使用c语言的mysql API来操作数据库。(如果MySQL安装目录中无include目录,可到MySQL官网下载并安装MySQL connector for C,并修改include目录路径)
照着做很快就跑起来了,他的范例代码也很容易改动,稍微修改一下就可以在自己的电脑上运行,但是出于学习,还是自己写了一遍,函数的 API 文档可以参考这里,http://dev.mysql.com/doc/refma…
#include #include #include "mysql.h" #define TMP_SIZE 256 int select_record() { // define consts const char db_user[] = "root"; const char db_pwd[] = "root"; const char db_host[] = "localhost"; const char db_name[] = "t"; unsigned int db_port = 3306; // define mysql vars MYSQL mysql; MYSQL_RES *mysql_res; MYSQL_ROW mysql_row; MYSQL_FIELD *mysql_field; char tmp[TMP_SIZE][TMP_SIZE]; mysql_init(&mysql); if (mysql_real_connect(&mysql, db_host, db_user, db_pwd, db_name, db_port, NULL, 0) == NULL) { printf("connect failed: %s\n", mysql_error(&mysql)); return -1; } mysql_query(&mysql, "set names gbk"); if (mysql_query(&mysql, "select * from user") != 0) { printf("query failed: %s\n", mysql_error(&mysql)); mysql_close(&mysql); return -1; } mysql_res = mysql_store_result(&mysql); if (mysql_res == NULL) { printf("store result failed: %s\n", mysql_error(&mysql)); mysql_close(&mysql); return -1; } printf("number of results: %d\n", mysql_num_rows(mysql_res)); for (int i=0; mysql_field=mysql_fetch_field(mysql_res); i++) { printf("%s\n", mysql_field->name); } printf("====================\n"); int num_of_fields = mysql_num_fields(mysql_res); while (mysql_row = mysql_fetch_row(mysql_res)) { for (int i=0; i<num_of_fields; i++) { printf("%s\n", mysql_row[i]); } printf("====================\n"); } mysql_free_result(mysql_res); mysql_close(&mysql); return 0; } int main() { select_record(); return 0; }
输出如下
number of results: 6 id email name password avatar time ==================== 1 zrj ZRJ 455ba221ff5d2d04e84caef24a06fafc zrj.png 2012-11-21 21:52:30 ==================== 2 liang 梁斌penny 455ba221ff5d2d04e84caef24a06fafc liang.jpg 2012-11-21 22:50:24 ==================== 3 1 1 5469a7c15898d73fedbada90ec8d051c default.jpg 2012-11-21 23:55:23 ==================== 4 11 11 39fff158104571897b03f753cf073a42 default.jpg 2012-11-23 21:31:30 ==================== 5 111 111 e2f95e29a93bb6a45aec242a19cbe62d default.jpg 2012-11-23 21:32:29 ==================== 6 1111 1111 8a32f7eaaa2f1f803fea771e9b5d7aa0 default.jpg 2012-11-23 21:32:38 ====================
说下自己走的一些弯路,首先需要注意的是,那个 mysql 目录下的 include 文件夹,这个是需要一个典型安装的 mysql 才有的,我在集成的 WAMP 中找了找,没有找到这个文件夹,另外就是在 #include “mysql.h” 之前需要先 #include <Windows.h>,不然会报这个错误
错误 1 error C2146: 语法错误 : 缺少“;”(在标识符“fd”的前面) c:\program files\mysql\mysql server 5.5\include\mysql_com.h 291 cpp_mysql 错误 2 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int c:\program files\mysql\mysql server 5.5\include\mysql_com.h 291 cpp_mysql 错误 3 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int c:\program files\mysql\mysql server 5.5\include\mysql_com.h 291 cpp_mysql 错误 4 error C2065: “SOCKET”: 未声明的标识符 c:\program files\mysql\mysql server 5.5\include\mysql_com.h 470 cpp_mysql 错误 5 error C2146: 语法错误 : 缺少“)”(在标识符“s”的前面) c:\program files\mysql\mysql server 5.5\include\mysql_com.h 470 cpp_mysql 错误 6 error C2059: 语法错误 : “)” c:\program files\mysql\mysql server 5.5\include\mysql_com.h 471 cpp_mysql