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






3.41/5 (15投票s)
本文将帮助您将数据从 Sql Server 导出到 Access,格式为 Mdb 文件
引言
我正在开发一个 Web 应用程序,客户要求将应用程序数据库备份为 MDB 文件形式的 Access 数据。为此,我尝试了 DTS 包,但应用程序的数据库服务器位于远程服务器上,主机不愿意提供创建 DTS 包的权限。因此,创建了这段特定的代码片段。
这个过程基本上涉及两个函数:
-
CreateBackup(byval db)
-
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"