欢迎进入c/c++编程社区论坛,与300万技术人员互动交流 >>进入 最近在用ado访问access数据库的时候出现了一个奇怪的错误,觉得有必要记录下来,和大家分享一下。 环境 win7 x86系统; vs2012编译器; office2010; access2000~access2003连接串建立数据库连接
欢迎进入c/c++编程社区论坛,与300万技术人员互动交流 >>进入
最近在用ado访问access数据库的时候出现了一个奇怪的错误,觉得有必要记录下来,和大家分享一下。
环境
win7 x86系统;
vs2012编译器;
office2010;
access2000~access2003连接串建立数据库连接。
关键数据库操作代码
bool caccessdatabase::query(const cstring strsqlstring, uint nfieldnumber, vector >& vecvecvariant)
{
_variant_t variant;
vector vecvariant;
entercriticaldiv(&m_cs);
_recordsetptr precordset = null;
hresult hr = s_false;
try
{
hr = precordset.createinstance(_t(adodb.recordset));
if (succeeded(hr))
{
hr = precordset->open(strsqlstring.allocsysstring(), m_pconnection.getinterfaceptr(), adopendynamic, adlockoptimistic, adcmdtext);
if (succeeded(hr))
{
if (!precordset->adoeof)
{
hr = precordset->movefirst();
if (succeeded(hr))
{
while (!(precordset->adoeof))
{
vecvariant.clear();
for (uint i = 0; i
{
zeromemory(&variant, sizeof(variant));
variant = precordset->getcollect(_variant_t((long)i));
vecvariant.push_back(variant);
}
vecvecvariant.push_back(vecvariant);
hr = precordset->movenext();
}
}
else
{
m_plogfile->writelog(getlasterror(), _t(移动记录集指针到首部发生错误));
if (precordset->getstate() != adstateclosed)
{
hr = precordset->close();
if (failed(hr))
{
m_plogfile->writelog(getlasterror(), _t(关闭记录集失败));
}
else
{
m_plogfile->writelog(getlasterror(), _t(记录集已关闭));
}
}
if (precordset != null)
{
precordset.release();
precordset = null;
}
leavecriticaldiv(&m_cs);
return false;
}
}
else
{
m_plogfile->writelog(getlasterror(), _t(查询的记录集为空));
}
}
else
{
m_plogfile->writelog(getlasterror(), _t(打开记录集失败));
if (precordset != null)
{
precordset.release();
precordset = null;
}
leavecriticaldiv(&m_cs);
return false;
}
}
else
{
m_plogfile->writelog(getlasterror(), _t(初始化记录集失败));
precordset = null;
leavecriticaldiv(&m_cs);
return false;
}
}
[1] [2]