第一部分代码部分已经完成啦,当然一些细节地方可以自己微调。现在当然要做的就是第二部分,初始化工作和数据库的链接

我用的是ACCESS2007,OFFICE2007套件里面有。安装一下就可以用了,不安装的话能用MFC操作数据库,但是不能直接打开查看,不方便

还有因为这个记账猫只是记录少量数据,所以ACCESS很合适,同时熟悉MFC,也能熟悉对数据库的访问

先做一些初始化工作,组合框的初始化,列表控件的初始化。树控件的初始化放在对数据库连接操作之后,因为树控件需要访问数据库。

打开CLASS类,找到其中的View类中的OnInitialUpdate函数,这个是初始化函数。

access无法初始化注册表 access设置初始化标题在哪里_access无法初始化注册表

先对组合框初始化,用InsertColumn函数,函数的使用,参数的详细解释请参考MSDN,InsertColumn就是插入一项数据两个参数分别是标号和名称

access无法初始化注册表 access设置初始化标题在哪里_数据库_02

m_combo是我建立的组合框的类变量,前面已经说明了建立方法。SetCurSel函数是用来显示默认的值,当前设置为0号也就是食品现在运行一下试试?是不是这样的呢?

access无法初始化注册表 access设置初始化标题在哪里_初始化_03

现在同样对列表框进行初始化。

access无法初始化注册表 access设置初始化标题在哪里_初始化_04

SetExtendedStyle是列表控件风格设置,就是你运行后那些横竖的表格风格

现在要先进行数据库的链接,数据库链接首先需要数据库,还要的就是msado15.dll这个文件数据库可以自己用ACCESS创建一个,msado5.dll可以从系统中找,也可以从网上下载一个,直接下载一个吧。然后把这两个文件一起放到你项目的目录下面

access无法初始化注册表 access设置初始化标题在哪里_数据库_05

其中DataBase中创建一个表格,表格再创建4项类别Ming,Zhong,Jia,Dat,分别是名字,种类,价格,日期。注意日期不要用date,因为date是数据库保留关键字

access无法初始化注册表 access设置初始化标题在哪里_access无法初始化注册表_06

表格名称是“我的记录”,其中No是自动编号,在最左边我的记录上右键,选择设计视图,把Dat改为日期类型,格式设置为日期选取器一样的类型。

现在基本工作完成,开始添加代码来连接数据库吧。

access无法初始化注册表 access设置初始化标题在哪里_初始化_07

在file里面头文件的StdAfx.h中添加中间标黑的代码,表示引入msado15.dll,不使用命名空间,并且把EOF改成adoEOF,"EOF"已经被定义为文件的结尾,原本ADO中也用EOF定义记录集的结尾,二者冲突,所以将其改为“adoEOF”,这样就能正确的表示记录集的结尾了。

回到Class中App类的初始化函数添加如下标黑初始化代码

access无法初始化注册表 access设置初始化标题在哪里_数据库_08

现在都准备好了,回到最初的view类中先编译一下,编译器会帮你完成一些东西。

先在CMyCountCatView上右键添加变量,一个智能指针,一个结果集。

_ConnectionPtr m_pConnection;

_RecordsetPtr m_pRs;

现在打开View类中的OnInitialUpdate初始化函数,添加数据库连接初始化工作。

HRESULT hr;
try
{
hr=m_pConnection.CreateInstance("ADODB.Connection");
m_pRs.CreateInstance(__uuidof(Recordset));
if(SUCCEEDED(hr))

/*注意:打开Open函数,第一个引号的Data Source= 后面是数据库名称,然后依次两个“”是账号和密码,因为我没有设置所以为空

其它的就是相当于固定的一种格式吧,先就这么使用。关键是要能打开连结上数据库。

*/
hr=m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source =DataBase.mdb","","",adModeUnknown);

}
catch(_com_error e)//捕获异常,因为打开文件之类的一般会抛出各种异常,比如文件不存在,损坏等等
{
CString err;
err.Format("连接出错!错误信息:%s",e);
AfxMessageBox(err);
}

