请问
1.用ADO怎样创建一个access数据库文件?(test.mdb)
2.假设test.mdb中有三个表,user1,user2,user3.怎样把user1和user2中不同的用户找出,写入user3中去呢?(用ADO)
谢谢?

解决方案 »

  1.   

    1.用ADOXBOOL CPassportDoc::CreateDB(LPCTSTR lpszFile)
    {
     if(::PathFileExists(lpszFile)){
      CString strTemp;
      strTemp.Format(IDS_TARGET_EXISTS,lpszFile);
      AfxMessageBox(lpszFile);
      return FALSE;
     }
     ADODB::_ConnectionPtr tempConnn;
     ADOX::_CatalogPtr pCatalog = NULL;
     ADOX::_TablePtr  pTable = NULL;
        ADOX::_IndexPtr pIndexNew  = NULL;
        ADOX::_IndexPtr pIndex  = NULL;
     CString strConnect;
     CString strDBPath=lpszFile;
     strConnect.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"),strDBPath);
     COleVariant Connect(strConnect); 
     try{
      pCatalog.CreateInstance(_T("ADOX.Catalog"));
      pCatalog->Create((LPCTSTR)strConnect);//创建数据库
      tempConnn.CreateInstance(_T("ADODB.Connection"));
      tempConnn->PutCommandTimeout(30);
      tempConnn->PutConnectionTimeout(30);
      tempConnn->put_CursorLocation(ADODB::adUseClient);
      tempConnn->Open(_bstr_t(strConnect),_bstr_t(),_bstr_t(),ADODB::adConnectUnspecified);
      pCatalog->PutActiveConnection(_variant_t((IDispatch *) tempConnn));
      pTable.CreateInstance(_T("ADOX.Table"));
      pTable->ParentCatalog =pCatalog;
      pTable->Name="Passport";
      ADOX::ColumnsPtr pCols =pTable->Columns;
      pCols->Append(_T("RecordID")  ,ADOX::adInteger,0);//自动编号字段
      pCols->Append(_T("Name")   ,ADOX::adWChar,255);//文本字段
      pCols->Append(_T("DateOfBirth")  ,ADOX::adDate,0);//日期字段
      pCols->Append(_T("OtherInfo"),ADOX::adLongVarWChar,0);//备注字段
      pCatalog->Tables->Refresh();
      long lCount=pCols->Count;
      for(long i=0;i<lCount;i++){
       pCols->GetItem(i)->ParentCatalog =pCatalog;//重要!设置Catalog,参见Q201826 PRB: Error 3265 When You Access Properties Collection
       ADOX::PropertiesPtr pProperties=pCols->GetItem(i)->Properties;
       if(pProperties){//这里是用于调试的属性显示代码
        long lp=pProperties->Count;
        TRACE("Properties for Col %s\r\n",(LPCTSTR)pCols->GetItem(i)->Name);
        for(long j=0;j<lp;j++){
         TRACE("\rProperty %s:%s\r\n",g_GetValueString(pProperties->GetItem(j)->Name)
          ,g_GetValueString(pProperties->GetItem(j)->Value));
        }
       }
      }
      pCols->GetItem(_T("RecordID"))->Properties->GetItem(_T("Description"))->Value=_T("记录编号");//注释
      pCols->GetItem(_T("RecordID"))->Properties->GetItem(_T("AutoIncrement"))->Value=true;//自动编号
      pCols->GetItem(_T("Name"))->Properties->GetItem(_T("Jet OLEDB:Compressed UniCode Strings"))->Value=true;
      pCols->GetItem(_T("Name"))->Properties->GetItem(_T("Description"))->Value=_T("姓名");
      pCols->GetItem(_T("DateOfBirth"))->Properties->GetItem(_T("Description"))->Value=_T("出生日期");
     pCols->GetItem(_T("OtherInfo"))->Properties->GetItem(_T("Jet OLEDB:Compressed UniCode Strings"))->Value=true;
      pCols->GetItem(_T("OtherInfo"))->Properties->GetItem(_T("Description"))->Value=_T("其他信息");
      pCatalog->Tables->Append(_variant_t ((IDispatch*)pTable));//添加表
      pCatalog->Tables->Refresh();//刷新
      pIndexNew.CreateInstance(_T("ADOX.Index"));
      pIndexNew->Name = "RecordID";//索引名称
      pIndexNew->Columns->Append("RecordID",ADOX::adInteger,0);//索引字段
      pIndexNew->PutPrimaryKey(-1);//主索引
      pIndexNew->PutUnique(-1);//唯一索引
      pTable->Indexes->Append(_variant_t ((IDispatch*)pIndexNew));//创建索引
      pIndexNew=NULL;
      pCatalog->Tables->Refresh();//刷新
      return TRUE;
     }
     catch(_com_error &e){
      ESErrPrintProviderError(tempConnn);
      ESErrPrintComError(e);
      return FALSE;
     }
     catch(...){
     } 
     return FALSE;
    }
      

  2.   

    第二个问题,只要给出sql语句就行了,或给个思路!
      

  3.   

    1,用adox创建数据库文件
    2,用sql语句,执行
      

  4.   

    我就是不知sql语句怎么写啊,能说祥细点吗?
    谢谢!
      

  5.   

    1、用ADOX创建Access数据库。
    #include <afx.h>
    #include <afxdisp.h>#pragma warning (disable: 4146)
    #import "c:\Program Files\Common Files\system\ado\msadox.dll" no_namespace
    #import "c:\Program Files\Common Files\system\ado\msado15.dll" rename("EOF", 
    "EndOfFile")#include "icrsint.h"#pragma warning (default: 4146)public:
             _CatalogPtr m_pCatalog;
    bool CreateDatabase(LPCTSTR lpstrCreate);
    ......
    //----------------------------------------------------
    bool CMyADOClass::CreateDatabase(LPCTSTR lpstrCreate)
    {
    try
    {
    m_pCatalog->Create(_bstr_t(lpstrCreate));
    return true;
    }
    catch(_com_error &e)
    {
    dump_com_error(e);
    return false;
    }
    }
    ......
    //---------------------------------------------------------
    2、表对象可以用ADOX创建(就是_TablePtr和_ColumnPtr)。
    也可以用sql语句创建:create table mytablename(id int,thename varchar(12)...);
      

  6.   

    你的第二个问题说得很不清楚~!我想你的意思是这样:INSERT INTO tUser3
    SELECT [Name] From tUser1 a Where a.[Name] NOT IN SELECT [Name] From tUser2
      

  7.   

    其实第二个问题意思是:
    假设test.mdb中有三个表:user1,user2,user3.
    怎样把user1.name和user2.name中不同的用户找出,写入user3.name中去呢?(用ADO)