(本文年代久远,请谨慎阅读)最近用JAVA写程序,在连接数据库并操作上感觉还是较其他语言简单多了,在这方面C/C++就显得有点繁杂,不过也并非难事。
首先就是要清除mysql提供的关于C的API,连接:http://dev.mysql.com/doc/refman/5.1/zh/apis.html

API

内容包括以下,用到的大概前几项,主要是数据类型,函数概括,函数描述

25.2. MySQL C API
25.2.1. C API数据类型
25.2.2. C API函数概述
25.2.3. C API函数描述
25.2.4. C API预处理语句
25.2.5. C API预处理语句的数据类型
25.2.6. C API预处理语句函数概述
25.2.7. C API预处理语句函数描述
25.2.8. C API预处理语句方面的问题
25.2.9. 多查询执行的C API处理
25.2.10. 日期和时间值的C API处理
25.2.11. C API线程函数介绍
25.2.12. C API嵌入式服务器函数介绍
25.2.13. 使用C API时的常见问题
25.2.14. 创建客户端程序
25.2.15. 如何生成线程式客户端

以上内容非常全面,是mysql官方资料,要自己多看多了解,学会查询即可。
知道了上面的内容,那自己写个连接代码也是很容易的,主要就是几个异常的检测以及连接操作,具体的API上面目录里都有详细讲解,在此只贴出代码:

必要的头文件包括以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <winsock.h> //最好放在首位,位置关系会导致错误,mysql.h
#include <mysql.h>
#include <stdio.h>
#include <cstring>
#include <string>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "libmysql.lib")
using namespace std;
连接及操作的代码实现:
MYSQL mydata;
if (0 == mysql_library_init(0, NULL, NULL)) {cout << "mysql_library_init() succeed" << endl;}
else { cout << "mysql_library_init() failed" << endl; return -1;}
if (NULL != mysql_init(&mydata)) { cout << "mysql_init() succeed" << endl;}
else { cout << "mysql_init() failed" << endl; return -1;}
if (0 == mysql_options(&mydata, MYSQL_SET_CHARSET_NAME, "gbk"))
{cout << "mysql_options() succeed" << endl; } return -1; }
if(NULL!=mysql_real_connect(&mydata,"localhost","root","","cap",3306,NULL,0)) //更改项
{cout << "mysql_real_connect() succeed" << endl;}
else { cout << "mysql_real_connect() failed" << endl;return -1; }
///*****************************/ 生成数据,可忽略不看 /***************/
mysql_query(&mydata,"truncate table n_e_w;");
string sqlstr;
sqlstr += "insert into n_e_w ";
sqlstr += "set input=(SELECT c_name FROM concept ORDER BY RAND() LIMIT 1),";
sqlstr += "output=(SELECT c_name FROM concept ORDER BY RAND() LIMIT 1),";
sqlstr += "beforer=(SELECT c_name FROM concept ORDER BY RAND() LIMIT 1),";
sqlstr += "afterr=(SELECT c_name FROM concept ORDER BY RAND() LIMIT 1),";
sqlstr += "s_one=(SELECT s FROM s_table ORDER BY RAND() LIMIT 1),";
sqlstr += "s_two=(SELECT s FROM s_table ORDER BY RAND() LIMIT 1),";
sqlstr += "s_three=(SELECT s FROM s_table ORDER BY RAND() LIMIT 1);";
for(int t = 0; t < 30 ; t++)mysql_query(&mydata,sqlstr.c_str());
//******************************/ 获得数据,存到traindata /**************/
MYSQL_RES *result = NULL;
mysql_query(&mydata,"SELECT * FROM n_e_w");
result = mysql_store_result(&mydata); //取得并打印行数
int rowcount = mysql_num_rows(result);
unsigned int fieldcount = mysql_num_fields(result); //取得并打印各字段的名称
MYSQL_ROW row = NULL;
row = mysql_fetch_row(result);
for(int j=0;j<rowcount;j++)
{
for(int i = 0; i < fieldcount-1; i++)
{
traindata[j][i] = row[i];
//cout<<"整个结果集显示:"<<traindata[j][i] <<"\t";
}
row = mysql_fetch_row(result);
}
//for(int ii=0;ii<DEFINE_COUNT;ii++) cout<<traindata[ii][1]<<endl;
mysql_free_result(result) ;
mysql_close(&mydata);
mysql_server_end();

上述内容只是简单的建立连接后查询内容,其中只在建立连接部分做了异常判别处理,其实还有很多工作没有做,比如未涉及的创建表,删除表等等操作,其都有对应的异常判别的API函数,通过IF条件判断,可以对创建不成功或删除不成功等异常情况予以显式输出,从而完善代码。

其余配置

以上是代码书写的工作,其实在书写代码之前,要用C++连(本人用的VC6.0)数据库,还要在VC中做相应的配置工作:

  1. 打开VC6.0 工具栏Tools菜单下的Options选项,在Directories的标签页中右边的“Show directories for:”下拉列表中选中“Includefiles”,然后在中间列表框中添加你本地安装MySQL的include目录路径(X:...\include)。
  2. 在“Show directories for:”下拉列表中选中“Library files”,然后添加本地安装MySQL的Lib目录路径。Lib目录下还有debug和opt两个目录,建议选debug(X:...\lib\debug)。
  3. 在“Project settings->Link:Object/library modules”里面添加“libmysql.lib”。
  4. 在程序开头的写法,具体参照上文中代码。 注:#include “winsock.h”一定要写在#include “mysql.h”的前面,否则出错。
  5. 将“libmySQL.lib、libmySQL.dll”拷到你所建的工程的目录下。

到此,完成配置后,即可进行连接并对数据库进行操作。