vc+ado动态创建access数据库

原创 2004年08月30日 15:32:00

ado技术目前已经成为连接数据库的主流技术,下面我来介绍如何使用ado来动态创建access数据库。

为了使用ado,必须引入微软的两个动态连接库msadox.dll和msado15.dll:

#pragma warning (disable: 4146)
#import "c:/Program Files/Common Files/system/ado/msadox.dll"
#import "c:/Program Files/Common Files/system/ado/msado15.dll" no_namespace rename("EOF", "EndOfFile")
#pragma warning (default: 4146)

将上述代码加入到stdafx.h文件中,由于ado是com组件,因此使用ado之前还要初始化com环境:

CoInitialize(NULL);

 

下面是一个在access数据库中创建表的sql语句的例子:

create table test
(
  name      text(20) WITH COMPRESSION not null,

  score      decimal(12,4) not null default 0,

  ID           smallint not null default 0,

  birthday   date,

  sex           char(1),

  CONSTRAINT CK_CH_SEX Check(SEX in ('N','V')),

  CONSTRAINT PK_ID Primary Key (ID)

);

 

使用ADOX::CatalogPtr来创建mdb文件:

 HRESULT hr = S_OK;
 
 //Set ActiveConnection of Catalog to this string
 CString strcnn(_T("Provider=Microsoft.JET.OLEDB.4.0;Data source = d://test.mdb"));

 try
 {
      ADOX::_CatalogPtr m_pCatalog = NULL;
      hr = m_pCatalog.CreateInstance(__uuidof (ADOX::Catalog));

      if(FAILED(hr))

     {

            _com_issue_error(hr);

       }

       else

       {
              m_pCatalog->Create(_bstr_t(strcnn)); //Create MDB

       }
 } 
 catch(_com_error &e)
 {
     // Notify the user of errors if any.
     AfxMessageBox(_T(“error“));
 }

 

创建一个连接对象打开刚刚建立的mdb文件:

_ConnectionPtr g_pConn;

 g_pConn.CreateInstance(__uuidof(Connection));

 g_pConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d://test.mdb;",
  "", "", adConnectUnspecified); 

 

下面函数用来执行sql文件中的sql语句:

// Function name : RunSqlScript
// Description  : 执行SQL脚本,
peckermen@163.com, 2003-09-15
// Return type  : BOOL 成功返回TRUE
// Argument   : LPCSTR SqlScriptFile SQL脚本文件名
// Argument   : char separator SQL 分割符号, 缺省';'
// Argument   : char Remark    SQL 注释符号, 缺省'-'
BOOL RunSqlScript(LPCSTR SqlScriptFile, char separator = ';', char Remark = '-')
{
 BOOL bRet = FALSE;
 CFileFind finder;
 CString ErrLong;
 if (finder.FindFile(SqlScriptFile) == TRUE)
 {
  CFile fSql;
  TCHAR *buffer, *pSQL, *p;
  
  fSql.Open(SqlScriptFile,CFile::modeRead);
  UINT nFileLength = fSql.GetLength();
  
  buffer = (TCHAR *)malloc((nFileLength + 1) * sizeof(TCHAR));
  _tcsnset(buffer, TCHAR('/0'), nFileLength + 1);

  UINT nBytesRead = fSql.Read(buffer,nFileLength); //把sql文件内容读入内存缓冲区
  fSql.Close();

  p = pSQL = buffer;
  BOOL bRunOK = FALSE;
  BOOL bInNote = FALSE;
  BOOL bSkip = FALSE;
  CString strSQL;
  TCHAR ch;
  ErrLog = _T("");
  while (p < (buffer + nFileLength)){
          //判断是否是注释行
   if (bInNote)
   {
    if (*p == TCHAR('/x0a'))
     bInNote = FALSE;
   }
   else
   {
    if ((*p == Remark) && (*(p+1) == Remark))
    {
     bInNote = TRUE;
     p++;
    }
    else
    {
            //判断是否是sql语句结束标志
     if (*p == separator){
      strSQL = _T("");
      bSkip = FALSE;
      while (pSQL < p)
      {
       if (bSkip == FALSE){
        if ((*(pSQL) == Remark) &&(*(pSQL+1) == Remark))
        {
         bSkip = TRUE;
         pSQL++;
        }
        else
        {
         ch = *pSQL;
         strSQL = strSQL+ch;
        }
       }
       else{
        if (*pSQL = TCHAR('/x0a')){
         bSkip = FALSE;
         ch = TCHAR(' ');
         strSQL = strSQL + ch;
        }
       }
       
       pSQL++;
      }
      pSQL = p + 1;
      ErrLog = ErrLog + _T("-- SQL Running .../n");
      ErrLog = ErrLog + strSQL;
      
      _variant_t vRecords;
 
      m_nRecordsAffected = 0;

      try
      {
       g_pConn->CursorLocation = adUseClient;
       g_pConn->Execute(_bstr_t((LPCTSTR)strSQL), &vRecords, adExecuteNoRecords);
       m_nRecordsAffected = vRecords.iVal;
       bRunOK = TRUE;
      }
      catch(_com_error &e)
      {
       bRunOK = FALSE; 
      }
      
      if (bRunOK)
       ErrLog = ErrLog + _T("/n-- Successed!/n");
      else
      {
       ErrLog = ErrLog + _T("/n-- Failed!/n");
       break;
      }
      
     }
    }
   }
   p++;
  }
  free(buffer);
  bRet = bRunOK;
 }
 return bRet;
}

 

