【发布时间】:2015-03-30 13:59:48
【问题描述】:
我们有一个 VB6 应用程序,它使用 Ms-Access 97 数据库文件和一个工作组文件。为了防止用户意外直接打开文件,我们将文件的扩展名从mdb和mdw分别更改为sdb和sdw。
我们应用程序的下一个版本将与 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