翻阅了一下文档,C 的 API 操作 MySQL 的时候没有参数化查询的接口,于是就简单的做一个转义,其实照着官方文档,很简单,直接附上代码
#include <stdio.h> #include <Windows.h> #include "mysql.h" #define TMP_SIZE 256 #define T_SIZE 1024 #define QUERY_SIZE 4096 int insert_record() { // define consts const char db_user[] = "root"; const char db_pwd[] = "root"; const char db_host[] = "localhost"; const char db_name[] = "twitter"; 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_set_character_set(&mysql, "utf8"); FILE *file = fopen( "C:/tweets2009-06.txt", "r"); char t_escape[T_SIZE], t_user[T_SIZE], t_content[T_SIZE], t_time[T_SIZE]; // read the total count line fgets(t_escape, T_SIZE, file); printf("%s\n", t_escape); for (long long i=0; i<10000; i++) { // time line fgets(t_escape, T_SIZE, file); mysql_real_escape_string(&mysql, t_time, t_escape+2, strlen(t_escape)-3); // user link line fgets(t_escape, T_SIZE, file); mysql_real_escape_string(&mysql, t_user, t_escape+21, strlen(t_escape)-22); // content line fgets(t_escape, T_SIZE, file); mysql_real_escape_string(&mysql, t_content, t_escape+2, strlen(t_escape)-3); // empty line fgets(t_escape, T_SIZE, file); char query[QUERY_SIZE] = {0}; sprintf(query, "insert into t (user, content, time) \ values ('%s', '%s', '%s')", t_user, t_content, t_time); //printf("%s\n", query); if (mysql_query(&mysql, query) != 0) { printf("query failed: %s\n", mysql_error(&mysql)); mysql_close(&mysql); return -1; } } mysql_close(&mysql); return 0; } int main() { insert_record(); return 0; }
使用到的函数是这个,http://dev.mysql.com/doc/refma…