Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> VBA  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1701886
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

如何用VBA转换ACCESS97数据库到2000 2003 2007格式?

作者:cg1  摘自:access911.net  :cg1  更新日期:2009-6-9  浏览人次:

 

问题:

如何编程用 VB6 或者 VBA6 将 ACCESS97 格式的数据库转换为ACCESS2000 2003 2007格式?

 

回答:

据我所知,没有完美转换的办法,但是有两种替代方法。
1、在VB6 VBA中用 SHELL 调用 msaccess.exe 的命令行来转换。
/convert  目标数据库 将早期版本的 Access 数据库或 Access 项目转换为 Access 2007 文件格式,重命名这一新文件,然后关闭 Access。在使用 /convert 开关之前必须指定源数据库。  
当然,上述转换的前提是在当前电脑上安装了最新版本的 OFFICE ACCESS 软件。

2、在VB6 VBA中直接用 ADOX DAO 新建一个高版本的数据库,然后用 ADOX DAO 读取97格式中所有表的数据结构及数据本身,然后编程添加到高版本中。当然,比如宏、窗体等就不一定能转换成功了。而且这种转换方法需要编写的代码量极大。

3、有兴趣的读者可以用DAO的CompactDatabase方法、JRO的CompactDatabase方法试验一下,但是都不够完美。具体资料请参考:
http://support.microsoft.com/kb/243252


BUG: Converting Access97 MDB to Access 2000 Format Using DAO 3.6
View products that this article applies to.
This article was previously published under Q243252
Expand all | Collapse all
SYMPTOMSIf you convert an Access97 (Jet 3.5) database to Access 2000 (Jet 4.0) format us...If you convert an Access97 (Jet 3.5) database to Access 2000 (Jet 4.0) format using DAO 3.6 and then attempt to open it with Access 2000, a "Convert Database" dialog box appears. This dialog box is misleading because the database is in JET 4.0 format. 
Back to the top
RESOLUTIONAlthough Access 2000 displays a dialog box indicating that the database needs to...Although Access 2000 displays a dialog box indicating that the database needs to be converted, the database actually is in Jet 4.0 format. 
Back to the top
STATUSMicrosoft has confirmed this to be a bug in the Microsoft products listed at the...Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. 
Back to the top
MORE INFORMATIONCreate a new Visual Basic Standard EXE project and then paste the following code...Create a new Visual Basic Standard EXE project and then paste the following code in the General Declarations section and set a reference to DAO 3.6. This example uses an Access97 Biblio.mdb: 
Sub Form_Click()

Dim db As DAO.Database
Set db = DBEngine(0).OpenDatabase("D:\Program Files\Microsoft Visual Studio\VB98\Biblio.mdb")
Debug.Print db.Version
db.Close

dbPath = "D:\Program Files\Microsoft Visual Studio\VB98\"
DBEngine.CompactDatabase "D:\Program Files\Microsoft Visual Studio\VB98\Biblio.mdb", _
                            "D:\Program Files\Microsoft Visual Studio\VB98\Biblio2k.mdb", _
                            dbLangGeneral, dbVersion40, dbLangGeneral

Set db = DBEngine(0).OpenDatabase("D:\Program Files\Microsoft Visual Studio\VB98\Biblio2k.mdb")
Debug.Print db.Version
db.Close
MsgBox "Conversion Done!"
End Sub


                

Run the project and click the Form.

Alternatives to DAO 3.6 CompactDatabase for converting are:

