最近因为开始被安排做小项目,所以开始做一些数据库相关的东西,但是我之前只接触过java连接数据库,所以花了两天时间才艰难的弄好,下面分享一下我艰难的过程
第一步是添加数据源,但是因为公司用到的东西都很老,VS2008和MFC开发,所以网上找的很多都没什么用,最后找了好久才找到解决方法用Mysql数据库,并且用mysql-connector-odbc-5.1.13-win32包来连接数据库,也就是ODBC方法连接,但是注意32位和64位都要安装,而且因为版本太老,只能在win7安装,win10会失败,然后Mysql数据库推荐直接用phpstudy,很方便,然后就是建立自己的数据源,控制面板-》管理工具-》数据源(ODBC),然后选择添加数据源,结束
第二步是绑定数据源里的数据库里的表的列,这里先右键项目添加类,选择MFC类里的ODBC使用者,然后选择机器数据源,就是第一步建立好的,然后选择想要绑定到类里的表,这里注意,我的个人经验是,选择快照,并且不勾选绑定所有列,划重点,我旁边所有的机器我都试过了,只要一绑定,VS2008直接卡死退出,然后在新建好的类的头文件里声明你想要用到的列,然后在源码里的DoFieldExchange函数里面最后添加绑定形参与列的代码,我这里举个例子
`void Cinformation::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);//这是自带的不用改
RFX_Text(pFX,“InstrumentID”,InstrumentID);//RFX_TEXT是因为我这个InstrumentID是CString类型的,所以用这个,不同类型,RFX后面不一样
}
另外,在头文件定义时定不要定义成char类型,所有字符串类型请定义成CString类型,因为char类型没有对应的转换函数
这是VS官网关于RFX类型函数的注释,不清楚对应转换函数的,可以看一下
在源代码的构造函数里有一行
m_nFields = 0;//把0改成你定义了多少个变量的数量
前期准备结束,接下来就是进行对数据库的操作了
//加入数据库相关类的预编译指令
#include "afxdb.h"
CDatabase db; //定义一个对象db,这要是用来连接数据库
//Open函数有五个参数,第五个一般默认为true,含义是仅支持静态打开
//我这里不知道为什么改成false之后还是不能动态打开,所以就不写了
//前三个参数一般不用动
//第四个表示的是通过什么连接的数据库,数据库名字是什么(我这里是Mysql,这是因为我取得数据源名字是Mysql,并不是表示我用的是Mysql数据库)
//后面就是账号密码,mysql一般默认都是root
db.Open(NULL,FALSE,FALSE,"ODBC;DSN=Mysql;UID=root;PWD=root");
//Cstudent类是第二步中添加的类,该类派生与CRecordSet类
Cstudent rs(&db);
CString sql;
sql = "这里写sql语句"//当然你也可以不这么写,直接在下面写语句也行
这是两中执行sql语句的方法
//这种打开方式比另一种简单,但是有一个缺点就是没有结果集
db.ExecuteSQL(sql);
//这个Open函数是CRecordSet类的,和上面的不一样的
//这个Open函数两个参数,第一个是选择打开方式,我这里选的是静态快照集
//执行完这个语句后,选出来的数据会储存在rs的结果集里
rs.Open(CRecordset::snapshot,sql);
一共有如下四种类型的记录集:
CRecordset::dynaset:
动态记录集,支持双向游标,并保持同所连接的数据源同步,对数据的更新操作可以通过一个fetch操作获取。
CRecordset::snapshot:
静态快照,一旦形成记录集,此后数据源的所有改变都不能体现在记录集里,应用程序必须重新进行查询,才能获取对数据的更新。该类型记录集也支持双向游标。
//这是重新查询函数
rs.Requery()
CRecordset::dynamic:
同CRecordset::dynaset记录集相比,CRecordset::dynamic记录还能在fetch操作里同步其它用户对数据的重新排序。
CRecordset::forwardOnly:
除了不支持逆向游标外,其它特征同CRecordset::snapshot相同。
我简单地说一下比较常用的函数
遍历结果集语句
for(rs.MoveFirst();!rs.IsEOF();rs.MoveNext()) {
}
遍历结果集还有while方法,这里我就不介绍了
计算结果集有多少行数据
rs.GetRecordCount();
这个函数有一个我自己研究出来的衍生用法,当从数据库中取出结果集,然后想遍历的时候,如果结果集中没有数据,那么运行rs.MoveNext()函数会报错,所以在运行前可以判断一下,这个结果集有多少行
最后再说一下Format函数,这是CString类的函数,可以动态的插入,非常好用