日期:2010-06-05 浏览次数:20789 次
最近一直在学习研究用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.GetRec