在DAO中,如何将COleVariant转变成CString ??

解决方案 »

  1.   

    COleVariant v3 = "字符串";
    CString str =(BSTR)v3.pbstrVal;
      

  2.   

    ‘VC数据库编程’中,关于DAO编程一节中://
    编写“物品管理>查看”菜单命令的响应函数OnStuffView()。
    OnStuffView()函数从“物品”表里读取物品数据,将这些数据显示在视图里。函数的代码如下:
    void CDAODemoView::OnStuffView() 
    {
      // 设置当前操作的数据库表名称
    m_strTableName = _T("物品");
    // 监测DAO数据库对象的有效性,并在记录集对象打开时关闭该记录集
    if(!m_pDatabase->IsOpen()) return;
    if(!m_pRecordset) return;
    if(m_pRecordset->IsOpen()) m_pRecordset->Close();
    // 清除所有视图上的显示
    CListCtrl& ctlList = (CListCtrl&)GetListCtrl();
    EraseList();
    // 取表的结构信息
    CDaoFieldInfo fieldInfo;
    int nFields;
    CDaoTableDef td(m_pDatabase);
    try
    {
      td.Open(m_strTableName);
    nFields = td.GetFieldCount();
    for (int j=0; j < nFields; j++){
    td.GetFieldInfo(j,fieldInfo);
    int nWidth = ctlList.GetStringWidth(fieldInfo.m_strName) + 15;
    ctlList.InsertColumn(j,fieldInfo.m_strName, 
      LVCFMT_LEFT, nWidth);
    }
    }
    catch (CDaoException* e)
    {
    e->ReportError(); 
    e->Delete();
    return;
    }
    td.Close();
      // 取表的数据
    int nItem = 0;
    try
    {
    CString strSelect(_T("Select * From ["));
    strSelect += m_strTableName;
    strSelect += _T("]");
    m_pRecordset->Open(dbOpenDynaset,strSelect);
    while (!m_pRecordset->IsEOF()) {
    COleVariant var;
    var = m_pRecordset->GetFieldValue(0);
    ctlList.InsertItem(nItem,CCrack::strVARIANT(var));
    for (int i=0; i < nFields; i++){
    var = m_pRecordset->GetFieldValue(i);
    ctlList.SetItemText( nItem,i,CCrack::strVARIANT(var));
    }
    nItem++;
    m_pRecordset->MoveNext();
    }
    }
    catch (CDaoException* e)
    {
    e->ReportError(); 
    e->Delete();
    return;
    }
      // 显示信息
    CString strRecCount;
    strRecCount.Format(_T("显示了%d条记录。"),nItem);
    UpdateWindow();
    if (nItem>=MAXRECORDS) MessageBox(strRecCount);
    ((CFrameWnd *) AfxGetMainWnd())->SetMessageText(strRecCount);
    }
    1,其中var = m_pRecordset->GetFieldValue(0);设为‘0’程序异常,‘1’则OK;同样在   for (int i=0; i < nFields; i++)循环中,i也不可为‘0’。这是为什么呢?
    2,EraseList();CCrack::strVARIANT(var),这二个是笔误吗,VC中没有这样的函数呀。
    3,使用了二楼的转换后,出来的是乱码。
    请高手给指点一下,并交个朋友,非常感谢!!!!!!!!!!!!