MFC+ADO+ACCESS自动创建数据库

   最近偶然要做一个小型的数据库管理系统,为了方便用户无需自己用access创建数据库,所以,我必须设法让程序能够创建数据库,数据库表以及判断数据库表的存在。下面的程序代码希望能够为遇到这方面困难的朋友提供帮助:(2008/11/5重新编辑)

  1. //1.引入ado库
  2. #import "c:/Program Files/Common Files/System/ADO/Msadox.dll"  rename_namespace("ADOCG") rename("EOF", "adoXEOF") rename("DataTypeEnum","adoXDataTypeEnum") 
  3. #import "C:/Program Files/Common Files/System/ADO/msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")
  4. using namespace ADODB;  
  5. using namespace ADOCG;
  6. #define TESTHR(x) if FAILED(x) _com_issue_error(x);
  7. //2.创建ACCESS数据库 
  8. BOOL CDeRenDlg::CreateMdb(CString strDBName)
  9.     CString strMdbConn "Provider='Microsoft.JET.OLEDB.4.0';Data source " strDBName;
  10.  try
  11.  {
  12.   HRESULT hr S_OK; 
  13.   _CatalogPtr pCatalog NULL;
  14.   _bstr_t cnnstring(strMdbConn);
  15.   
  16.   TESTHR(hr pCatalog.CreateInstance(__uuidof (Catalog)));
  17.         pCatalog->Create(cnnstring);
  18.  }
  19.  catch(_com_error e)
  20.  {
  21.   _bstr_t bstrDescription(e.Description());
  22.   CString strErro=CString(_T("创建ACCEESS数据库出错: ")) 
  23.                (LPCSTR)e.Description()
  24.       CString(_T("Create ACCESS DB error: "))
  25.       (LPCSTR)e.Description();
  26.   AfxMessageBox(strErro);
  27.   return FALSE;
  28.  }
  29.  return TRUE;
  30. }
  31. //3.创建数据库表-材料表
  32. BOOL CDeRenDlg::CreateTable( CString strTabName)
  33. {
  34.  HRESULT hr S_OK;
  35.     _CatalogPtr pCatalog NULL;
  36.     _TablePtr pTableNew NULL;
  37.     _IndexPtr pIndexNew NULL;
  38.     _IndexPtr pIndex  NULL;
  39.     _ColumnPtr pColumn  NULL;
  40.  CString strConn,strDBName;
  41.  strDBName=this->GetDBName(m_nDBYear);
  42.  CFileFind ff;
  43.  if(!ff.FindFile(strDBName))
  44.  {
  45.   AfxMessageBox("数据库不存在,请先在高级设置对话框中创建数据库!");
  46.   return FALSE;
  47.  }
  48.  strConn="Provider='Microsoft.JET.OLEDB.4.0';Data source " strDBName;
  49.  _bstr_t strcnn(strConn);
  50.     try
  51.     {
  52.         TESTHR(hr pCatalog.CreateInstance (__uuidof(Catalog)));
  53.         TESTHR(hr pTableNew.CreateInstance(__uuidof(Table)));
  54.         TESTHR(hr pIndexNew.CreateInstance(__uuidof(Index)));
  55.         TESTHR(hr pIndex.CreateInstance   (__uuidof(Index)));
  56.         TESTHR(hr pColumn.CreateInstance  (__uuidof(Column)));
  57.   
  58.         // 连接
  59.         pCatalog->PutActiveConnection(strcnn);
  60.         // 表名
  61.         pTableNew->Name _bstr_t(strTabName);
  62.   pTableNew->ParentCatalog pCatalog;
  63.   //
  64.   //m_pTableNew->Columns->Append("ContactId", ::adInteger,0);          
  65.         //m_pTableNew->Columns->GetItem("ContactId")->Properties->GetItem("AutoIncrement")->Value true;
  66.   
  67.   // 加入字段
  68.   CString str;
  69.   str _T("公司名称");//"公司名称";
  70.   pTableNew->Columns->Append(_variant_t(str), ADOCG::adVarWChar, 50);
  71.         pTableNew->Columns->GetItem(_variant_t(str))->Properties->GetItem("Jet OLEDB:Allow Zero Length")->Value =false//将必填字段设置为否
  72.   str _T("产品名称");//"产品名称";
  73.   pTableNew->Columns->Append(_variant_t(str), ADOCG::adVarWChar, 50);
  74.         pTableNew->Columns->GetItem(_variant_t(str))->Properties->GetItem("Jet OLEDB:Allow Zero Length")->Value =false;
  75.   str _T("产品规格");//"产品名称";
  76.   pTableNew->Columns->Append(_variant_t(str), ADOCG::adVarWChar, 50);
  77.         pTableNew->Columns->GetItem(_variant_t(str))->Properties->GetItem("Jet OLEDB:Allow Zero Length")->Value =false;
  78.      /
  79.      
  80.   // 加入表中
  81.         pCatalog->Tables->Append(_variant_t ((IDispatch*)pTableNew));        
  82.         pCatalog->Tables->Refresh();
  83.   
  84.     }
  85.     catch(_com_error &e)
  86.     {
  87.         _bstr_t bstrSource(e.Source());
  88.         _bstr_t bstrDescription(e.Description());
  89.   AfxMessageBox(e.Description());
  90.   return FALSE;
  91.    
  92.     }
  93.  return TRUE;
  94. }
  95. //4.判断一个表在数据库中是否存在
  96. BOOL CDeRenDlg::IsTalbeExit(CString strTable)
  97. {
  98.  try 
  99.  
  100.   if(!m_adoConnection.IsOpen()) return FALSE;
  101.   
  102.   _RecordsetPtr   pRstSchema     NULL;
  103.   pRstSchema=m_adoConnection.OpenSchema(adSchemaTables);
  104.   
  105.   while(!pRstSchema->adoEOF) 
  106.   
  107.    _bstr_t table_name pRstSchema->Fields->GetItem("TABLE_NAME")->Value;
  108.    _bstr_t table_type pRstSchema->Fields->GetItem("TABLE_TYPE")->Value;
  109.    if strcmp(((LPCSTR)table_type),"TABLE")==0)
  110.    {
  111.     if(strTable.Compare((LPCSTR)table_name)==0)return  true;
  112.    
  113.   
  114.    pRstSchema->MoveNext(); 
  115.   }
  116.   
  117.   if(pRstSchema) pRstSchema->Close(); 
  118.  }
  119.  catch(_com_error e)// 
  120.  
  121.   ::MessageBox(NULL,e.Description(),"Error",MB_OK);
  122.   return FALSE;
  123.  }
  124.  return false;
  125. }

转载于:http://blog.sina.com.cn/s/blog_610c1cad0100yhrr.html
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值