代码:
try
{
HRESULT hr; hr = m_ptrConnect.CreateInstance(_uuidof(MatAdo::Connection));
if( FAILED(hr) )
{
throw(_com_error(hr, NULL));
} hr = m_prtRecordset.CreateInstance(_uuidof(MatAdo::Recordset));
if( FAILED(hr) )
{
throw(_com_error(hr, NULL));
} _bstr_t bstrConnectText(m_szDBConnText);
hr = m_ptrConnect->Open(bstrConnectText, _T(""), _T(""), -1);
if( FAILED(hr) )
{
throw(_com_error(hr, NULL));
} BSTR bstrSQL(m_szDBFormName); hr = m_prtRecordset->Open(bstrSQL, m_ptrConnect.GetInterfacePtr(),
MatAdo::adOpenDynamic, MatAdo::adLockOptimistic, MatAdo::adCmdTable);
if( FAILED(hr) )
{
throw(_com_error(hr, NULL));
} MatAdo::FieldsPtr ptrFields = NULL;
hr = m_prtRecordset->get_Fields(&ptrFields);
if( FAILED(hr) )
{
throw(_com_error(hr, NULL));
} long iMaxCol = 0;
hr = ptrFields->get_Count(&iMaxCol);
if( FAILED(hr) )
{
throw(_com_error(hr, NULL));
} for(int iCol=0; iCol < iMaxCol; iCol++)
{
BSTR bstrColName;
MatAdo::FieldPtr ptrField; if( iCol==0 )
{
m_rptMainList.DeleteColumn(0);
} // 发生异常, "Unknown error 0x800A0CC1"
// 看了ADO《Microsoft ADO程序员参考》上面写的是可以这样
// 访问 Item 属性的, 这里为什么会出错? 在VC6下是可以, 为什
// 在VC2005里面就会出错, VC2005只能用ADO.NET ?
ptrField = ptrFields->Item[iCol]; //->get_Name(&bstrColName); //m_rptMainList.InsertColumn(iCol,
// (LPCTSTR)(ptrFields->GetItem((_variant_t)1))->GetName(),
// LVCFMT_LEFT, 50);
}
}
catch(_com_error& e)
{
MessageBox(e.ErrorMessage(), _T("打开数据库错误"), MB_OK | MB_ICONERROR);
}
try
{
HRESULT hr; hr = m_ptrConnect.CreateInstance(_uuidof(MatAdo::Connection));
if( FAILED(hr) )
{
throw(_com_error(hr, NULL));
} hr = m_prtRecordset.CreateInstance(_uuidof(MatAdo::Recordset));
if( FAILED(hr) )
{
throw(_com_error(hr, NULL));
} _bstr_t bstrConnectText(m_szDBConnText);
hr = m_ptrConnect->Open(bstrConnectText, _T(""), _T(""), -1);
if( FAILED(hr) )
{
throw(_com_error(hr, NULL));
} BSTR bstrSQL(m_szDBFormName); hr = m_prtRecordset->Open(bstrSQL, m_ptrConnect.GetInterfacePtr(),
MatAdo::adOpenDynamic, MatAdo::adLockOptimistic, MatAdo::adCmdTable);
if( FAILED(hr) )
{
throw(_com_error(hr, NULL));
} MatAdo::FieldsPtr ptrFields = NULL;
hr = m_prtRecordset->get_Fields(&ptrFields);
if( FAILED(hr) )
{
throw(_com_error(hr, NULL));
} long iMaxCol = 0;
hr = ptrFields->get_Count(&iMaxCol);
if( FAILED(hr) )
{
throw(_com_error(hr, NULL));
} for(int iCol=0; iCol < iMaxCol; iCol++)
{
BSTR bstrColName;
MatAdo::FieldPtr ptrField; if( iCol==0 )
{
m_rptMainList.DeleteColumn(0);
} // 发生异常, "Unknown error 0x800A0CC1"
// 看了ADO《Microsoft ADO程序员参考》上面写的是可以这样
// 访问 Item 属性的, 这里为什么会出错? 在VC6下是可以, 为什
// 在VC2005里面就会出错, VC2005只能用ADO.NET ?
ptrField = ptrFields->Item[iCol]; //->get_Name(&bstrColName); //m_rptMainList.InsertColumn(iCol,
// (LPCTSTR)(ptrFields->GetItem((_variant_t)1))->GetName(),
// LVCFMT_LEFT, 50);
}
}
catch(_com_error& e)
{
MessageBox(e.ErrorMessage(), _T("打开数据库错误"), MB_OK | MB_ICONERROR);
}
m_rptMainList一直都没有使用呀,是 ptrField = ptrFields->Item[iCol]; 这句话出错了!
To: shakaqrj
刚试了一下,还是不行,一样出现了异常,我就郁闷了!
ptrFields->Item[(long)iCol]
不要用ptrField接收,试试看
hr = m_prtRecordset->get_Fields(&ptrFields);
-----------------------------------------------
可能是get_Fields有问题吧参考如下代码:_RecordsetPtr m_pRecordset;FieldPtr pField = m_pRecordset->Fields->GetItem(lpFieldName);_variant_t vtIndex;
vtIndex.vt = VT_I2;
vtIndex.iVal = nIndex;FieldPtr pField = m_pRecordset->Fields->GetItem(vtIndex);