王朝网络
分享
 
 
 

学习ADO和ODBC访问数据库的一些思路整理

王朝vc·作者佚名  2006-01-31
宽屏版  字体: |||超大  

最近一直在学习研究用vc++访问数据库的问题,使用过ADO,也使用过ODBC。就这两种连接数据源的接口都有好几种方式,可以利用database,也可以利用dataset。利用这个word把我学习的思路整理一下。

一、 使用ADO连接数据源

一般来说当建立基于对话框的应用程序时,都选择使用ADO比较方便(这纯属个人习惯问题)。

1. 直接在应用程序中建立与数据库的connection

2. 自己写一个ADOConnection类作为应用程序操作数据库的接口,这样操作的层次更明显,程序的分层思想也体现较好。

下面分别就这两种方法做个总结。

1. 直接在应用程序中建立与数据库的connection

在应用程序中要使用ADO,则需要引入ADO的动态连接库。其方法为:

在StdAfx.h中:#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")

目的:产生msado15.tlh和msado15.tli两个头文件来定义ADO库。

定义好ADO库后,应初始化COM库环境。其方法为:

在C***APP::InitInstance中定义_ConnectionPtr m_pConnection;

AfxOleInit();//使用AfxOleInit初始化OLE/COM库环境

//创建ADO连接

m_pConnection.CreateInstance(_uuidof(Connection));

//在ADO操作中使用try...catch捕获错误

try

{ m_pConnection->Open("provider=SQLOLEDB;server=ZENGYH;database=postms;uid=sa;pwd=hongyi","","",adModeUnknown);

}

catch (_com_error e)

{

AfxMessageBox("连接数据库失败!");

return FALSE;

}

而相应的释放数据库的连接:

在C***APP:: ExitInstance中:

m_pConnection->Close();

::OleUninitialize();

至此,关于数据库的连接与断开就能顺利实现,接下来将是对数据库中表的操作,即对记录集操作。

当操作数据库的表时,需先声明数据集指针:_RecordsetPtr m_pRecordset;

与创建ADO连接类似,需要在所操作的对话框类的OnInitDialog()中创建记录集对象:

m_pRecordset.CreateInstance(_uuidof(Recordset));

如此之后将可以使用m_pRecordset来查询,修改,删除数据库等。

