资源描述:
《vs2010版本的COBDC方式连接数据库ACCESS和SQL2008.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
VS2010连接数据库(access和sql2008)现在很多人开始用VS2010的C++了,以前大家都是从VC6.0开始使用,对6.0比较熟悉,网上很多关于连接数据库的方法都是针对VC6.0的,很多人用2010用了一段时间之后不随手就放弃了,继续使用VC6.0.作者作为一名VS2010版本开始学习使用的人在数据库连接的时候也遇到很多问题,在这里和大家分享如下:首先是用ACCESS方式连接数据库:以前VC6.0怎么连接相信大家都能够百度得到了,他是通过首先打开控制面板->管理工具->数据源(ODBC)就到了图一界面:图一然后点击右边的添加按钮:很多书里面都叫添加时候选第二项,也就是图二里面所以深色背景那项:
图二Vc6.0的操作就是这样选择。但在VS2010里面就不对。我用的是VS2010然后用ACCESS2007做数据库保留后缀名:accdb如图三图三选择这一项在VS2010里面就不会出错了我在这里添加了一个叫:liyixu的access数据库这就配置好了数据源
接下来,讲VS2010里面怎样连接这个数据库:在VC6.0里面是通过添加类的方法来添加数据库里面的具体某一个表。而在VS2010里面也差不多。但是当我们按照VC6.0添加正常类的时候发现,他没有基类CRecordset类可以选择:图四比如:如果选择图四中的MFC类图五
他里面没有CRecordset基类可供选择,也就无从选择数据源和表。那么VS2010里面其实是有专门的ODBC使用者设置的。选择:图六图六中的MFCODBC使用者选项,不需要输入名称位置,点击添加按钮:图七进入MFCODBC使用者向导:点击数据源按钮,进入选择数据源对话框,把文件数据源视图切换到系统数据源视图:
图八选择之前在数据源中定义的liyixu用户数据源点击确定出现登陆界面:图九这里我登录名和密码是在添加数据源时在高级选项中设置的,如果你没有设置,当然就没有,直接单击确定按钮就可以连接了
图十出现图示界面我的数据库里面只有一个表会员信息,所以直接选择他,然后单击确定回到向导界面,单击完成,完成连接在这里你可以自定义自己的类的名称:图十一我在这里就直接以(huiyuaninfo)会员信息为类名了。
在图十一中我勾选了绑定所有列然后就会被卡住程序崩溃,然后不勾选就没有这种情况,如果在前面图九中你设置了登陆名和密码,程序也会发出警告,所有密码出现在代码中,编译也会不成功,这时候把#error那一行注释掉就行了。这样就能以ODBC方式连接上ACCESS数据库很清楚吧下面讲一讲怎样连接SQL2008(这个是重点):很多人连接SQL失败是数据库配置的问题,权限没有,所以访问被拒绝。这个要从SQL2008的安装说起,由于是一时兴起写这篇文章,所以我就不把自己的数据库卸载了重装了,其实就一个地方。在SQL2008安装过程中,很多教材都叫选择windows登陆模式,默认实例。而不管是这里讲的ODBC模式连接SQL还是ADO方式这种比较方便的方式连接都需要登录名和密码。你在单击上做练习的话当然是不需要什么登录名的了,window验证,开机就可以用自然很方便,但是其他软件要访问它,必然要给他权限和接口,所以选择混合模式,设置SQL登录方式中用户名sa的密码。注意:密码一定要复杂不然还通不过。这是其一。二、打开SQLServer2008配置工具->SQLServer配置管理器。首先确保sqlserver服务开启,然后图十二
我安装的学习版哈,见笑了,设置SQLServer网络配置中SQLEXPRESS和MSSQLSERVER中的TCP/IP和NamedPipes协议的状态为启用,默认是不启用的。设置完成后重启服务就可以了。然后配置ODBC数据源:以一个简单实例来说明:学籍管理系统。打开SQLServermanagementStudio以SQLserver方式连接数据库:图十三新建数据库member。在member数据库里面创建两个表:user和score。我之后会以ODBC方式连接score表设计score表:图十四有上图所示的一些列。然后再自己先编写一些内容:
比如:图十五这是我随意编写的一些信息然后开始同前面设置ACCESS数据源一样的操作:这里添加选SQLServer选项:图十六
图十七服务器选自己的电脑,因为单机练习嘛,最简单了,点击完成。出现图十八所示界面:图十八你可以单击测试数据源,测试一下,如果照前面的设置进行了的话,连接就会成功,出现如图十九的对话框:
图十九至此,ODBC的sql数据源设置好了:图二十然后打开VS2010新建项目,创建MFC对话框程序。在VS2010中创建对话框向导没有连接数据源的选项,单文档和多文档是有的。那么先不管,先来设计学籍管理系统的对话框界面如下:
图二十一这个界面,相信学过MFC的同学都会做了,然后对相应的变量进行设计。然后创建数据库连接,还是添加类里面选择ODBC数据库使用者图二十二
出现数据源选择界面,单击数据源按钮,出现数据源菜单,切换到系统数据源视口,然后选择之前设置的huiyuaninfosql数据库。图二十三单击确定,出现登陆界面:图二十四这时候就必须输入sa用户和密码,sa用户的创建在前面说了,要在数据库安装的时候设置,单击确定选择score表:
图二十五至此,数据库连接成功然后创建了一个Cscore类,然后我们来看看他都有哪些内容:#pragmaonce//代䨲码?生¦¨²成¨¦在¨²2013年¨º1月?22日¨?,10:26classCscore:publicCRecordset{public:Cscore(CDatabase*pDatabase=NULL);DECLARE_DYNAMIC(Cscore)CStringWm_stuid;CStringWm_stuname;CStringWm_stuclass;longm_usualscore;longm_testscore;longm_totalscore;public:virtualCStringGetDefaultConnect();//默?认¨?连¢?接¨®字Á?符¤?串ä?
virtualCStringGetDefaultSQL();//记?录?集¡¥的Ì?默?认¨?SQLvirtualvoidDoFieldExchange(CFieldExchange*pFX);//RFX支¡ì持?//实º¦Ì现?#ifdef_DEBUGvirtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;#endif};VS2010的注释粘贴到word里面会乱码,我也不知道怎么回事,不过这不影响程序的理解,可以看到,这个类定义了六个变量和两个虚函数再看他的源程序://score.h:Cscore类¤¨¤的Ì?实º¦Ì现?//Cscore实º¦Ì现?//代䨲码?生¦¨²成¨¦在¨²2013年¨º1月?22日¨?,10:26#include"stdafx.h"#include"score.h"IMPLEMENT_DYNAMIC(Cscore,CRecordset)Cscore::Cscore(CDatabase*pdb):CRecordset(pdb){m_stuid=L"";m_stuname=L"";m_stuclass=L"";m_usualscore=0;m_testscore=0;m_totalscore=0;m_nFields=6;m_nDefaultType=dynaset;}//#error安ã2全¨?问¨º题¬a:êo连¢?接¨®字Á?符¤?串ä?可¨¦能¨¹包㨹含?密¨¹码?。¡ê//此ä?连¢?接¨®字Á?符¤?串ä?中D可¨¦能¨¹包㨹含?明¡Â文?密¨¹码?和¨ª/或¨°其?他?重?要°a//信?息¡é。¡ê请?在¨²查¨¦看¡ä完ª¨º此ä?连¢?接¨®字Á?符¤?串ä?并¡é找¨°到Ì?所¨´有®D与®?安ã2全¨?//有®D关?的Ì?问¨º题¬a后¨®移°?除y#error。¡ê可¨¦能¨¹需¨¨要°a将?此ä?密¨¹码?存ä?
//储ä¡é为a其?他?格?式º?或¨°使º1用®?其?他?的Ì?用®?户¡ì身¦¨ª份¤Y验¨¦证¡è。¡êCStringCscore::GetDefaultConnect(){return_T("DSN=xuejiguanli;Trusted_Connection=Yes;APP=Microsoftx00aeVisualStudiox00ae2010;WSID=LIYI;DATABASE=member;Network=DBMSSOCN");}CStringCscore::GetDefaultSQL(){return_T("[dbo].[score]");}voidCscore::DoFieldExchange(CFieldExchange*pFX){pFX->SetFieldType(CFieldExchange::outputColumn);//RFX_Text()和¨ªRFX_Int()这a类¤¨¤宏¨º依°¨¤赖¤¦Ì的Ì?是º?//成¨¦员¡À变À?量¢?的Ì?类¤¨¤型¨ª,ê?而?不?是º?数ºy据Y库a字Á?段?的Ì?类¤¨¤型¨ª。¡ê//ODBC尝¡é试º?自Á?动¡¥将?列¢D值¦Ì转Áa换?为a所¨´请?求¨®的Ì?类¤¨¤型¨ªRFX_Text(pFX,_T("[stuid]"),m_stuid);RFX_Text(pFX,_T("[stuname]"),m_stuname);RFX_Text(pFX,_T("[stuclass]"),m_stuclass);RFX_Long(pFX,_T("[usualscore]"),m_usualscore);RFX_Long(pFX,_T("[testscore]"),m_testscore);RFX_Long(pFX,_T("[totalscore]"),m_totalscore);}///////////////////////////////////////////////////////////////////////////////Cscore诊?断?#ifdef_DEBUGvoidCscore::AssertValid()const{CRecordset::AssertValid();}voidCscore::Dump(CDumpContext&dc)const{CRecordset::Dump(dc);}#endif//_DEBUG他把表中的六列和六个变量建立了关系。然后我们就可以通过这六个变量来对数据库进行操作了。
下面给出对话框初始化函数里面的代码:BOOLCxuejiDlg::OnInitDialog(){CDialogEx::OnInitDialog();//打䨰开a数ºy据Y集¡¥,ê?建¡§立¢¡é数ºy据Y集¡¥和¨ª对?话¡ã框¨°变À?量¢?之?间?的Ì?联¢a系¦ÌCscorem_set;m_set.Open();m_set.MoveFirst();m_stuid=m_set.m_stuid;m_stuname=m_set.m_stuname;m_testscore=m_set.m_testscore;m_usualscore=m_set.m_usualscore;m_totalscore=m_set.m_totalscore;UpdateData(false);//设¦¨¨置?列¢D表À¨ª框¨°的Ì?风¤?格?DWORDdwExStyle=LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE;m_list.SetExtendedStyle(dwExStyle);m_list.SetTextColor(RGB(255,0,0));m_list.SetBkColor(RGB(240,247,233));//初?始º?化¡¥列¢D表À¨ª插?入¨?6列¢D,ê?设¦¨¨置?宽¨ª度¨¨m_list.InsertColumn(0,L"学¡ì号?",LVCFMT_CENTER,65,0);m_list.InsertColumn(1,L"姓?名?",LVCFMT_CENTER,65,0);m_list.InsertColumn(2,L"班㨤级?",LVCFMT_CENTER,65,0);m_list.InsertColumn(3,L"平?时º¡À成¨¦绩¡§",LVCFMT_CENTER,65,0);m_list.InsertColumn(4,L"期¨²末?成¨¦绩¡§",LVCFMT_CENTER,65,0);m_list.InsertColumn(5,L"总Á¨¹评¨¤成¨¦绩¡§",LVCFMT_CENTER,65,0);CStringstrsql;strsql.Format(L"select*fromscoreorderbystuid");ListAll(strsql);首先建立了一个列表框,然后要通过最后一行的ListAll函数来把数据库里面的所有信息显示到列表控件里面来,初始化函数主要写了列表控件的初始化信息。列表控件的使用可以查询MSDN有详细的说明。最后来看看ListAll函数是怎样实现对数据库的显示的:
voidCxuejiDlg::ListAll(CStringstr){m_list.DeleteAllItems();Cscorem_score;//try{if(m_score.IsOpen())m_score.Close();if(!m_score.Open(CRecordset::snapshot,str)){MessageBox(L"打䨰开a数ºy据Y库a失º¡ì败㨹!ê?",L"数ºy据Y库a错䨪误¨®",MB_OK);return;}}catch(CDBException*e){e->ReportError();}//intnindex=0;m_score.MoveFirst();CStringuscore,tscore,fscore;while(!m_score.IsEOF()){LV_ITEMlitem;litem.mask=LVIF_TEXT;litem.iItem=nindex;litem.iSubItem=0;litem.pszText=L"";//在¨²最Á?后¨®一°?行D插?入¨?记?录?m_list.InsertItem(&litem);//设¦¨¨置?行D的Ì?其?他?列¢D值¦Ìm_list.SetItemText(nindex,0,m_score.m_stuid);m_list.SetItemText(nindex,1,m_score.m_stuname);m_list.SetItemText(nindex,2,m_score.m_stuclass);
uscore.Format(L"%3d",m_score.m_usualscore);tscore.Format(L"%3d",m_score.m_testscore);fscore.Format(L"%3d",m_score.m_totalscore);m_list.SetItemText(nindex,3,uscore);m_list.SetItemText(nindex,4,tscore);m_list.SetItemText(nindex,5,fscore);m_score.MoveNext();nindex++;}m_score.Close();}CDatabase类和CRecordset类都是对于ODBC方式连接数据库而设计的,他们的使用方法和结构也都可以通过相关书籍查询,这里不再赘述了。然后让我们来看看执行结果:图二十六那么可以看见数据库里面的内容就显示到了列表控件里面了。
以前也经常查看文库,这次是第一次把自己的经验跟大家分享,希望对大家的学习有所帮助,共勉之!