如何将 table 的内容从 Access 97 文件复制到 Access 2013 文件

How to copy a table's contents from an Access 97 file into an Access 2013 file

我们有一个 VB6 应用程序,它使用 Ms-Access 97 数据库文件和一个工作组文件。为了防止用户不小心直接打开文件,我们将文件的扩展名从 mdbmdw 分别更改为 sdbsdw。 我们应用程序的下一个版本是 运行 与 Ms-Access 2013 数据库。我们还对新的 accdb 文件进行了扩展处理,它们现在的扩展名为 sccdb。 由于 Microsoft 将停止在 MSO 2013 中使用旧的 mdb 文件(阅读:MS-Access 2013 无法再打开旧的 mdb/sdb 文件,我们必须这样做才能更新数据),我们希望传输从旧文件的 table 之一到新 accdb 文件中的 table 的数据(已经包含正确的 table)。 为此,我目前正在执行以下操作:

Const cNewFile = "C:\test\myNewAccdb.sccdb" 'new DB
Const cOldFile = "C:\test\myOldMDB.sdb"     'old DB
Const cOldMDW = "C:\test\myOldMDW.sdw"      'workgroup file of old DB, no Idea where to put this
Const cOldMDWUsr = "user" 'username and pwd for old mdw/sdw
Const cOldMDWPwd = "pass" ' also no idea where to put this

Dim dbConn As ADODB.Connection
Dim tName As String

tName = "Table1"  'name of table to work with
Set dbConn = new ADODB.Connection 'connection to new db
dbConn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source= " & cnewfile
'remove existing data in new table
dbConn.Execute "DELETE FROM " & tName, , adExecuteNoRecords

'now the tricky part: Copy all rows from the old mdb/sdb ****************
dbConn.Execute "INSERT INTO " & tName & " SELECT * FROM " & _ 
"[MSAccess;DATABASE=" & cOldFile & ";].[" & tName & "]"
' ***********************************************************************
'this currently leads to an "could not find installable isam" error

我不知道如何告诉打开的连接文件实际上是一个 MDB (=SDB) 并且有一个带有用户名和密码的 MDW (=SDW)。

有人知道如何在 Execute(...) 命令中表达这个吗? 我真的很想避免使用记录集在大 for 循环中复制所有记录。 非常感谢任何帮助。


编辑: 谢谢大家的评论和提示,这是我最终所做的: 我们使用 Microsoft Access Database Engine 2010 Redistributable 作为后端 (http://www.microsoft.com/en-us/download/confirmation.aspx?id=13255) 并逐字段复制所有记录。这种行为很奇怪,因为 ADODB 让我可以使用连接字符串中的相应提供程序非常好地打开重命名的 accdb 或 mdb 文件(accdb/sccdb:"Microsoft.ACE.OLEDB.12.0",mdb/sdb:"Microsoft.Jet.OLEDB.4.0" ),但似乎无法说服 accdb 提供程序上 运行ning 的连接为上述 INSERT 命令打开 mdb。 所以 - 我所做的是打开到两个文件的两个连接,然后使用这样的函数将数据推送过来:

Public Sub DB_Copy_Table(dbConnNew As ADODB.Connection, _
    dbConnOld As ADODB.Connection, _
    TableName As String)

    Dim f As Long
    Dim rsOld As ADODB.Recordset, rsNew As ADODB.Recordset

    On Error GoTo err_Copy
    'delete new data
    dbConnNew.Execute "DELETE FROM " & TableName, i, adExecuteNoRecords 'adExecuteNoRecords=128
    Set rsOld = New ADODB.Recordset'make a recordset for old data
    With rsOld
        .CursorType = adOpenStatic
        .CursorLocation = adUseClient
        .LockType = adLockReadOnly
        .Open "select * from " & TableName, dbConnNew
    End With
    Set rsNew = New ADODB.Recordset'make a recordset into the new table
    With rsNew
        .CursorType = adOpenDynamic
        .CursorLocation = adUseClient
        .LockType = adLockOptimistic
        .Open "select * from " & TableName, dbConnNew
    End With
    If rsOld.RecordCount > 0 Then
        rsOld.MoveFirst'copy data if we have some
        Do While Not rsOld.EOF
            rsNew.AddNew
            For f = 0 To rsOld.Fields.Count - 1
                rsNew.Fields.Item(f).value = rsOld.Fields.Item(f).value
            Next
            rsNew.Update
            rsOld.MoveNext
        Loop
    End If
End Sub

您的问题不是 Access 2013 无法打开具有用户级安全性 (ULS) 的 .mdb 文件。事实上,Access 2013 仍然具有处理受 ULS 保护的 .mdb 文件的选项,包括文件选项卡上 "Manage Users & Permissions" 下的 "User-Level Security Wizard" 和相关实用程序。

您的问题是 Access 2013 根本无法使用 Access 97 数据库文件,无论它们是否受 ULS 保护或不。此外,不仅仅是Microsoft Access 2013(应用程序)拒绝使用Access 97文件的功能,相应版本的Access Database Engine(版本15.0)也拒绝与Access 97文件有任何关系

因此,如果一台机器安装了 Access 2013 并且您的应用程序指定 "Microsoft.ACE.OLEDB.12.0" 您实际上使用的是 ACE 15.0 版,而不是 12.0 版,您将无法打开 任何 访问 97.mdb 文件。 (更多信息见我的另一个回答。)

您可以通过在 Access 2010 后端(而不是 Access 2013)上进行标准化来避免一些不便,因为该版本的 ACE 仍将读取 Access 97 文件。但是,对于已经拥有 Access 2013 的用户,您仍然需要一种方法来升级他们的旧数据库文件,而无需降级到 Access 2010。

实现此目的的一种方法是创建一个 32 位转换应用程序,该应用程序使用较旧的 Jet 数据库引擎将 Access 97 文件转换为 Access 2013 可以使用的格式。一个简单的 VBScript 示例是这样的...

Option Explicit
Const dbLangGeneral = ";LANGID=0x0409;CP=1252;COUNTRY=0"
Const dbVersion40 = 64 
Const dbFailOnError = 128

Dim dbe, con
Dim sourceDbSpec, mdwSpec, destinationDbSpec, uid, pwd, tableName

sourceDbSpec = "Z:\_test\a97file.mdb"
mdwSpec = "Z:\_test\Security.mdw"
destinationDbSpec = "Z:\_test\converted.mdb"
uid = "Gord"
pwd = "whatever"
tableName = "Table1"

Set con = CreateObject("ADODB.Connection")
con.Open _
        "Driver={Microsoft Access Driver (*.mdb)}" & _
        ";Dbq=" & sourceDbSpec & _
        ";SystemDB=" & mdwSpec & _
        ";Uid=" & uid & _
        ";Pwd=" & pwd

' create target .mdb file
Set dbe = CreateObject("DAO.DBEngine.36")
dbe.CreateDatabase destinationDbSpec, dbLangGeneral, dbVersion40
Set dbe = Nothing

' copy table
con.Execute _
        "SELECT * " & _
        "INTO [;Database=" & destinationDbSpec & "].[" & tableName & "] " & _
        "FROM [" & tableName & "]", _
        dbFailOnError
con.Close
Set con = Nothing

... 这将创建一个 Access 2003 .mdb 文件。然后可以通过 Access 数据库引擎的 Access 2013 版本将该文件导入到您的 .accdb 文件中。