如何遍历一个表获得所有字段的名称及其数据类型??(ACCESS数据库)

解决方案 »

  1.   

    知道表名:   
      #include   <conio.h>   
      #define   PAUSE   printf("\npress   any   key   to   exit");   getch();   
        
      #define   _WIN32_DCOM   
        
      #pragma   warning(push)   
      #pragma   warning(disable:4146)   
      #import   "e:\program   files\common   files\system\ado\MSADO15.DLL"   no_namespace   rename("EOF",   "EndOfFile")   
      #pragma   warning(pop)   
        
      int   main(int   argc,   char*   argv[])   
      {   
      _ConnectionPtr   m_pConn;   
      _RecordsetPtr   m_pRs;   
      CoInitializeEx(NULL,   COINIT_MULTITHREADED);   
      _bstr_t   bstrConnStr   =   "Provider=Microsoft.Jet.OLEDB.4.0;"   
      "Data   Source=F:\\lylong\\db1.mdb;Persist   Security   Info=False";   
      try{   
      m_pConn.CreateInstance(   __uuidof(Connection)   );   
      m_pRs.CreateInstance(   __uuidof(Recordset)   );   
      m_pConn->Open(   bstrConnStr,   "",   "",   adConnectUnspecified   );   
      m_pRs->Open(   "table1",     
      m_pConn.GetInterfacePtr(),   adOpenForwardOnly,   adLockOptimistic,   adCmdTable);   
        
      long   lColumn   =   m_pRs->Fields->Count;   
      printf("%-12s%-10s%-10s\n",   "字段名",   "长度",   "类型");   
      for(   long   i=0;   i<lColumn;   i++   )   
      {   
      printf("%-12s%-10d%-10d\n",   (char*)m_pRs->Fields->Item[i]->Name,     
      m_pRs->Fields->Item[i]->DefinedSize,   
      m_pRs->Fields->Item[i]->Type);   
      }   
        
      m_pRs->Close();   
      m_pConn->Close();   
      }catch(   _com_error   e   )   
      {   
      printf(   "\n%s   Error:   %ld\r\n"   
      "%s\r\n"   
      "%s\r\n",   
      (char*)e.Source(),   
      e.Error(),   
      (char*)e.Description(),   
      (char*)e.ErrorMessage()   );   
      m_pRs->Close();   
      m_pConn->Close();   
      }   
      CoUninitialize();   
      PAUSE;   
      return   0;   
      }   
      --------------------------------   
      _RecordsetPtr   m_pRs;   
      _variant_t   vFieldName;   
      for(int   I=0;   I<m_pRecordset->Fields->Count;   I++)   
      {   
          vFieldName=m_pRecordset->Fields->GetItem((long)intI)->Name;   
          CString   str=vFieldName.bstrVal;   
      }   
      -------------------------------------   
      int   iCols=m_pRecordset->Fields->GetCount();   
      _variant_t   vardata;   
      vardata.vt=VT_I4;   
      vardata.iVal=iCols;   
      for(vardata.iVal=0;vardata.iVal<iCols;vardata.iVal++)   
      {   
      _bstr_t   bstrCols=m_pRecordset->Fields->GetItem(vardata.iVal)->GetName();   
      MessageBox(bstrCols);   
      }   
      -------------------------   
      _bstr_t       mStrSQL;   
      CString       strColName;   
      BSTR             bstrColName;   
      long             ColCount,i;     
      Field   *       field   =   NULL;   
      HRESULT       hr;   
      Fields   *     fields   =   NULL;   
      LPCTSTR       nameField;   
        
      //打开记录集,得到字段名,并将字段名信息添加到ListBox中   
        
      mStrSQL   =   "SELECT   *   FROM   Images";   
        
      m_pRecordset->Open(mStrSQL,                                 
      m_pConnection.GetInterfacePtr(),     
      adOpenDynamic,   
      adLockOptimistic,   
      adCmdText);   
        
      hr   =   m_pRecordset->get_Fields   (&fields); //得到记录集的字段集和   
          
      if(SUCCEEDED(hr))     
              fields->get_Count(&ColCount);   
        
      //得到记录集的字段集合中的字段的总个数   
        
      for(i=0;i<ColCount;i++)   
      {   
      fields->Item[i]->get_Name(&bstrColName); //得到记录集//中的字段名   
      strColName=bstrColName;   
      nameField   =   strColName;   
      m_FieldsList.AddString(nameField);   
      }   
        
      if(SUCCEEDED(hr))   
      fields->Release();//释放指针