请问VC如何使用ADO msdn中有一个adosamp程序,就是用ado的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有一本书,叫用VC进行数据库编程,介绍了VC有关的数据库操作,包括ODBC,ADO,DAO,OLE DB,可以参考一下。VC知识库中也不相关的介绍. _ConnectionPtr/_RecordsetPtr/_CommandPtr之类的类就是ADO的 使用VC++中的import指令,导入ado 的动态连接库msado15.dll,编译后,系统会自动产生ado的对应的C++类,很容易,记住了!步骤: 1. 修改stdafx.h文件. #endif // _AFX_NO_AFXCMN_SUPPORT //此行系统产生, #include <comdef.h> //使用com类,会使数据库操作非常容易,一定要熟悉com! #import "C:\Program Files\Common Files\SYSTEM\ADO\msado15.dll" rename ("EOF","ADOEOF") using namespace ADODB; 2.连接数据源 //import指令的结果之一产生一些智能指针类,省去引用计数之苦. HRESULT hr; _ConnectionPtr pConnection; _RecordsetPtr pRecordset; hr=pConnection.CreateInstance(__uuidof(Connection)); if(SUCCEEDED(hr)) { hr=pConnection->Open(_bstr_t(L"Provider=Microsoft.Jet.OLEDB.3.51;Data Source=C:\\毕业设计\\Superet2000.mdb;"), _bstr_t(L""),_bstr_t(L""),adModeUnknown); if(FAILED(hr)) { AfxMessageBox("系统发生错误.",MB_OK); pConnection->Close(); } else { _RecordsetPtr pRecordset; _variant_t vRecsAffected(0L); pRecordset=pConnection->Execute(strQuery,&vRecsAffected,adOptionUnspecified); if(pRecordset->GetADOEOF()) { pRecordset->Close(); pConnection->Close(); } else { pRecordset->Close(); pConnection->Close(); } } } 3.进行数据库操作--增加,修改,删除,...... 以本人的毕业设计中一个程序片断为例:bool CSuperetView::AddNewAccount(){ //增加新纪录 _RecordsetPtr pRecordset; HRESULT hr; _bstr_t Query("select * from AccountBook where Date is NULL"); _variant_t vNull; vNull.vt=VT_ERROR; vNull.scode=DISP_E_PARAMNOTFOUND; hr=pRecordset.CreateInstance(__uuidof(Recordset)); if(SUCCEEDED(hr)) { pRecordset->PutRefActiveConnection(m_pConnection); hr=pRecordset->Open(_variant_t(Query),vNull,adOpenForwardOnly,adLockOptimistic,adCmdText); if(SUCCEEDED(hr)) { COleSafeArray vaFieldList; vaFieldList.CreateOneDim(VT_VARIANT,5); long lArrayIndex[1]; lArrayIndex[0]=0; vaFieldList.PutElement(lArrayIndex,&(_variant_t("Date"))); lArrayIndex[0]=1; vaFieldList.PutElement(lArrayIndex,&(_variant_t("LastBalance"))); lArrayIndex[0]=2; vaFieldList.PutElement(lArrayIndex,&(_variant_t("Balance"))); lArrayIndex[0]=3; vaFieldList.PutElement(lArrayIndex,&(_variant_t("TurnInFund"))); lArrayIndex[0]=4; vaFieldList.PutElement(lArrayIndex,&(_variant_t("TotalFund"))); COleSafeArray vaValueList; vaValueList.CreateOneDim(VT_VARIANT,5); lArrayIndex[0]=0; vaValueList.PutElement(lArrayIndex,&(vDate)); lArrayIndex[0]=1; vaValueList.PutElement(lArrayIndex,&(vLastBalance)); lArrayIndex[0]=2; vaValueList.PutElement(lArrayIndex,&(vBalance)); lArrayIndex[0]=3; vaValueList.PutElement(lArrayIndex,&(vTurnInFund)); lArrayIndex[0]=4; vaValueList.PutElement(lArrayIndex,&(vTotalFund)); pRecordset->AddNew(&vaFieldList,&vaValueList); pRecordset->Close(); return true; } } return false;} 其它操作,自己可要"摸索"了,多看import指令产生的文件.有了心得,可别旺了通知我一声,祝你好运! recordnum=m_pRecordset->Open(SqlStr,m_pConnection.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);//用 recordnum=m_pRecordset->Open(SqlStr,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);// 也出错 recordnum=m_pRecordset->adoEOF; //执行到此出错,为何。跳到catch(...)------------------------------------------好像open并不能返回记录总数吧。我用的是m_pRecordset->GetRecordCount(),还有就是m_pRecordset->adoEOF也不是返回记录总数,只是返回一个BOOL型数据,判断是否到了表底。所以先open,然后GetRecordCount(要用adOpenKeyset,否则始终返回-1) Pivot Table透视表谁用过 CreateWaitableTimer 、CreateTimerQueueTimer、线程池:四个基础问题 非模态对话框如何调用View类中的函数 有一段HTML文本如何载入HTMLDocument2进行解析? 想改ping的原地址 如何在静态文本框上显示位图? 请问更新某字段值的SQL语句!!! CFont的问题 菜问:如何在dll中得到调用窗口句柄? 这是什么错误??? VC++6.0连接的问题?? 如何发送一个消息把其中CString的内容发出去.
OLE DB,可以参考一下。VC知识库中也不相关的介绍.
步骤:
1. 修改stdafx.h文件.
#endif // _AFX_NO_AFXCMN_SUPPORT //此行系统产生,
#include <comdef.h> //使用com类,会使数据库操作非常容易,一定要熟悉com!
#import "C:\Program Files\Common Files\SYSTEM\ADO\msado15.dll" rename ("EOF","ADOEOF")
using namespace ADODB;
2.连接数据源
//import指令的结果之一产生一些智能指针类,省去引用计数之苦.
HRESULT hr;
_ConnectionPtr pConnection;
_RecordsetPtr pRecordset;
hr=pConnection.CreateInstance(__uuidof(Connection));
if(SUCCEEDED(hr))
{
hr=pConnection->Open(_bstr_t(L"Provider=Microsoft.Jet.OLEDB.3.51;Data Source=C:\\毕业设计\\Superet2000.mdb;"),
_bstr_t(L""),_bstr_t(L""),adModeUnknown);
if(FAILED(hr))
{
AfxMessageBox("系统发生错误.",MB_OK);
pConnection->Close();
}
else
{
_RecordsetPtr pRecordset;
_variant_t vRecsAffected(0L);
pRecordset=pConnection->Execute(strQuery,&vRecsAffected,adOptionUnspecified);
if(pRecordset->GetADOEOF())
{
pRecordset->Close();
pConnection->Close(); }
else
{
pRecordset->Close();
pConnection->Close();
} } }
3.进行数据库操作--增加,修改,删除,......
以本人的毕业设计中一个程序片断为例:
bool CSuperetView::AddNewAccount()
{
//增加新纪录
_RecordsetPtr pRecordset;
HRESULT hr;
_bstr_t Query("select * from AccountBook where Date is NULL");
_variant_t vNull;
vNull.vt=VT_ERROR;
vNull.scode=DISP_E_PARAMNOTFOUND;
hr=pRecordset.CreateInstance(__uuidof(Recordset));
if(SUCCEEDED(hr))
{
pRecordset->PutRefActiveConnection(m_pConnection);
hr=pRecordset->Open(_variant_t(Query),vNull,adOpenForwardOnly,adLockOptimistic,adCmdText);
if(SUCCEEDED(hr))
{
COleSafeArray vaFieldList;
vaFieldList.CreateOneDim(VT_VARIANT,5);
long lArrayIndex[1];
lArrayIndex[0]=0;
vaFieldList.PutElement(lArrayIndex,&(_variant_t("Date")));
lArrayIndex[0]=1;
vaFieldList.PutElement(lArrayIndex,&(_variant_t("LastBalance")));
lArrayIndex[0]=2;
vaFieldList.PutElement(lArrayIndex,&(_variant_t("Balance")));
lArrayIndex[0]=3;
vaFieldList.PutElement(lArrayIndex,&(_variant_t("TurnInFund")));
lArrayIndex[0]=4;
vaFieldList.PutElement(lArrayIndex,&(_variant_t("TotalFund"))); COleSafeArray vaValueList;
vaValueList.CreateOneDim(VT_VARIANT,5);
lArrayIndex[0]=0;
vaValueList.PutElement(lArrayIndex,&(vDate));
lArrayIndex[0]=1;
vaValueList.PutElement(lArrayIndex,&(vLastBalance));
lArrayIndex[0]=2;
vaValueList.PutElement(lArrayIndex,&(vBalance));
lArrayIndex[0]=3;
vaValueList.PutElement(lArrayIndex,&(vTurnInFund));
lArrayIndex[0]=4;
vaValueList.PutElement(lArrayIndex,&(vTotalFund)); pRecordset->AddNew(&vaFieldList,&vaValueList);
pRecordset->Close();
return true;
}
}
return false;
}
其它操作,自己可要"摸索"了,多看import指令产生的文件.有了心得,可别旺了通知我一声,祝你好运!
//用 recordnum=m_pRecordset->Open(SqlStr,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
// 也出错
recordnum=m_pRecordset->adoEOF;
//执行到此出错,为何。跳到catch(...)
------------------------------------------
好像open并不能返回记录总数吧。我用的是m_pRecordset->GetRecordCount(),还有就是m_pRecordset->adoEOF也不是返回记录总数,只是返回一个BOOL型数据,判断是否到了表底。
所以先open,然后GetRecordCount(要用adOpenKeyset,否则始终返回-1)