VS连接VC++的三种方法ADO.docx
- 文档编号:23951464
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:15
- 大小:215.76KB
VS连接VC++的三种方法ADO.docx
《VS连接VC++的三种方法ADO.docx》由会员分享,可在线阅读,更多相关《VS连接VC++的三种方法ADO.docx(15页珍藏版)》请在冰豆网上搜索。
VS连接VC++的三种方法ADO
C++数据库连接技术
VisualC++提供了多种多样的数据库访问技术——ODBCAPI、MFCODBC、DAO、OLEDB、ADO等。
其中ADO技术是基于OLEDB的访问接口,它继承了OLEDB技术的优点,并且,ADO对OLEDB的接口作了封装,定义了ADO对象,使程序开发得到简化,ADO技术属于数据库访问的高层接口。
具体操作(以VS2008,SQLSERVER2008为例):
1.引入ADO库文件
使用ADO前必须在工程的stdafx.h文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。
代码如下所示:
#import"C:
\ProgramFiles\CommonFiles\System\ado\msado15.dll"no_namespacerename("EOF","rsEOF")
这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免冲突,将EOF改名为EndOfFile。
2初始化ADO环境
在使用ADO对象之前必须先初始化COM环境。
初始化COM环境可以用以下代码完成:
:
:
CoInitialize(NULL);
在初始化COM环境后,就可以使用ADO对象了,如果在程序前面没有添加此代码,将会产生COM错误。
在使用完ADO对象后,需要用以下的代码将初始化的对象释放:
:
:
CoUninitialize();
此函数清除了为ADO对象准备的COM环境。
3接口简介
ADO库包含三个基本接口:
__ConnectionPtr接口创建数据库连接
__CommandPtr接口执行SQL命令
__RecordsetPtr接口返回结果集
__ConnectionPtr接口返回一个记录集或一个空指针。
通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。
用__ConnectionPtr接口返回一个记录集不是一个好的使用方法。
__CommandPtr接口返回一个记录集。
它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。
在使用__CommandPtr接口时,可以利用全局__ConnectionPtr接口,也可以在__CommandPtr接口里直接使用连接串。
如果只执行一次或几次数据访问操作,后者是比较好的选择。
但如果要频繁访问数据库,并要返回很多记录集,那么,应该使用全局__ConnectionPtr接口创建一个数据连接,然后使用__CommandPtr接口执行存储过程和SQL语句。
__RecordsetPtr是一个记录集对象。
与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。
同__CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给__RecordsetPtr的connection成员变量,让它自己创建数据连接。
如果要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局—ConnectionPtr接口,然后使用__RecordsetPtr执行存储过程和SQL语句。
4使用ADO访问数据库
__ConnectionPtr是一个连接接口,首先创建一个__ConnectionPtr接口实例,接着指向并打开一个ODBC数据源或OLEDB数据提供者(Provider)。
//使用—ConnectionPtr(基于非DSN)
_ConnectionPtrpConn(__uuidof(Connection));
pConn->ConnectionString="Provider=SQLOLEDB.1;Password=MSSQLSERVER;PersistSecurityInfo=True;UserID=sa;InitialCatalog=AdventureWorksLT2008;DataSource=PC-200201010005";
pConn->Open("","","",adConnectUnspecified);
//使用—CommandPtr执行SQL语句
_CommandPtrpCmd(__uuidof(Command));
pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));
pCmd->CommandText="selectCityfromAdventureWorksLT2008.SalesLT.Address";
//使用__RecordsetPtr返回结果集
_RecordsetPtrpRst(__uuidof(Recordset));
pRst=pCmd->Execute(NULL,NULL,adCmdText);
现在我们已经有了一个数据连接和一个记录集,接下来就可以使用数据了。
1、在StdAfx.h中加入
#import"C:
\ProgramFiles\CommonFiles\System\ado\msado15.dll"no_namespacerename("EOF","adoEOF")
这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。
现在不需添加另外的头文件,就可以使用ADO接口了。
2、初始化OLE/COM库环境
必须注意的是,ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。
在MFC应用程序里,一个比较好的方法是在应用程序主类的InitInstance成员函数里初始化OLE/COM库环境。
BOOLCMyAdoTestApp:
:
InitInstance()
{
if(!
AfxOleInit())//这就是初始化COM库
{
AfxMessageBox(“OLE初始化出错!
”);
returnFALSE;
}
……
}
3、ADO接口简介
ADO库包含三个基本接口:
_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。
_ConnectionPtr接口返回一个记录集或一个空指针。
通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。
使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。
对于要返回记录的操作通常用_RecordserPtr来实现。
而用_ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。
_CommandPtr接口返回一个记录集。
它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。
在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。
如果你只执行一次或几次数据访问操作,后者是比较好的选择。
但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。
_RecordsetPtr是一个记录集对象。
与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。
同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。
如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口
,然后使用_RecordsetPtr执行存储过程和SQL语句。
4、使用_ConnectionPtr接口
_ConnectionPtr主要是一个连接接口,取得与数据库的连接。
它的连接字符串可以是自己直接写,也可以指向一个ODBCDSN。
。
_ConnectionPtrpConn;
if(FAILED(pConn.CreateInstance("ADODB.Connection")))
{
AfxMessageBox("CreateInstancefailed!
");
return;
}
CStringstrSRC="Provider=SQLOLEDB.1;InitialCatalog=vctestdb;DataSource=127.0.0.1";
CStringstrSQL="insertinto[user]([id],[name])values(10,'yucuicui')";
_variant_tvarSRC(strSRC);
_variant_tvarSQL(strSQL);
_bstr_tbstrSRC(strSRC);
if(FAILED(pConn->Open(bstrSRC,"sa","123",-1)))
{
AfxMessageBox("CannotopenDatabase!
");
pConn.Release();
return;
}
COleVariantvtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
try{
pConn->Execute(_bstr_t(strSQL),&vtOptional,-1);
}catch(_com_errore){
AfxMessageBox(e.ErrorMessage());
pConn.Release();
return;
}
pConn.Release();
AfxMessageBox("ok!
");
5、使用_RecordsetPtr接口(以连接SQLServer为例)
_RecordsetPtrpPtr;
if(FAILED(pPtr.CreateInstance("ADODB.Recordset")))
{
AfxMessageBox("CreateInstancefailed!
");
returnFALSE;
}
CStringstrSRC;
strSRC="Driver=SQLServer;Server=";
strSRC+="210.46.141.145";
strSRC+=";Database=";
strSRC+="mydb";
strSRC+=";UID=sa;PWD=";
strSRC+="sa";
CStringstrSQL="selectid,name,gender,addressfrompersonal";
_variant_tvarSRC(strSRC);
_variant_tvarSQL(strSQL);
if(FAILED(pPtr->Open(varSQL,varSRC,adOpenStatic,adLockOptimistic,adCmdText)))
{
AfxMessageBox("Opentablefailed!
");
pPtr.Release();
returnFALSE;
}
while(!
pPtr->GetadoEOF())
{
_variant_tvarNo;
_variant_tvarName;
_variant_tvarSex;
_variant_tvarAddress;
varNo=pPtr->GetCollect("id");
varName=pPtr->GetCollect("name");
varSex=pPtr->GetCollect("gender");
varAddress=pPtr->GetCollect("address");
CStringstrNo=(char*)_bstr_t(varNo);
CStringstrName=(char*)_bstr_t(varName);
CStringstrSex=(char*)_bstr_t(varSex);
CStringstrAddress=(char*)_bstr_t(varAddress);
strNo.TrimRight();
strName.TrimRight();
strSex.TrimRight();
strAddress.TrimRight();
intnCount=m_list.GetItemCount();
intnItem=m_list.InsertItem(nCount,_T(""));
m_list.SetItemText(nItem,0,strNo);
m_list.SetItemText(nItem,1,strName);
m_list.SetItemText(nItem,2,strSex);
m_list.SetItemText(nItem,3,strAddress);
pPtr->MoveNext();
}
pPtr->Close();
pPtr.Release();
6、使用_CommandPtr接口
_CommandPtr接口返回一个Recordset对象,并且提供了更多的记录集控制功能,以下代码示例了使用_CommandPtr接口的方法:
代码11:
使用_CommandPtr接口获取数据
_CommandPtrpCommand;
_RecordsetPtrpRs;
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection=pConn;
pCommand->CommandText="select*fromstudent";
pCommand->CommandType=adCmdText;
pCommand->Parameters->Refresh();
pRs=pCommand->Execute(NULL,NULL,adCmdUnknown);
_variant_tvarValue=pRs->GetCollect("name");
CStringstrValue=(char*)_bstr_t(varValue);
6、关于数据类型转换由于COM对象是跨平台的,它使用了一种通用的方法来处理各种类型的数据,
因此Cstring类和COM对象是不兼容的,我们需要一组API来转换COM对象和C++类型的数据。
_vatiant_t和_bstr_t就是这样两种对象。
它们提供了通用的方法转换COM对象和C++类型的数据。
SQL语句遇到的问题:
select*fromuser
在SQL查询器中执行出现问题“user附近有语法错误”,而且呈现红色,最后得知user是保留字,应该用[]括起来。
select*from[user].
建议将表名,字段名都以[]括起来。
1:
SQLServer数据库配置
开启服务器
托盘显示服务器启动
2:
在StaAfx.h中添加如下代码
#import"C:
//ProgramFiles//CommonFiles//System//ado//msado15.dll"no_namespacerename("EOF","adoEOF")rename("BOF","adoBOF")
//出现msado15.dll表示导入成功
3:
在BOOLCXXXApp:
:
InitInstance()中初始化COM环境
BOOLCXXXApp:
:
InitInstance()
{
AfxEnableControlContainer();
:
:
CoInitialize(NULL);
…….
释放COM环境
:
:
CoUninitialize();
returnFALSE;
}
4:
说明
利用系统默认定义全局CXXXApp类的对象theApp可以调用类方法(函数)的能力,
故在CXXXApp类中加入连接数据库的公共方法—InitADOConn()和公共数据—
_ConnectionPtrm_pConnection。
5:
InitADOConn()的内部实现
voidCXXXApp:
:
InitADOConn()
{
//用于全局变量调用连接数据库
HRESULThr;//返回即结果变量
try
{
hr=m_pConnection.CreateInstance("ADODB.Connection");//初始化连接字符集
if(SUCCEEDED(hr))
{
//127.0.0.1本机回送地址。
C/S应用开发在运行时需要调用服务器资源,一般要指定SERVER的IP地址,
//但当该程序要在同一台机器上运行而没有其他SERVER时就可以把SREVER资源转装在本机。
hr=m_pConnection->Open("Provider=SQLOLEDB;Server=127.0.0.1;Database=LibraryManage;/
uid=sa;pwd=1986714;","","",adModeUnknown);
}
}
catch(_com_errore)
{
CStringerrorMsg;
errorMsg.Format("连接数据库失败!
/r/n错误信息:
%s",e.ErrorMessage());
:
:
MessageBox(NULL,errorMsg,"提示信息",MB_OK);
}
}
例:
6:
模块连同数据库,然后便利数据库搜寻用户输入信息的实现过程
1)在要调用公共模块的函数之前声明CBookManageApp类中的theApp全局对象
externCBookManageApptheApp;
例:
2)初始化连接数据库的连接字符串
theApp.InitADOConn();
3)将SQL语句赋予CString变量目的便利数据库查询数据库中是否有该用户名
CStringsql="SELECT*FROMTB_AdminInfoWHEREadminname='"+m_username+"'andadminpwd='"+m_pwd+"'";
4)m_pRecordset.CreateInstance(__uuidof(Recordset));//创建记录集指针对象实例
5)//打开记录集,便利数据库查询数据库中是否有该用户名
m_pRecordset->Open((_variant_t)sql,theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
//theApp.m_pConnection.GetInterfacePtr()也为引用的全局对象
6)if(m_pRecordset->adoEOF){}//如果m_pRecordset->adoEOF即便利到数据库记录的末尾
//因为之前已经用SQL语句遍历数据库,所以只用判断记录集指针是否指到数据尾部即可
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VS 连接 VC 方法 ADO