使用 m_pRecordset->GetRecordCount();获取记录数不准确的问题总结

strSql.Format("SELECT * FROM TestData WHERE ProductNum='%s'",productNum);
hbr=m_pRecordset->Open(_bstr_t(strSql), m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
RecordCount = m_pRecordset->GetRecordCount();

在写一个新工程的时候,需要使用到access2000数据库,在保存数据之前,要先获取这个数据库中有没有该ProductNum的记录,如果有就替换它,如果没有就新建一条记录,可是,在使用RecordCount = m_pRecordset->GetRecordCount();获取记录的时候,无论这条记录在数据库中存在不存在,返回的RecordCount的值始终都是一个很大的值。如下图所示:



从网上查找有关的资料,有的说把指针改成adOpenStatic,实验了一把,还是不行。也有的说在获取记录之前先m_pRecordset->MoveLast();一下,实验结果是,如果这条记录存在,就会返回正确的值,如果这条记录不存在的话,执行这条语句就会报错。

还有下面这一种说法:

  为了使用RecordCount属性,我们需要使用设置好游标(静态/客户):
  在m_pSet->Open()前加上:
  m_pSet->CursorType = adOpenStatic;
  m_pSet->CursorLocation = adUseClient;

我实验了一下,结果还是不对。无奈,我非常的无奈,这到底是哪里错了呢。这个问题浪费了我昨天一天的时间。今天早上来公司的路上,突然想起来是不是msado15.dll的问题,果不其然,我替换了一下msado15.dll之后,问题就解决了。

在此说明一下,我的电脑是win7系统的,我从别人的xp系统的电脑上把C:\Program Files\Common Files\System\ado该路径下的msado15.dll拷贝到我的win7电脑上,放在另一个路径下C:\Program Files\Common Files,并且在StdAfx.h中这样引入

#import "C:\Program Files\common files\msado15.dll" no_namespace rename("EOF","adoEOF")

ado数据库。结果一验证,GetRecordCount()函数获取的就是正确的记录结果了。

根据我的分析,是不是access2000的数据库对于win7系统中的msado15.dll来说太旧了,也就是说win7系统的msado15.dll对access2000支持不是很好。

下面附上链接数据库的代码:

hbr=m_pConnection.CreateInstance(__uuidof(Connection));
if(!SUCCEEDED(hbr)) return FALSE;
m_pConnection->CursorLocation = adUseClient;
ConnectString.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s",lpszFile);
hbr=m_pConnection->Open((_bstr_t)ConnectString,"","",adModeUnknown);
if(!SUCCEEDED(hbr)) return FALSE;
hbr=m_pCommand.CreateInstance(__uuidof(Command));
if(!SUCCEEDED(hbr)) return FALSE;
m_pCommand->ActiveConnection = m_pConnection;
hbr=m_pRecordset.CreateInstance(__uuidof(Recordset));
if(!SUCCEEDED(hbr)) return FALSE;

猜你喜欢

转载自blog.csdn.net/lianxue1986/article/details/38579895