再编译一下看是否报错,如果按照我的,一样的话应该是没有问题的。有问题可以多百度一下,试着自己解决问题,解决后那也是一种成功

好了 现在数据库已经连接好了,运行一下,成功打开程序说明没有问题啦!

下面怎么能证明我们的数据库连接成功了呢?先试着向数据库中写入数据来看看!下面的内容会涉及到一下SQL语言,想了解的可以查阅相关资料。

回到界面设计,在之前设计好的新增按钮上双击,弹出函数名,最好是改成容易识别的。我把它改为了OnNew,表示新增,方便以后函数多了寻找

代码已经开始变多了,需要多加注意。

先定义4个CString类型的变量保存名称,价格,类型,和日期。

CString name;//物品名
CString price;//价格
CString vior;//种类
CString date;//日期

GetDlgItemText(IDC_EDIT1,name);
GetDlgItemText(IDC_EDIT2,price);
GetDlgItemText(IDC_COMBO1,vior);
GetDlgItemText(IDC_DATETIMEPICKER1,date);

UpdateData(TRUE);

用GetDlgItemText函数获取上面你输入的文本,第一个参数是控件ID,忘了可以右键要查看的控件点击属性,第一个是文本要返回的参数,用定义的CString变量获取

UpdateData是更新,因为你已经输入了数据。

下面是判断,首先是要输入内容,其次是要输入价格,价格应该为数字

if (m_nameedit.IsEmpty()||m_priceedit.IsEmpty())
{
AfxMessageBox("请输入名称或者价格!!!");
return;
}
char c;
for (int i=0;i<m_priceedit.GetLength();i++)
{
c=m_priceedit.GetAt(i);
if (c>='0'&&c<='9')//判断是否为数字(c>='0'&&c<='9'||c=='.'),这里因为我数据库中保存的是整数,所以就没有判断小数,按理说应该要支持小数的
{

}
else
{
//m_priceedit="";
AfxMessageBox("价格应该为数字!!!");

return ;
}
}

现在上面已经判断完了,要对数据进行写入了。

CString strSQL;
strSQL.Format("select Ming,Zhong,Dat from 我的记录 where Ming = '%s' and Zhong = '%s' and Dat = #%s#",name,vior,date);

/*Format是CString的一个成员函数,吧CString的内容变成指定的格式。

上面一句话的意思是从我的记录表中选择名字,种类,日期,where后面是条件,条件是和在上面已经输入的内容一样的,这样来判断。注意日期应当有##引起来,其它的是单引号。

如果返回结果不为空,说明表格中已经存在该项!应当做的是更新价格。

如果返回结果为空,应当做的是插入一条新记录*/

m_pRs=m_pConnection->Execute((_bstr_t)strSQL,NULL,adCmdText); //m_pRs是前面定义的结果集,用来保存返回结果的,这句话就是调用前面的SQL语句对数据库操作

if(!(m_pRs->GetadoEOF()))//如果返回结果不会空
{
strSQL.Format("update 我的记录 set Jia=Jia+%s where Ming='%s' and Zhong='%s' and Dat = #%s#",price,name,vior,date) ;//update是更新指定条件的数据
}
else{
strSQL.Format("insert into 我的记录(Ming,Zhong,Jia,Dat) values('%s','%s','%s',#%s#);",name,vior,price,date);//insert是插入一条数据
}

数据写入有个要求,就是相同名称相同类型相同日期的价格应该合并,减少数据量也为了后面删除不会同时删除多条记录。

m_pConnection->Execute((_bstr_t)strSQL,NULL,adCmdText);//调用SQL语句对数据库操作
m_nameedit="";
m_priceedit="";//清空输入的名字和价格
UpdateData(FALSE);

好了!现在运行一下试一试,输入名称和价格,点击新增,然后打开文件里面的数据库,是不是多增加了一条记录呢?如果没有再检查一下前面的是否有错误。

这样就实现了对数据库的增加操作!下一部分再讲数据的显示部分!