65.9K
CodeProject 正在变化。 阅读更多。
Home

将数据从 SQL 导出到 Mdb 文件中的 Access

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.41/5 (15投票s)

2006年2月20日

CPOL

1分钟阅读

viewsIcon

130704

downloadIcon

2693

本文将帮助您将数据从 Sql Server 导出到 Access,格式为 Mdb 文件

引言

我正在开发一个 Web 应用程序,客户要求将应用程序数据库备份为 MDB 文件形式的 Access 数据。为此,我尝试了 DTS 包,但应用程序的数据库服务器位于远程服务器上,主机不愿意提供创建 DTS 包的权限。因此,创建了这段特定的代码片段。

这个过程基本上涉及两个函数:

  1. CreateBackup(byval db)
  2. GetDataTypeEnum(byval val,byval siz)

CreateBackup(byval db)

这个函数接受参数 db 作为要创建的备份文件的 mdb 文件路径。为了创建备份,我们首先获取数据库中的所有**用户表**,然后将这些表名存储在数组中,

'Getting the name of all UserTables from SQL Server 
sql ="SELECT name FROM sysobjects WHERE xtype='u' and status >0"  
rs.Open sql, Cnn 'conMdbection to sql server
 if not rs.EOF then Redim arTables(0) 
   While not rs.eof 
     arTables(UBound(arTables)) = rs("name") 
    ReDim Preserve arTables(UBound(arTables) + 1) 
     rs.movenext 
   Wend 
  ReDim Preserve arTables(UBound(arTables) - 1) 
end if

然后,对于数组中的每个元素(表),在 mdb 文件中创建一个表,然后获取 SQL Server 中表的结构,然后仅为至少有一行数据的表在 mdb 文件中创建表。然后,使用分别用于 Access 和 SQL 的两个记录集,将数据从 SQL Server 复制到 Access 表。

For iCount=0 To UBound(arTables) 'Creation of table in mdb file starts here 
 if rs.state=1 then rs.close 
  sql ="SELECT * FROM " & arTables(iCount) 
    rs.Open sql, Cnn 
      If Not rs.EOF Then 
        tableName = arTables(iCount) 
          tableCreate = "CREATE TABLE " & tableName & "(" 
             For i=0 to rs.Fields.Count-2 
               tableCreate =tableCreate & rs.Fields.Item(i).Name &" " &_
                GetDataTypeEnum(cint(rs.Fields.Item(i).Type), rs.Fields.Item(i).DefinedSize) &", " 
             Next 
               tableCreate =tableCreate & rs.Fields.Item(rs.Fields.Count-1).Name &" "&_
                GetDataTypeEnum(cint(rs.Fields.Item(rs.Fields.Count-1).Type),rs.Fields.Item(i).DefinedSize) &")"  
             conMdb.execute tableCreate, , 129 'Table Creation in Mdb 
    
      sqlMdb ="SELECT * FROM " & arTables(iCount) 'SQL to new Table in Mdb 
      rsMdb.Open sqlMdb, conMdb,2,3 
      while Not rs.EOF 
    rsMdb.addnew 'Adding Records to Table 
    For i=0 to rs.Fields.Count-1 
      if Not isnull(rs(i)) Then rsMdb(i)=rs(i) 'Copying Data From SQL table to Access Table 
    Next 
    rs.movenext 
    rsMdb.update 
   Wend 
    rsMdb.close 
 End If 
Next 

在上述函数中,创建 DDL(数据定义语言)脚本以生成 Access 表时,存在一个问题,即 SQL 和 Access 的数据类型不同。为了将 SQL 数据类型解析为 Access 数据类型,我创建了函数 **GetDataTypeEnum(byval val,byval siz) **,它接受两个参数,一个是 SQL 字段的类型,另一个是其大小,

GetDataTypeEnum(byval val, byval siz)

Case 3 GetDataTypeEnum= "INT"'"adInteger" 
Case 7 GetDataTypeEnum= "DATETIME"'"adDate" 
Case 11 GetDataTypeEnum= "YESNO"'"adBoolean"
Case 133 GetDataTypeEnum= "DATETIME"'"adDBDate"
Case 200 '"adVarChar" 
   if siz<255 then GetDataTypeEnum= "VARCHAR("& siz &")" else GetDataTypeEnum= "MEMO" 
Case 201 GetDataTypeEnum= "MEMO DEFAULT ''"'"adLongVarChar" 
© . All rights reserved.