调用RunSqlScript创建access数据库中的表:

RunSqlScript(_T("d://test.sql"));

 

关闭数据库连接:

g_pConn->Close();

::CoUninitialize();

 

以上代码演示了怎样在vc中利用ado根据sql文件动态创建一个access数据库,欢迎指正。

 peckermen@163.com

 



c# 操作ACCESS数据库

c# 简单操作ACCESS
  • nanxizhu
  • nanxizhu
  • 2014年11月06日 20:10
  • 2232

Qt操作Access数据库

Qt为数据库访问提供QtSql模块实现了数据库与Qt应用程序的无缝集成。QtSql模块使用驱动插件与不同的数据库接口通信。Qt自带有QODBC驱动,通过windows平台上提供的ODBC驱动访问支持O...
  • Zhangchen9091
  • Zhangchen9091
  • 2014年09月27日 09:36
  • 755

Asp.net_连接Access数据库

今天一个朋友让我帮忙做一个asp.net的小网站,需要用到得是access数据库。一直以来,学习web开发,都是用sql server或者是mysql。虽说access数据库简单易用,但是没用过,去做...
  • zlfxy
  • zlfxy
  • 2013年04月10日 12:54
  • 9184

vb.net合伙数据库access(一)——连接数据库

终于在花了一个四个小时的时间完成了数据库与vb.net的合伙连接的第一步连接数据库,在这个过程遇到了问题,而且也是出现了一些刚刚接触的新的词语和观念,很新鲜,不过无论怎么样,最终也是给解决了,还是有一...
  • changyinling520
  • changyinling520
  • 2016年01月05日 19:07
  • 2302

远程访问Access数据库

远程访问Access数据库
  • TaoYuanKuangDao
  • TaoYuanKuangDao
  • 2017年05月05日 10:57
  • 1025

jsp 连接 Access 数据库 程序测试

  • hanshileiai
  • hanshileiai
  • 2014年06月19日 23:48
  • 1226

C#access数据库查询操作(一)

数据库有增,删,改,查等操作,但在实际数据库的应用过程中,查询实际上是应用的最多的一种对数据库的操作方式。 1.首先要说一个问题就是,在数据库的定义过程中,表里的字段的数据类型强烈建议按照数据类型定义...
  • pengshupan
  • pengshupan
  • 2016年04月20日 17:17
  • 4484

Access数据库从入门到进门——应用篇

Access数据库自身提供了非常强大的VBA编程,可以很方便的开发小型软件,具体的使用方法请查阅相关资料。但是,对于我们而言,在软件开发过程中,都采用三层架构的开发方法,使用不同的编程语言,所以,遇到...
  • why15732625998
  • why15732625998
  • 2016年04月27日 21:01
  • 1318

VBA访问access数据库实例

最近,同事要用一个excel文件导出每天邮件的信息,邮件基本信息都存在了access数据表中了,要实现这个功能有好几种方式,例如写一个qty文件,而我直接用了excel自带的VBA功能,写了一个宏,根...
  • zhangshufei8001
  • zhangshufei8001
  • 2016年08月18日 16:39
  • 2052

java连接access数据库说明以及示例代码

之前 我链接access的时候 经常出现odbc源驱动器的错误   后来我才发现 其实是这样的 要连接Access数据源,首先要建立一个JDBC-ODBC桥接器,其方法是: Class.f...
  • u012491166
  • u012491166
  • 2015年01月28日 21:55
  • 2265
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vc+ado动态创建access数据库
举报原因:
原因补充:

(最多只允许输入30个字)