Convert the database with JRO (Jet Replication objects) as shown in the Microsoft Knowledge Base article Q230501 mentioned in the REFERENCES section following. However, this still results in the same "Convert Database" dialog box when opening with Access 2000.
Create a new database with DAO 3.6 and import all objects from previous database.
Back to the top
REFERENCESFor additional information, please click the article numbers below to view the a...For additional information, please click the article numbers below to view the articles in the Microsoft Knowledge Base: 
230501  (http://support.microsoft.com/kb/230501/EN-US/ ) HOWTO: Compacting Microsoft Access Database via ADO 
141796  (http://support.microsoft.com/kb/141796/EN-US/ ) HOWTO: Identify the Jet Database Engine Components 
225048  (http://support.microsoft.com/kb/225048/EN-US/ ) INFO: Issues Migrating from DAO/Jet to ADO/Jet 
196809  (http://support.microsoft.com/kb/196809/EN-US/ ) PRB: CompactDatabase Method Requires Locale to Convert 2.0 MDB 
Back to the top


JRO Compact / Repair 

--------------------------------------------------------------------------------

Version 3.51 of the DAO library had a separate .Repair and .Compact methods, but these have been combined in DAO 3.6 into the .Compact method as can be seen from one sentence on this MS Knowledge base (ADO) article: ADO Compact / Repair. Using JRO, you can only compact an Access 2000 and above format. If you compact an Access 97 version, it will be converted to Access 2000 format. If you try to use the Jet 3.51 provider, it will not work and produces an error. You HAVE to use DAO to compact Access 97 databases, unless you want to convert them.

If you are following the ADO tutorial, run the project and click on the "Compact / Repair" button. Use the Common Dialog to open the "TestDAOvsADO.mdb" database and proceed with the compaction. The next stage is to examine the Schema of the database

Private Sub cmdADOCompact_Click()
    'As we are using a Graphical Style Checkbox to simulate a Command button:
    If ChangeCmdProperties(cmdADOCompact) Then
        Exit Sub
    End If
    
    Dim JRO As New JRO.JetEngine
    Dim cnnSrc As New ADODB.Connection
    Dim strSource As String
    Dim strDestDB As String
    Dim strPassword As String
    Dim fAccess97 As Boolean
    Dim iFileStart As Integer
    Dim cTimer As clsTimer
    Dim tl As Long
    
    With cdlgFile
        .DialogTitle = "Select Database to Compact"
        .Filter = "Access 97/2000 (*.mdb)|*.mdb"
        .CancelError = False
        .InitDir = "C:\My Documents"
        .ShowOpen
    End With
    
    strSource = cdlgFile.FileName
    If strSource = "" Then
        MsgBox "Cancel clicked"
        Exit Sub
    End If
    
    'open the database to get its version. Error if not Access97
    fAccess97 = True
    On Error GoTo VersionErr
    cnnSrc.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=" & strSource & ";Persist Security Info=False"
    cnnSrc.Open
        
    ' Set the current connection to nothing before compacting
    cnnSrc.Close
    
    
    
    'get path/file name of source, add "Backup of " to file name
    iFileStart = InStrRev(strSource, "\", , vbTextCompare)
    strDestDB = Mid$(strSource, 1, iFileStart) & "Backup of " & Mid$(strSource, iFileStart + 1)
    On Error GoTo CompactErr
    
    If fAccess97 Then
        'This should work in theory, but comes up with an error.
        'If you use Microsoft.Jet.OLEDB.4.0 it will work, but converts it to Access 2000 format
        'Useful eh! Good old ADO...
        'Time to go for DAO if using Access 97 databases!
        If MsgBox("You are about to try compacting an Access 97 database using JRO" & vbCrLf & _
        "If you use OLEDB.4.0 it will convert to Access 2000 format." & vbCrLf & _
        "Would you like to continue and receive an error message?", vbQuestion + vbYesNo) = vbYes Then
            Set cTimer = New clsTimer
            cTimer.Reset
            On Error GoTo CompactErr
            JRO.CompactDatabase "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=" & strSource & ";Jet OLEDB:Database Password=" & strPassword, _
            "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=" & strDestDB & ";Jet OLEDB:Database Password=" & strPassword
        Else
            Set JRO = Nothing
            Exit Sub
        End If
    Else
        Set cTimer = New clsTimer
        cTimer.Reset
        JRO.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strSource & ";Jet OLEDB:Database Password=" & strPassword, _
        "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strDestDB & ";Jet OLEDB:Database Password=" & strPassword
    End If
    
    'compact success so delete original file
    Kill strSource

    DoEvents
    'rename backup to original name
    Name strDestDB As strSource
    MsgBox strSource & vbCrLf & "Compacted Successfully"

    tl = cTimer.Interval
    Me.Caption = "Time taken " & tl & " ms"
    Set cTimer = Nothing
    Set JRO = Nothing
    
    Exit Sub
    
VersionErr:
    If Err.Number = -2147467259 Then
        cnnSrc.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strSource & ";Persist Security Info=False"
        fAccess97 = False
        Resume
    ElseIf Err.Number = -2147217843 Then 'wrong password
        strPassword = InputBox("Enter password for this database. Leave blank to Cancel")
        If strPassword = "" Then
            Exit Sub
        Else
            cnnSrc.Properties("Jet OLEDB:database Password").Value = strPassword
            Resume
        End If
    Else
        MsgBox "Error opening database: " & vbCrLf & strSource & vbCrLf & Err.Number & " " & Err.Description
    End If
    
    Exit Sub
    
CompactErr:
    MsgBox strSource & vbCrLf & "Compact Error:" & vbCrLf & Err.Number & " " & Err.Description
    Set cTimer = Nothing
End Sub

 


 


本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
     如何实现行列的转换?有关交叉表的应用
     关于单位“缇”与“像素”的转换,以及缇与其他单位(例如:厘米)之间的转换
     如何计算两个时间间隔并转换成“N天N小时N分N秒”这样的形式?
     新手来看:如何进行二进制到六十二进制向十进制的转换?
     VBA与T-SQL之间的函数比较;SQL Server的SQL语句如何在ACCESS中使用?
     SQL SERVER 与ACCESS、EXCEL的数据转换
     数字转二进制文本,十进制二进制互转
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利