我打算动态的读取某个数据库,就以Access的为例吧,然后把这个库中的表列在一个下拉列表框中,点击哪个就显示哪个表。用Ado和DataGrid控件来做,请大家帮忙:这怎么实现?主要是表名的读取和在列表框中的显示,而表的内容在DataGrid中的显示问题已经解决了。
分不是问题!!!先谢了!!!

解决方案 »

  1.   

    用CDaoDatabase::GetTableDefIfno()试试吧!不过我可用过!
      

  2.   

    多谢多谢!!!
    终于有人支声了,但现在的项目中已经确定用ado了,请问哪位知道用ado如何搞定它?
      

  3.   

    ...... //前略_RecordsetPtr rs = m_pCnn->OpenSchema(adSchemaTables);
    CString sType, sName;
    HRESULT hr = S_OK;
    while(!rs->adoEOF)
    {
       sType = CrackStrVariant(rs->GetCollect(L"TABLE_TYPE"));
       if (!sType.CompareNoCase(_T("TABLE")))
       {
          sName = CrackStrVariant(rs->GetCollect(L"TABLE_NAME"));
          // sName就是你要的表名啦
       }
       hr = rs->MoveNext();
       if(FAILED(hr))
         _com_issue_error(hr);
    }CString CrackStrVariant(const COleVariant& var)
    {
        CString strRet;
        strRet = _T("<Unknown>");
        switch(var.vt)
    {
    case VT_EMPTY:
    case VT_NULL:
    strRet = _T("NULL");
    break;
    case VT_I2:
    strRet.Format(_T("%hd"), V_I2(&var));
    break;
    case VT_I4:
    strRet.Format(_T("%d"),V_I4(&var));
    break;
    case VT_R4:
    strRet.Format(_T("%e"), (double)V_R4(&var));
    break;
    case VT_R8:
    strRet.Format(_T("%e"), V_R8(&var));
    break;
    case VT_CY:
    strRet = COleCurrency(var).Format();
    break;
    case VT_DATE:
    strRet = COleDateTime(var).Format(_T("%c"));
    break;
    case VT_BSTR:
    strRet = V_BSTR(&var);
    break;
    case VT_DISPATCH:
    strRet = _T("VT_DISPATCH");
    break;
    case VT_ERROR:
    strRet = _T("VT_ERROR");
    break;
    case VT_BOOL:
    return ( V_BOOL(&var) ? _T("TRUE") : _T("FALSE"));
    case VT_VARIANT:
    strRet = _T("VT_VARIANT");
    break;
    case VT_UNKNOWN:
    strRet = _T("VT_UNKNOWN");
    break;
    case VT_I1:
    strRet = _T("VT_I1");
    break;
    case VT_UI1:
    strRet.Format(_T("0x%02hX"), (unsigned short)V_UI1(&var));
    break;
    case VT_UI2:
    strRet = _T("VT_UI2");
    break;
    case VT_UI4:
    strRet = _T("VT_UI4");
    break;
    case VT_I8:
    strRet = _T("VT_I8");
    break;
    case VT_UI8:
    strRet = _T("VT_UI8");
    break;
    case VT_INT:
    strRet = _T("VT_INT");
    break;
    case VT_UINT:
    strRet = _T("VT_UINT");
    break;
    case VT_VOID:
    strRet = _T("VT_VOID");
    break;
    case VT_HRESULT:
    strRet = _T("VT_HRESULT");
    break;
    case VT_PTR:
    strRet = _T("VT_PTR");
    break;
    case VT_SAFEARRAY:
    strRet = _T("VT_SAFEARRAY");
    break;
    case VT_CARRAY:
    strRet = _T("VT_CARRAY");
    break;
    case VT_USERDEFINED:
    strRet = _T("VT_USERDEFINED");
    break;
    case VT_LPSTR:
    strRet = _T("VT_LPSTR");
    break;
    case VT_LPWSTR:
    strRet = _T("VT_LPWSTR");
    break;
    case VT_FILETIME:
    strRet = _T("VT_FILETIME");
    break;
    case VT_BLOB:
    strRet = _T("VT_BLOB");
    break;
    case VT_STREAM:
    strRet = _T("VT_STREAM");
    break;
    case VT_STORAGE:
    strRet = _T("VT_STORAGE");
    break;
    case VT_STREAMED_OBJECT:
    strRet = _T("VT_STREAMED_OBJECT");
    break;
    case VT_STORED_OBJECT:
    strRet = _T("VT_STORED_OBJECT");
    break;
    case VT_BLOB_OBJECT:
    strRet = _T("VT_BLOB_OBJECT");
    break;
    case VT_CF:
    strRet = _T("VT_CF");
    break;
    case VT_CLSID:
    strRet = _T("VT_CLSID");
    break;
        }
        
    WORD vt = var.vt;
        if(vt & VT_ARRAY)
    {
            vt = vt & ~VT_ARRAY;
            strRet = _T("Array of ");
        }
        
    if(vt & VT_BYREF)
    {
            vt = vt & ~VT_BYREF;
            strRet += _T("Pointer to ");
        }
        
    if(vt != var.vt)
    {
            switch(vt)
    {
    case VT_EMPTY:
    strRet += _T("VT_EMPTY");
    break;
    case VT_NULL:
    strRet += _T("VT_NULL");
    break;
    case VT_I2:
    strRet += _T("VT_I2");
    break;
    case VT_I4:
    strRet += _T("VT_I4");
    break;
    case VT_R4:
    strRet += _T("VT_R4");
    break;
    case VT_R8:
    strRet += _T("VT_R8");
    break;
    case VT_CY:
    strRet += _T("VT_CY");
    break;
    case VT_DATE:
    strRet += _T("VT_DATE");
    break;
    case VT_BSTR:
    strRet += _T("VT_BSTR");
    break;
    case VT_DISPATCH:
    strRet += _T("VT_DISPATCH");
    break;
    case VT_ERROR:
    strRet += _T("VT_ERROR");
    break;
    case VT_BOOL:
    strRet += _T("VT_BOOL");
    break;
    case VT_VARIANT:
    strRet += _T("VT_VARIANT");
    break;
    case VT_UNKNOWN:
    strRet += _T("VT_UNKNOWN");
    break;
    case VT_I1:
    strRet += _T("VT_I1");
    break;
    case VT_UI1:
    strRet += _T("VT_UI1");
    break;
    case VT_UI2:
    strRet += _T("VT_UI2");
    break;
    case VT_UI4:
    strRet += _T("VT_UI4");
    break;
    case VT_I8:
    strRet += _T("VT_I8");
    break;
    case VT_UI8:
    strRet += _T("VT_UI8");
    break;
    case VT_INT:
    strRet += _T("VT_INT");
    break;
    case VT_UINT:
    strRet += _T("VT_UINT");
    break;
    case VT_VOID:
    strRet += _T("VT_VOID");
    break;
    case VT_HRESULT:
    strRet += _T("VT_HRESULT");
    break;
    case VT_PTR:
    strRet += _T("VT_PTR");
    break;
    case VT_SAFEARRAY:
    strRet += _T("VT_SAFEARRAY");
    break;
    case VT_CARRAY:
    strRet += _T("VT_CARRAY");
    break;
    case VT_USERDEFINED:
    strRet += _T("VT_USERDEFINED");
    break;
    case VT_LPSTR:
    strRet += _T("VT_LPSTR");
    break;
    case VT_LPWSTR:
    strRet += _T("VT_LPWSTR");
    break;
    case VT_FILETIME:
    strRet += _T("VT_FILETIME");
    break;
    case VT_BLOB:
    strRet += _T("VT_BLOB");
    break;
    case VT_STREAM:
    strRet += _T("VT_STREAM");
    break;
    case VT_STORAGE:
    strRet += _T("VT_STORAGE");
    break;
    case VT_STREAMED_OBJECT:
    strRet += _T("VT_STREAMED_OBJECT");
    break;
    case VT_STORED_OBJECT:
    strRet += _T("VT_STORED_OBJECT");
    break;
    case VT_BLOB_OBJECT:
    strRet += _T("VT_BLOB_OBJECT");
    break;
    case VT_CF:
    strRet += _T("VT_CF");
    break;
    case VT_CLSID:
    strRet += _T("VT_CLSID");
    break;
            }
        }
        
    return strRet;
    }
      

  4.   

    $#&^$*&(*(*())%$#$@!!!!!!???????
    多谢!!
    但是,能不能具体解释一下您的思路?nbb01
      

  5.   

    太复杂了,还是看看这个清晰和权威的好了 ^_^   try
        {
            // Open connection.
            TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
            pConnection->Open (strCnn, "", "", adConnectUnspecified);        pRstSchema = pConnection->OpenSchema(adSchemaTables);        while(!(pRstSchema->EndOfFile))
            {
                _bstr_t table_name = pRstSchema->Fields->
                    GetItem("TABLE_NAME")->Value;            printf("Table Name: %s\n",(LPCSTR) table_name);            _bstr_t table_type = pRstSchema->Fields->
                    GetItem("TABLE_TYPE")->Value;            printf("Table type: %s\n\n",(LPCSTR) table_type);            pRstSchema->MoveNext();        }
            // Clean up objects before exit.
            pRstSchema->Close();
            pConnection->Close();
        }