打开要操作的表可使用m_pRecordset的open函数m_pRecordset->Open("select * from STUDENTS",theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

记录集的查询操作:

使用可以使用如下的函数来实现记录集的移动Movefirst, movenext , moveprev,movelast。

提取列属性:getcollect(“列名”),注意:此处的返回值类型为:_variant_t,这个类型类包含了许多与c++所支持的类型的转换函数,较常用的是与cstring类型的转换(LPCSTR)_bstr_t(_variant_t类型变量)。

记录集的增加操作:

确保要操作的记录集打开之后,首先调用m_pRecordset->addnew(),addnew之后将自动生成一个供记录集域值使用的新的空记录,来存放即将增加的数据信息,系统将自动执行sql的insert语句来插入记录。

然后通过设置列属性:putcollect(“列名”,_variant_t &pvar)来设置记录信息

设置之后一定要调用m_pRecordset->update来更新记录集

记录集的修改操作:

修改操作与增加操作类似,唯一不同之处在于不用先调用addnew,而直接将记录集指针移动到需要修改的记录处,执行putcollect操作。

之后再update。

记录集的删除操作:

当找到需要删除的记录时,利用m_pRecordset->Delete(adAffectCurrent);可以删除当前的记录。

再update即可。

当然,在每次需要对记录集操作之前应当打开需要操作的表的记录集,操作完毕应关闭相应记录集,这样可以保证只声明一个记录集指针,每次只操作一个记录集,可以节约资源。

另外,在修改和删除操作中也可能需要查询满足条件的记录,可以这样实现:

str.Format("select * from STUDENTS where StuID='%s'",m_StuID); m_pRecordset->Open(str.AllocSysString(),theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

2. 自己写一个ADOConnection类作为应用程序操作数据库的接口

通过自定义的ADOConnection类封装与应用程序操作数据库的接口(在这个类中应首先声明_connectionptr 和_recordsetptr指针),这个类中要实现的功能包括:定义ADO库,初始化与ADO的连接,释放连接,初始化记录集(方法1的初始化是在相应类的OnInitDialog()中实现),执行SQL语句

定义ADO库,初始化与ADO的连接,释放连接与方法1一致;

初始化记录集:

_RecordsetPtr & CAdoConnection::GetRecordset(_bstr_t mySql)

{

try

{

if (m_pConnection==NULL)

{

OnInitAdoConneciton();

}

m_pRecordset.CreateInstance(_uuidof(Recordset));

m_pRecordset->Open(mySql,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

}

catch (_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

return m_pRecordset;

}

执行SQL语句主要使用connection来实现(不同于方法1利用记录集来实现)

bool CAdoConnection::ExecuteSql(_bstr_t mySql)

{ m_pConnection->Execute(mySql,NULL,adCmdText);}

至此,在应用程序中可以通过定义这个ADOConnection的实例来完成相应的操作。

查询操作:

首先定义ADOConnection,执行初始化ADO连接;

根据查询条件取得记录集指针:

_bstr_t mySql="select * from COURSES where CouID='"+m_CouID+"'";

_RecordsetPtr myRecordset=myConnection.GetRecordset(mySql);

根据指针的返回情况进行处理。

添加操作:

首先根据实际情况判断所要添加的记录是否存在(类似查询);

若返回的指针是为空,则说明要添加的记录不存在,则可以执行insert:

mySql="insert into COURSES values('"+m_CouID+"','"+m_CouName+"',"+CouScore+","+CouTea+",'"+m_CouKind+"')";

myConnection.ExecuteSql(mySql);

修改操作、删除操作:

与添加操作类似,执行update和delete语句

说明:每个函数中的初始化ADOConnection和释放应相对应。

与方法1相比,不需要单条操作记录集,记录集指针也可以声明多个,执行sql语句更方便。

记录集的初始化可以通用到ADOConnection类中,而无需方法1中在不同的类中初始化各自的记录集。

二、 使用ODBC连接数据源

一般来说建立基于文档视图的应用程序时,使用此方法连接数据源。

1. 使用CDatabase类中的executesql执行SQL语句

当创建基于单文档的应用程序时,若在第二步选择database view with file support,则需要配置ODBC数据源(如student表),并且生成的应用程序的基类为recordview。那么生成的应用程序的Doc类中将自动生成所绑定的数据集类(cstudentset m_studentset),View类中将自动生成(cstudentset *m_pset)。

连接数据库:

对数据库的连接要重载BOOL CStudentDoc::OnNewDocument():

在该函数中加入这样的代码(m_database是我在文档类中定义的成员变量CDatabase):

if(m_pStudentSet==NULL)

{

m_pStudentSet=new CStudentSet(&m_database);

CString strConnect=m_pStudentSet->GetDefaultConnect();

m_database.Open(NULL,false,false,strConnect,false);

}

这里m_pStudentSet是在该文档类中重新定义的一个CStudentSet记录集指针

至此可以建立应用程序与数据库的连接。

添加记录操作:

在相应函数中声明CDatabase m_database

在函数中定义CStudentSet mySet(&m_database);

再打开记录集myset.open();

mySet.AddNew();

CString mySql;

mySql="insert into STUDENTS(StuID,StuName) values('"+m_pSet->m_StuID+"','"+m_pSet->m_StuName+"')";

m_database.ExecuteSQL(mySql);

mySet.Update();

删除记录、修改记录操作:

在函数中定义CStudentSet mySet(&m_database);

再打开记录集myset.open();

mySet.Edit();

mysql=…….

m_database.ExecuteSQL(mySql);

mySet.Update();

查询记录操作:

仍然可以选用记录集指针的移动,getcollect来实现。

最后,不要忘记myset.close()。

当然也可以使用CRecordset类来执行查询、删除、修改、添加操作。基本方法跟前面所提到的一致。

这是我第一次在博客里面发文章,对于不成熟或者不正确的思想还请大家提出,谢谢。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有