代码如下:把数据库的数据显示到列表框里
     
     
     m_ListCrtl.DeleteAllItems(); //删除所有的子项
try
{
m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)sql, NULL, adCmdText);
int i = 0;
while(!m_pRecordset->adoEOF)//记录没有到末尾
{
m_ListCrtl.InsertItem(i, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)0))));    
        //当表里有一条记录时可得到(char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)0)))为1 m_ListCrtl.SetItemText(i, 1, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)1))));          //这个地方有错误   明明表里有数据可到这里说找不到
m_ListCrtl.SetItemText(i, 2, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)2))));

i++;
m_pRecordset->MoveNext();//移动到下一条记录

}       错误提示是:在对应所需名称或序数的集合中,为找到项目。   
      我测试改为:vr=m_pRecordset->GetCollect(_variant_t((long)0)));
if(vr.vt != VT_NULL)  
            strName = (LPCSTR)_bstr_t(vr); 
            MessageBox(strName);
i++;
m_pRecordset->MoveNext();//移动到下一条记录
    数据表里有一条记录时MessageBox显示为:1
      然后我把_variant_t((long)0改成_variant_t((long)1就说记录里么有。。      不是应该把第二列的数据取出来么。
   哪里错了,那个高手知道请帮助我,谢谢啊!

解决方案 »

  1.   

    很明显你得先从数据库中取出数据时需要对原始原变体型数据做判断是否为空(VT_NULL),不为空的情况下才能做转换。另外在GetCollect时不用序号改用字段名试试。还有一个问题是插入代码需要改一下:
    int nItem = m_ListCrtl.InsertItem(i, (char*)_......
    m_ListCrtl.SetItemText(nItem, 1, .......
      

  2.   

    m_ListCrtl.SetItemText(i, 1, (char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)1)))); //这个地方有错误 明明表里有数据可到这里说找不到这里抛异常了吧?进到catch语句中了吧??
    如果是 你看看第二列的字段类型是什么?(char*)不建议这样强转,最好在数据库中获取字段用vt.ChangeType(VT_BSTR)