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



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

Const cNewFile = "C:testmyNewAccdb.sccdb" 'new DB
Const cOldFile = "C:testmyOldMDB.sdb"     'old DB
Const cOldMDW = "C:testmyOldMDW.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(...)命令中表达这一点吗?我真的希望避免使用记录集复制big-for循环中的所有记录。我们非常感谢您的帮助。


编辑:感谢大家的评论和提示,以下是我最终所做的:我们正在使用Microsoft Access数据库引擎2010 Redistributable作为后端(http://www.microsoft.com/en-us/download/confirmation.aspx?id=13255)并且正在逐字段复制所有记录。这种行为非常奇怪,因为ADODB允许我使用连接字符串中的相应提供程序(accdb/sccdb:"Microsoft.ACE.OLEDB.12.0",mdb/sdb:"Microsoft.Jet.OLEDB.4.0")非常好地打开重命名的accdb或mdb文件,但似乎没有办法说服在accdb提供程序上运行的连接为上述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文件,包括"用户级安全向导"one_answers"文件"选项卡上"管理用户和权限"下的相关实用程序。

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

因此,如果计算机安装了Access 2013,并且您的应用程序指定为"Microsoft.ACE.OLEDB.12.0",那么您实际上使用的是ACE 15.0版本,而不是12.0版本,并且您将无法打开任何Access 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:_testa97file.mdb"
mdwSpec = "Z:_testSecurity.mdw"
destinationDbSpec = "Z:_testconverted.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 2013版本的Access数据库引擎导入到.accdb文件中。

最新更新