【问题标题】:How to copy a table's contents from an Access 97 file into an Access 2013 file如何将表的内容从 Access 97 文件复制到 Access 2013 文件中
【发布时间】:2015-03-30 13:59:48
【问题描述】:

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

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(...) 命令中表述这一点吗? 我真的很想避免使用记录集在大循环中复制所有记录。 非常感谢任何帮助。


编辑: 谢谢大家的cmets和提示,这是我最终所做的: 我们使用 Microsoft Access 数据库引擎 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 提供程序上运行的连接为上述 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

【问题讨论】:

  • 不能重命名为正常的扩展名进行转换吗?
  • @Rob 我也许可以做到,但在 MDW/SDW 工作组文件和用户名/密码中打补丁的问题仍然存在。
  • 您可能必须使用 DAO,打开两个记录集,然后运行一个循环。
  • Jet OLEDB:系统数据库=system.mdw; ? (来自connectionstrings.com/access
  • @Gustav:这就是我最终所做的 :)

标签: ms-access vb6 ms-access-2013 ms-access-97


【解决方案1】:

您的问题不在于 Access 2013 无法使用用户级安全 (ULS) 打开 .mdb 文件。事实上,Access 2013 仍然具有处理受 ULS 保护的 .mdb 文件的选项,包括“文件”选项卡上“管理用户和权限”下的“用户级安全向导”和相关实用程序。

您的问题是 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 文件。 (更多信息请看我的另一个回答here。)

您可以通过在 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 2013 版本的 Access 数据库引擎将该文件导入到您的 .accdb 文件中。

【讨论】:

  • 感谢您的详尽回答,正如您在我的问题的编辑中看到的那样,它并没有真正解决我的问题(我无法确定是否允许我在客户机器)。
  • 应用程序始终可以在 %TEMP% 中创建文件。
猜你喜欢
  • 2021-02-20
  • 1970-01-01
  • 2012-07-15
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
相关资源
最近更新 更多