用MFC ODBC操作Access数据库
IFIX-通过ODBC及ADO写数据到ACCESS数据库
通过ODBC及ADO写数据到ACCESS数据库方法一:新建一个ACCESS数据库,存到C:\ABC.MDB,数据库有一个表FORM,有三个字段ID、DATETIME、V ALUE,并且DATETIME设置的默认值为NOW(),这样每写入一条记录,自动记录下当前日期时间。
在ODBC里创建系统DSN,由于采用ACCESS数据库,需要选择如图所示的驱动。
点击完成后如下图,写上数据源名为TEST点击选择按钮选择C:\ABC.MDB选择后选择高级,设置用户名密码均为sa选择确定后启动IFIX,新建一个调度TEST新建一个基于时间项设置为每5秒触发一次,点V B编辑器,写上如下代码Private Sub FixTimer3_OnTimeOut(ByVal lTimerId As Long)Dim conODBC As ADODB.ConnectionDim adoRS As ADODB.RecordsetSet conODBC = New ADODB.ConnectionSet adoRS = New ADODB.RecordsetDim strQuery As StringconODBC.ConnectionString = "DSN = test; UID =sa; PWD =sa;"conODBC.Open "test", "sa", "sa"strQuery = "select * from form" '或者表名FORM或者SQL选择语句adoRS.Open strQuery, conODBC, adOpenDynamic, adLockPessimisticadoRS.AddNewadoRS!Value = 454545adoRS.UpdateadoRS.CloseconODBC.CloseEnd Sub一定要选择如下图这一步:点击工具-引用,在下所示中,勾上microsoft activex data objects 2.7library,否则会报错的。
Win8系统上使用ODBC连接Access2013数据库
在Win8系统上使用ODBC连接Access2013数据库
一、使用access2013创建数据库及数据库表
1、打开Access2013,点击空白桌面数据库
2、自定义数据库名以及数据库存储位置
Access支持.accdb和.mdb两种格式,例如:这里我们取名为DBTest.mdb
文件名和路径都选好后,点击创建,数据库就建好了
3、开始建立数据库表选择“表设计”
设置表字段及属性
设置username为主键。
在灰色部分点击鼠标右键,进行选择。
表建好后,Ctrl+s保存表,就会提示你为你的数据库表取名。
按以上步骤就完成了access数据库及数据库表的建立
二、使用ODBC连接Access2013数据库
1、找到管理工具
打开控制面板,在搜索中输入odbc
2、打开odbc开始进行连接操作
点击添加
如图下图进行选择,然后点击完成。
自定义数据源名称
选择之前建立DBTest.accdb的数据库
点击确定
按下图进行操作,就完成了odbc连接access2013数据库的操作。
MFC ODBC数据库访问技术
4)用CDatabase::ExecuteSQL()执行SQL语句
对于返回结果集的一般查询,使用CRecordset很容 易。然而,可以不用CRecordset执行不返回结果集 的SQL语句,而是通过调用CDatabase类的 CDatabase::ExecuteSQL()成员函数执行。其函数 原型如下:
MFC ODBC数据库访问技术
在Visual C++中,MFC封装的ODBC数据库 类包括CDatabase(数据库类)、 CRecordSet(记录集类)和CrecordView (记录视图类),更为用户提供了切实可行 的解决方案。
1.1 MFC的ODBC过程
使用MFC ODBC类访问数据库,主要有以下几个步 骤: 1.建立数据库 建立数据库就是用户根据自己的需要设计数据库中 的表及各表之间的依赖关系。要想设计一个完整的 数据库,首先必须了解数据库的基本知识。
void ExecuteSQL(LPCTSTR lpszSQL);
Throw(CEBException);
参数lpszSQL是一个带SQL语句字符串的指针。
的使用
CRecordset类派生于CObject类。虽然CDatabase类允许对一 个数据库执行SQL语句,但实际上是CRecordset 类提供了应 用程序与数据交互的实际操作。CRecordset类用来封装数据 库的查询,包括记录的插入、修改、删除等操作。
记录集对象一般都可以进行如下的操作:在 记录间滚动、更新记录并设定锁定模式、以 记录信进行过滤、限制对数据源可选记录的 选择、对记录排序、当完成操作后调用 Close()函数销毁对象等。
3.CRecordView类的使用
CRecordView类对象直接与CRecordset(记录 集)类对象连接,为该记录集提供显示的视图。 它是数据库操作的界面,提供了以下几个操 作:移动到第一个记录、下一个记录、前一 个记录、最后一个记录,还可以更新数据库 中当前视图所显示记录。
VS2015与Access数据库ODBC连接
VS2015环境下与Access数据库的ODBC连接开发环境和工具:win10家庭版+vs2015+Access2010。
1.首先在Access2010 建立好自己的数据库,这里不详细介绍了,记住保存的路径。
第一步是登陆数据源(1)打开控制面板->管理工具->ODBC数据源32位,在用户选项卡下点击添加(2)选择图中所示驱动程序(这也是与VC6.0的不同)(3)起一个数据源名(记住这个名,以后会用到),说明可以随便稍作描述。
点击数据库下的选择,选择已经建好的Aceess数据库、表,点击确定、确定。
至此数据源的登陆完成。
接下来要到VS2015 的环境中添加与数据库有关的类2。
添加表类。
与VC6.0不同的是,VS2015里面其实是有专门的ODBC使用者设置,(1)右击类视图下的工程名->添加->类,(2)选择MFC下的MFC ODBC使用者,直接点击添加;(3)然后来到这个界面,点击数据源,(4)出现登录名和密码,这是在高选项中设置的,我的没有设置过,不用管,直接点击确定;(5)切换到机器数据源选项卡;选择所需要的数据源(6)选择一个数据源中的Access数据表,点击确定;(7)接下来起一个方便记忆的类名,选择动态集;在这说一下动态集与快照的特点记录集主要分为快照(Snapshot)和动态集(Dynaset)两种。
CRecordset类对这两种支持。
这两种记录集的区别在于它们对别的应用改变数据源记录采取的是不一样的处理方法。
快照型(Snapshot)记录集提供了对数据的静态视。
快照是个很形象的术语,就像是对数据源的某些记录照了一张照片一样。
当别的用户改变了记录时(包括修改、添加和删除),快照中的记录并不受影响,意思就是,快照不反映别的用户对数据源记录的改变。
直到调用了CRecordset::Requery重新查询后,快照才会反映变化。
对于像产生报告或执行计算这样的不希望中途变动的工作,快照是很有用的。
MFC-Access数据库连接 (1)
5、定义一个_variant_t对象var和一个CString对象result
while(!m_pRecordset->adoEOF)//当下一条记录不为空
try{
m_pRecordset->MoveFirst();
m_pRecordset->Move(long(curSel));//先移动到第一条记录,然后相对第一条记录移动记录指针以找到需修改目标
m_pRecordset->Delete(adAffectCurrent);//参数adAffectCurrent为删除当前记录
1、在头文件中定义一个_ConnectionPtr对象m_pConnection,用于连接上数据库;一个_RecordsetPtr对象m_pRecordset,用于遍历和接收数据库数据
2、在应用类中include一个AccessDBApp.h头文件
3、首先调用连接数据库方法AccessDBApp::GetConnection(),它会返回一个_ConnectionPtr类型的值,用m_pConnection接收
---------修改记录:
可以将记录指针移动要修改记录的位置处,直接用PutCollect(字段名,值)将新值写入并Update()更新数据库即可。也可以直接查找到要修改的记录然后用PutCollect(),Update()更新数据到数据库。
try{
{
var = m_pRecordset->GetCollect("字段名");
MFC_ODBC_数据库访问技术
MFC_ODBC_数据库访问技术16.2 MFC ODBC 数据库访问技术16.2.1概述ODBC是⼀种使⽤SQL的程序设计接⼝。
使⽤ODBC让程序的编写避免了与数据库相连的复杂性。
Studio为⼤多数标准的数据库格式提供了32位的ODBC驱动器,Paradox、ForPro、Excel、Oracle等。
如果⽤户需要⽤其他的数据库格式,⽤户需要相应的ODBC驱动以及DBMS。
MFC的ODBC类对较复杂的ODBC API进⾏了封装,提供了简化的调⽤接⼝,从⽽⼤⼤⽅便了数据库应⽤程序的开发。
程序员不必了解ODBC API和SQL的具体细节,利⽤ODBC类就可以完成对数据库的⼤部分操作。
MFC 的ODBC类主要包括如下5类:● CDatabase类:主要功能是建⽴与数据源地联接。
● CRecordset类:代表从数据源选择的⼀组记录(记录集)● CRecordView类:提供了⼀个表单视图与某个记录集直接相连,利⽤对话框数据交换机制(DDX)在记录集与表单视图的空间之间传输数据。
● CFieldExchange类:⽀持记录字段数据交换(DFX)应的的数据库的表的字段之间的数据交换。
● CDBException类:代表ODBC类产⽣的异常。
16.2.2使⽤MFC ODBC编程建⽴应⽤程序编程模型相对于使⽤ODBC API,使⽤MFC ODBC访问数据库简单得多,其步骤如下:●⾸先创建数据库并在系统中设置好;●使⽤CDatabase打开数据源的连接,如果利⽤AppWizard⽣成⼀个ODBC数据库应⽤程序,则会⾃动完成操作。
●使⽤ClassWizard想到加⼊由CRecordset类派⽣的⽤户记录集,完成对数据库表的绑定。
●创建记录积累对象,如果利⽤AppWizard⽣成⼀个ODBC数据库应⽤程序,则会⾃动在⽂档类中创建。
●使⽤记录集对象对数据库进⾏遍历、增加、删除、和修改等操作。
●使⽤CDatabase类的ExecuteSQL函数直接执⾏SQL命令。
c语言连接access数据库(odbc)方式
SQL_NTS, (unsigned char*)szConnStrOut,
255, (SQLSMALLINT*)&iConnStrLength2Ptr, SQL_DRIVER_NOPROMPT);
{
printf("%s: Couldn't connect to %s.\n", DAM, szDSN);
}
/* Disconnect and free up allocated handles */
SQLDisconnect(hDbc);
这里修改sql语句。注意两句
*/
#include <windows.h>
#include <stdio.h>
#include <sqlext.h>
/* Data Access Method used in this sample */
const char* DAM = "Direct ODBC";
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
printf("%s: Cleanup. Done.\n", DAM);
}
}
printf("\n");
}
else
{
printf("%s: Error: Number of fields in the result set is 0.\n", DAM);
利用DSN连接ACCESS数据库
利用DSN连接ACCESS数据库1、打开控制面板-管理工具-数据源(ODBC)2、选择系统DSN----添加选择第二项,Driver do Microsoft Access(*mdb)按完成3、在数据源名的地方起个名,我们起个ccc4、单击选择,找到你计算机上的数据库文件,我的在e:\asp\lianxi.mdb,最后确定5、所有的都确定6、接下来我们就可以使用我们所建立的连接了7、接下来我们用下面的文件来测试一下<html><body><h2 align="center">我的通讯录</h2><%'以下连接数据库,建立一个Connection对象实例connDim connSet conn=Server.CreateObject("ADODB.Connection")conn.Open "ccc"//这个地方使用刚才起的数据源的名字'以下建立记录集,建立一个Recordset对象实例rsDim rsSet rs=conn.Execute("Select * From lianxi") //是数据表的名字'以下利用表格显示记录集中的记录%><table border="1" width="100%" align="center"><tr bgcolor="#E0E0E0"><th>姓名</th><th>性别</th><th>年龄</th><th>电话</th><th>E-mail</th><th>简介</th><th>添加日期</th></tr><%Do While Not rs.Eof '只要不是结尾就执行循环%><tr><td><%=rs("strName")%></td><td><%=rs("strSex")%></td><td><%=rs("intAge")%></td><td><%=rs("strTel")%></td><td><a href="mailto:<%=rs("strEmail")%>"><%=rs("strEmail")%></a> </td><td><%=rs("strIntro")%></td><td><%=rs("dtmSubmit")%></td></tr><%rs.MoveNext '将记录指针移动到下一条记录Loop%></table></body></html>下面是我的数据表的格式表名为lianxi.mdb。
vs2010版本的C++OBDC方式连接数据库(ACCESS和SQL2008)
{
m_stuid = L"";
m_stuname = L"";
m_stuclass = L"";
m_usualscore = 0;
m_testscore = 0;
m_totalscore = 0;
m_nFields = 6;
m_nDefaultType = dynaset;
首先是用ACCESS方式连接数据库:
以前VC6.0怎么连接相信大家都能够得到了,他是通过首先打开控制面板->管理工具->数据源(ODBC)
就到了图一界面:
图一
然后点击右边的添加按钮:
很多书里面都叫添加时候选第二项,也就是图二里面所以深色背景那项:
图二
Vc6.0的操作就是这样选择。但在VS2010里面就不对。我用的是VS2010
}
/////////////////////////////////////////////////////////////////////////////
// Cscore诊?断?
#ifdef_DEBUG
voidCscore::AssertValid()const
{
CRecordset::AssertValid();
而不管是这里讲的ODBC模式连接SQL 还是ADO方式这种比较方便的方式连接都需要登录名和密码。你在单击上做练习的话 当然是不需要什么登录名的了,window验证,开机就可以用自然很方便,但是其他软件要访问它,必然要给他权限和接口,所以选择混合模式,设置SQL登录方式中用户名sa的密码。注意:密码一定要复杂不然还通不过。这是其一。
图十一
Access与MFC的链接
1、在MFC的工程中添加一个access文件2、在MFC中添加记录集try{m_pConn.CreateInstance("ADODB.Connection");_bstr_t Connection="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\aaaa.mdb;Persist Security Info=False";//aaaa为你的access的文件名m_pConn->Open(Connection, "", "", adConnectUnspecified);}catch(_com_error &e){::CoUninitialize();::AfxMessageBox(e.ErrorMessage());return FALSE;}3、在stdAfx.h文件中添加语句#import "c:\Program Files\Common Files\System\ADO\msado15.dll"no_namespace rename("EOF", "ENDOFFILE")4、在需要打开数据库的地方添加打开表的函数StrSQL="Select * From bbbb";//bbbb为表名m_pRs.CreateInstance("ADODB.Recordset");m_pRs->Open((_variant_t)StrSQL, _variant_t((IDispatch*)theApp.m_pConn,true), adOpenStatic, adLockOptimistic, adCmdText);{UpdateData(TRUE);//需要干的事情m_pRs->Update();}m_pRs->Close();追问需要ODBC连接的MFC连接Access讲解1.首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll 的附属资源中,只需要直接用#import引用它既可。
MFC和ACCESS数据库的连接
MFC和ACCESS数据库的连接(C_Answers团队开发学生信息管理系统所用)1.通常在应用类(APP类)中进行数据库的连接。
(不在dialog类中,,因为要在出现对话框前已经建立好数据库的连接)第一步:数据库操作准备1)导入ADO动态链接库。
在stdafx.h中。
在工程的stdafx.h中加入如下语句:#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")这一句有何作用呢?其最终作用同我们熟悉的#include类似,编译的时候系统会我们声称msado15.tlh和msado15.tl两个C++头文件来定义ADO库。
即加载ADO动态连接库。
其中no_namespace表明不使用命名空间,rename("EOF","adoEOF")表明把ADO中用到的EOF改为adoEOF,防止命名冲突。
注意:改代码需要在一行中完成,如果写成两行或者多行,末行要加上"\"符号,表示把这几行看成一行。
2)初始化OLE/COM环境,在应用类(app)的lnitlnstance成员函数中。
方法:在应用类的lnitlnstance成员函数中,添加AfxOlenit函数(在退出应用时,该函数也将负责COM资源的释放)BOOL CMy13App::InitInstance(){AfxEnableControlContainer();//添加的初始化OLE/COM环境代码if(!AfxOleInit()){AfxMessageBox("初始化OLE DLL失败!");return FALSE;}第二步:连接数据库1)先在APP头文件中声明一个connection指针。
mfc access建表
在 MFC 中使用 Access 数据库建立表格,可以按照以下步骤进行操作:1. 首先,确保你已经安装了 Microsoft Office 软件,并且拥有 Access 数据库。
2. 在 MFC 项目中打开你要操作数据库的类文件(例如 CMyDatabaseClass.cpp)。
3. 导入必要的头文件:```cpp#include <afxdao.h>```4. 定义一个函数用于创建表格,可以在类的成员函数中添加如下代码:```cppvoid CMyDatabaseClass::CreateTable(){CString strConnect;CDaoDatabase db;// 设置连接字符串,指定 Access 数据库文件路径和驱动类型strConnect.Format(_T("ODBC;DRIVER={Microsoft Access Driver(*.mdb)};DSN='';DBQ=%s"), _T("C:\\YourDatabase.mdb"));try{// 打开数据库连接db.Open(strConnect);// 创建表格的 SQL 语句CString strSql = _T("CREATE TABLE YourTable (ID INT PRIMARY KEY, Name VARCHAR(50), Age INT)");// 执行 SQL 语句db.Execute(strSql);// 关闭数据库连接db.Close();}catch (CDaoException* e){// 处理异常// 输出错误信息等e->Delete();}}```请注意,上述代码中的 `C:\\YourDatabase.mdb` 部分应替换为你实际的 Access 数据库文件路径。
5. 现在,你可以在需要的地方调用 `CreateTable` 函数来创建表格了。
MFC+ODBC操作Access数据库
UpdateData(false); m_pt->Invalidate(); } 注:如果要修改窗口标题,可以去 CMainFrame 类找到 PreCreateWindow()利用 cs 变 量来设置,在函数 PreCreateWindow()添加如下代码: cs.style &= ~FWS_ADDTOTITLE; cs.lpszName = "0706034138 张新亮";//引号里可以换成任何你想的名称。
m_set.AddNew(); UpdateData(true); m_set.m_column1= m_e1; m_set.m_column2 = m_e2; m_set.m_column3 = m_e3; m_set.m_column4 = m_e4; m_set.m_column5 = m_e5; m_set.m_VC__ = m_e6; UpdateData(false); m_set.Update(); m_set.Close(); m_pt->Invalidate(); } } void CTestDlg::OnButtonAlter() { // TODO: Add your control notification handler code here if (m_set.IsOpen()) { m_set.Close(); } m_set.Open(); if (!m_set.CanUpdate()) { AfxMessageBox(_T("无法更新")); } else { UpdateData(true); for (int i=0;i<m_set.GetRecordCount();i++) { if(strcmp(m_set.m_column1,m_e1)) { m_set.MoveNext(); } else { m_set.Edit(); m_set.m_column1 = m_e1;
mfc使用ado连接access数据库
1.设置数据源打开控制面板--->系统和安全--->管理工具--->ODBC Data Sources(32 bit)这里需要注意的是,vc6.0是32位的,因此这里的数据源也必须是32位的,否则是连接不上的,这里我使用的是ACCESS数据库,数据源的配置如下:2.创建包含数据库的MFC对话框(其它也可以)工程,新建ADOConn类在工程中我们需要新建一个普通类ADOConn然后在ADOConn类头文件中加入以下导入声明和变量、函数声明:ADOConn.h---------------------------------------------------------------------------------#import "c:\Program Files\Common Files\System\ado\msado15.dll"no_namespace rename("EOF","adoEOF")//引入ADO库文件public:_ConnectionPtr m_pConnection;//连接对象指针_RecordsetPtr m_pRecordset;//记录集对象指针_CommandPtr m_pCommand;//命令对象指针ADOConn();virtual ~ADOConn();BOOL OnInitADOConn(CString Connstr);//初始化连接数据库BOOL ExecuteSQL(CString strSQL);//执行SQL语句BOOL ExecuteProc(CString ProcName);//执行存储过程BOOL GetCollect(CString FieldName,CString & strDest);//获得某个字段的值 BOOL GetRecordSet(CString strSQL);//获得记录集int GetRecordCount();//获得记录数//判断表TableName中是否存在字段KeyName的值为KeyValue的记录 BOOL RecordExist(CString TableName,CString KeyName,CString KeyValue); BOOL MoveFirst();//移动到第一条记录BOOL MoveNext();//移动到下一条记录BOOL Close();//关闭记录集BOOL CloseADOConnection();//关闭连接void dump_com_error(_com_error &e);//错误详细信息ADOConn.h---------------------------------------------------------------------------------然后在ADOConn类源文件中加入函数实现:ADOConn.cpp---------------------------------------------------------------------------------ADOConn::ADOConn()//构造函数{}ADOConn::~ADOConn()//析构函数{}BOOL ADOConn::OnInitADOConn(CString ConnStr)//初始化连接数据库{try{m_pRecordset.CreateInstance("ADODB.Recordest");m_pCommand.CreateInstance("mand");m_pConnection.CreateInstance("ADODB.Connection");_bstr_t strConnect=(_bstr_t)ConnStr;m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown);AfxMessageBox("数据库连接成功");return true;}catch(_com_error e){AfxMessageBox("数据库连接失败");return false;}}BOOL ADOConn::ExecuteSQL(CString strSQL)//执行SQL语句{try{m_pConnection->BeginTrans();m_pConnection->Execute(_bstr_t(strSQL),NULL,adCmdText);m_pConnection->CommitTrans();return true;}catch(_com_error e){m_pConnection->RollbackTrans();AfxMessageBox("执行SQL语句失败");return false;}}BOOL ADOConn::ExecuteProc(CString ProcName)//执行存储过程{m_pCommand->ActiveConnection=m_pConnection;m_pCommand->CommandText=_bstr_t(ProcName);m_pCommand->Execute(NULL,NULL,adCmdStoredProc);return true;}catch(_com_error e){AfxMessageBox("执行存储过程失败");return false;}}BOOL ADOConn::GetCollect(CString FieldName,CString & strDest)//获得某个字段的值{VARIANT vt;try{vt=m_pRecordset->GetCollect(_variant_t(FieldName));switch(vt.vt){case VT_BSTR:strDest=(LPCSTR)_bstr_t(vt);break;case VT_DECIMAL:strDest.Format("%d",vt.intVal);break;case VT_DATE:{DATE dt=vt.date;COleDateTime da=COleDateTime(dt);strDest.Format("%d-%d-%d %d: %d: %d",da.GetYear(),da.GetMonth(),da. GetDay(),da.GetHour(),da.GetMinute(),da.GetSecond());break;}case VT_NULL:strDest="";break;}return true;}catch(_com_error e){AfxMessageBox(e.ErrorMessage());return false;}return true;}BOOL ADOConn::GetRecordSet(CString strSQL)//获得记录集{m_pCommand->CommandText=(_bstr_t)strSQL;m_pCommand->ActiveConnection=m_pConnection;m_pCommand->CommandType=adCmdText;m_pRecordset=m_pCommand->Execute(NULL,NULL,adCmdText);return true;}catch(_com_error e){AfxMessageBox("执行select语句失败");return false;}}int ADOConn::GetRecordCount()//获得记录数{DWORD nRows = 0;nRows=m_pRecordset->GetRecordCount();if(nRows==-1){nRows=0;if(m_pRecordset->adoEOF!=VARIANT_TRUE) m_pRecordset->MoveFirst();while(m_pRecordset->adoEOF!=VARIANT_TRUE){nRows++;m_pRecordset->MoveNext();}if(nRows>0)m_pRecordset->MoveFirst();}return nRows;}//判断表TableName中是否存在字段KeyName的值为KeyValue的记录BOOL ADOConn::RecordExist(CString TableName,CString KeyName,CString KeyValue) {CString countstr;countstr="select * from "+TableName+"where"+KeyName+"=\'"+KeyValue+"\'"; BOOL ret =GetRecordSet(countstr);if(ret){int ret2=GetRecordCount();if(ret2) return true;else return false;}else return false;}BOOL ADOConn::MoveFirst()//移动到第一条记录{try{m_pRecordset->MoveFirst();return true;}catch(_com_error e){AfxMessageBox("结果集移到第一个失败");return false;}}BOOL ADOConn::MoveNext()//移动到下一条记录{try{m_pRecordset->MoveNext();return true;}catch(_com_error e){AfxMessageBox("结果集移到下一个失败");return false;}}BOOL ADOConn::Close()//关闭记录集{try{m_pRecordset->Close();return true;}catch(_com_error e){AfxMessageBox("关系结果集失败");return false;}}BOOL ADOConn::CloseADOConnection()//关闭连接{try{if(m_pConnection->State){m_pConnection->Close();m_pConnection=NULL;return true;}else{AfxMessageBox("关闭数据库失败");return false;}}catch(_com_error e){AfxMessageBox("关闭数据库失败");return false;}}void ADOConn::dump_com_error(_com_error &e) //错误详细信息{CString ErrorStr;_bstr_t bstrSource(e.Source());_bstr_t bstrDescription(e.Description());ErrorStr.Format( "/n/tADO Error/n/tCode = %08lx/n/tCode meaning= %s/n/tSource = %s/n/tDescription = %s/n/n",e.Error(), e.ErrorMessage(), (LPCTSTR)bstrSource,(LPCTSTR)bstrDescription );//在调试窗口中打印错误信息,在Release版中可用DBGView查看错误信息::OutputDebugString((LPCTSTR)ErrorStr);#ifdef _DEBUGAfxMessageBox(ErrorStr, MB_OK | MB_ICONERROR);#endif}ADOConn.cpp---------------------------------------------------------------------------------3.编写代码连接数据库(这里我用的是ACCESS数据库)这里我们可以在任意.CPP(源文件)中声明ADOConn ado;然后在其他.CPP中使用的时候,只需要在头部加上extern ADOConn ado;当然,在定义的类中同样可以使用,举例如下:然后进行连接数据库的代码如下://进行数据库连接if(!AfxOleInit()){AfxMessageBox("OLE initialzation failed");return FALSE;}CString str="DSN=rapidquery";//这个字符串中的rapidquery就是我们之前设置的数据源的名称ado.OnInitADOConn(str);//调用dao对象去连接数据库,连接成功会提示,连接失败也会提示。
mfc访问mysql数据库的方法
mfc访问mysql数据库的方法MFC是Microsoft Foundation Classes的缩写,是一种用于开发Windows应用程序的C++框架。
在MFC中,我们可以使用各种方法来访问MySQL数据库。
一种常见的方法是使用ODBC(Open Database Connectivity)来连接和操作数据库。
首先,我们需要在项目中配置ODBC数据源。
可以通过控制面板的ODBC 数据源管理器来完成这一步骤。
在配置完成后,我们可以在MFC应用程序中使用CDatabase类来连接到MySQL数据库。
下面是一个简单的示例代码:```#include <afxdb.h>// ...void AccessMySQLDatabase(){CDatabase database;// 构建连接字符串CString strConnect;strConnect.Format(_T("ODBC;DSN=MySQLDataSourceName;UID=Username;PWD=P assword"));// 连接数据库if(database.Open(NULL, FALSE, FALSE, strConnect)){// 执行SQL查询或更新语句CString strSQL;strSQL.Format(_T("SELECT * FROM TableName"));CRecordset recordset(&database);if(recordset.Open(CRecordset::forwardOnly, strSQL)){// 遍历记录集并获取数据while(!recordset.IsEOF()){// 通过GetFieldValue方法获取字段值CString fieldValue;recordset.GetFieldValue(_T("FieldName"), fieldValue); // 处理数据...recordset.MoveNext();}recordset.Close();}// 关闭数据库连接database.Close();}}```上述代码通过CDatabase类连接到MySQL数据库,并执行了一个简单的SELECT语句来获取表中的数据。
用MFC ODBC操作Access数据库
用MFC ODBC操作Access数据库2004-06-09 11:05作者:金花胡荣强程永谊出处:论坛责任编辑:方舟摘要:本文简要介绍了MFC ODBC的工作原理,并且通过一个应用实例,讨论了利用MFC ODBC技术实现对Access数据源的显示,在此基础上,分析了如何设计以达到利用MFC ODBC来实现修改、增加、删除Access数据源中的记录的功能。
关键词:VC;MFC ODBC;Access;数据库MFC ODBC数据库简述开放数据互连(Open Database Connectivity,简称ODBC)是一种数据库的互操作平台,通过经严格定义的各个级别的ODBC接口和客户系统的初始装置,能够为应用程序提供数据库类型透明性和位置透明性,让应用程序的编写者避免了与数据源相联的复杂性。
MFC的数据库扩展部分封装了使用ODBC数据资源的细节,应用程序可以直接使用MFC中的数据库扩展类,来操纵ODBC驱动程序管理器,访问数据库。
进行MFC ODBC数据库开发时,所需的基础工具就是MFC ODBC数据库类的使用。
利用MFC ODBC开发就是利用MFC ODBC数据库类来操纵ODBC数据源。
Visual C++的大多数ODBC访问是通过MFC来完成的。
Visual C++的MFC类库定义了几个数据库类,在利用MFC编程时常常用到,它们是CDatabase(数据库类)、CRecordSet(记录集类)、和CRecordView(可视记录集类)。
对于MFC ODBC数据库类来说,CDatabase类对象表示一个同数据源的连接,通过它可以对数据源进行操作。
而CRecordSet对象代表从数据源中选择的一组记录的集合,也就是通常所说的记录集对象。
CRecordSet对象通常用于两种形式:动态集(dynasets)和快照集(snapshots)。
动态集能与其他用户所做的更改保持同步,快照集则是数据的一个静态视图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用MFC ODBC操作Access数据库MFC ODBC数据库简述开放数据互连(Open Database Connectivity,简称ODBC)是一种数据库的互操作平台,通过经严格定义的各个级别的ODBC接口和客户系统的初始装置,能够为应用程序提供数据库类型透明性和位置透明性,让应用程序的编写者避免了与数据源相联的复杂性。
MFC 的数据库扩展部分封装了使用ODBC数据资源的细节,应用程序可以直接使用MFC中的数据库扩展类,来操纵ODBC驱动程序管理器,访问数据库。
进行MFC ODBC数据库开发时,所需的基础工具就是MFC ODBC数据库类的使用。
利用MFC ODBC开发就是利用MFC ODBC数据库类来操纵ODBC数据源。
Visual C++的大多数ODBC 访问是通过MFC来完成的。
Visual C++的MFC类库定义了几个数据库类,在利用MFC编程时常常用到,它们是CDatabase(数据库类)、CRecordSet(记录集类)、和CRecordView(可视记录集类)。
对于MFC ODBC数据库类来说,CDatabase类对象表示一个同数据源的连接,通过它可以对数据源进行操作。
而CRecordSet对象代表从数据源中选择的一组记录的集合,也就是通常所说的记录集对象。
CRecordSet对象通常用于两种形式:动态集(dynasets)和快照集(snapshots)。
动态集能与其他用户所做的更改保持同步,快照集则是数据的一个静态视图。
每一种形式在记录被打开时都提供一组记录,区别在于,当用户在一个动态集里滚动到一条记录时,有其他用户或是应用程序中的其他记录集所做的更改就会相应地显示出来。
CRecordView类对象能以控制的形式显示数据库记录。
这个视图是直接连接到一个CRecordSet对象的表视图。
一个应用实例本实例是某项目中的一部分,目的是实现MFC ODBC数据库与Access数据表格之间的相互操作。
包括用Visual C++中的MFC ODBC技术实现对Access数据表格的内容的显示、添加、修改和删除的功能。
1、ODBC数据源的创建笔者使用的操作系统为Windows XP,工具是Visual C++6.0。
此例中建立的Access表格取名为“plc”。
在“控制面板”中双击“管理工具”图标,然后在新出现的窗口中双击“数据源(ODBC)”,在弹出的对话框中选中“用户DSN”中的“dBASEFiles”,单击“添加”按钮,从弹出的对话框中选中“Microsoft Access Driver(*.mdb)”。
单击“完成”后,将弹出一个新的对话框,在数据源名及说明后的编辑框中填入表格名“plc”。
在命名数据源之后,需要把它连接到一个数据库。
单击“选择”,如图1所示,得到存储在数据目录中plc.mdb的拷贝文件,选中之,单击“确定”关闭此对话框。
然后单击“确定”,完成数据源的创建。
2、使用AppWizard创建一个数据库应用程序笔者开始从AppWizard开始创建一个新的MFC AppWizard(exe)项目。
命名为Jh,然后遵从以下步骤:1)在MFC AppWizard第一步对话框中,选择“单个文档”。
2)在MFC AppWizard第二步对话框中,选择“查看数据库不使用文件支持”,再单击“Data Source”。
3)在RecordSet Type组框中,选择Dynaset。
在Data Source 组框中,单击ODBC单选按钮,然后从下拉列表中选择plc,如图2所示,单击ok,在弹出的新的对话框中选中message,即为本项目所要操作的表。
以后几步接收缺省值,单击“完成”即可。
至此,已创建一个应用程序,并且在程序中自行生成一个数据源和数据源中的一个表的相关程序,其程序清单如下:class CJhSet : public Crecordset//基于CRecordset的CjhSet新类{public:CJhSet(CDatabase* pDatabase = NULL);DECLARE_DYNAMIC(CJhSet)// Field/Param Data//{{AFX_FIELD(CJhSet, CRecordset)//对应表中一些被绑定字段的变量CString m_baudrate;CString m_type;CString m_unit;CString m_number;CString m_address;CString m_istart;CString m_iend;CString m_ostart;CString m_oend;//}}AFX_FIELD// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CJhSet)public:virtual CString GetDefaultConnect(); // 返回被连接的数据源名称virtual CString GetDefaultSQL(); // 返回数据源中所选表名称virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support//}}AFX_VIRTUAL// Implementation#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endif};3、实现程序的显示记录的功能一旦AppWizard完成编写这些文件,它将启动对话框编辑器,这样就可以设计自己的表单了。
CRecordView应用程序围绕着充当应用程序主窗口的对话框而创建。
笔者也将使用像表单一样的对话框来显示存储在plc数据库记录域中的值。
如图3所示来放置静态文本框与编辑文本框。
CJHSet类的成员变量如图4所示。
所有的变量均为CString对象。
由AppWizard创建的每个变量的类型一般与相应数据库域的类型相似。
除了创建成员变量,AppWizard还编写了一组数据交换函数——类似于对话框的DDX函数——来在用来显示信息的控件与定义于CRecordSet类中的数据库域之间交换信息。
为了实现数据传输,就要把每个控件与代表数据库域的CJHSet 变量联系起来。
笔者通过使用CJHView来成员变量m_pSet来指向应用程序的CJHSet对象。
选择每个资源ID(笔者这里未修改编辑框的默认ID),并单击Add Variable,从下拉表中直接选择相应的成员变量名。
全部设置好之后单击OK,至此,运行程序,就可以实现简单的与数据库之间的数据显示功能。
4、实现程序的添加、修改和删除记录的功能在实现上述功能之前,需要按“插入->资源->DIALOG->新建”建立一个新的对话框(与图1所示对话框类似),以建立添加、修改的对象。
并为此对话框建立一个基于CDialog基础类的新的类CAddDlg。
其ID为IDD_DIALOG1。
然后在JhView.cpp中加“#include "AddDlg.h"”,并为“添加记录(IDC_ADD)”键编写程序代码如下。
其中已经作了详细的注解。
void CJhView::OnAdd(){//建立一个新的添加对话框CAddDlg dlg;if(dlg.DoModal()==IDOK){//增加一条新的记录m_pSet->AddNew();//把对话框中的记录传递到记录集中m_pSet->m_baudrate=dlg.m_br;m_pSet->m_type=dlg.m_ty;m_pSet->m_unit=dlg.m_un;m_pSet->m_number=dlg.m_nu;m_pSet->m_address=dlg.m_add;m_pSet->m_istart=dlg.m_is;m_pSet->m_iend=dlg.m_ie;m_pSet->m_ostart=dlg.m_os;m_pSet->m_oend=dlg.m_oe;m_pSet->Update(); //把新的记录存在数据源里m_pSet->MoveLast(); //指定当前记录为最后一条记录UpdateData(false); //清空已输入内容}}添加记录部分,应该先读出当前的记录,使其显示在添加/修改对话框中,即:dlg.m_br=m_pSet->m_baudrate;dlg.m_ty=m_pSet->m_type;dlg.m_un=m_pSet->m_unit;dlg.m_nu=m_pSet->m_number;dlg.m_add=m_pSet->m_address;dlg.m_is=m_pSet->m_istart;余下的与添加记录代码相同,除了不要定位“m_pSet->MoveLast();”而已。
删除记录只是需要使用Delete()成员函数删除当前记录之后移到下一个记录即可。
程序清单如下:void CJhView::OnDel(){try//试着删除一条记录{m_pSet->Delete();}catch(CDBException*error){AfxMessageBox(error->m_strError);error->Delete();m_pSet->MoveFirst();UpdateData(FALSE);return;}//移到下一个记录m_pSet->MoveNext();//测试是否为文件末尾,是,则使用MoveLast(),而不是使用MoveNext()if(m_pSet->IsEOF())m_pSet->MoveLast();UpdateData(FALSE);}对多个记录集的操作与对单个记录集的操作类似,只是增加了CRecordSet类的派生类。
结束语MFC ODBC让开发人员仅仅使用很少的代码就可以完成复杂的数据库访问,并可以对数据库中的内容方便的实现添加、修改、删除等操作,从而极大地减少了软件开发的工作量,缩短了开发周期,提高了效率。
而且MFC ODBC简单易学,能实现大部分ODBC API 函数的功能,所以了解和掌握MFC ODBC技术,将会给大型数据库应用软件带来清晰、快捷、方便等功能。
本文中的实例已经在VisualC++6.0环境下调试通过。
共3页。