使用 OLE 时如何绕过 MS Access 启动?

Posted

技术标签:

【中文标题】使用 OLE 时如何绕过 MS Access 启动?【英文标题】:How Do I Bypass MS Access Startup When Using OLE? 【发布时间】:2009-01-13 22:36:03 【问题描述】:

我正在尝试使用 C# 和 OLE 从访问数据库中自动导出 xml。除了显示启动表单并且在没有用户干预的情况下不会关闭之外,一切都运行良好。

这是我目前正在做的事情:

objAccess = CreateObject("Access.Application");
objAccess.OpenCurrentDatabase("C:\\MYDB.mdb", true); //true = open in exclusive mode
objAccess.ExportXML(0, "TestTable", "c:\\test.xml");
objAccess.CloseCurrentDatabase();
objAccess.Quit();

【问题讨论】:

【参考方案1】:

无需打开 Access 即可将表格输出到 XML,例如在 VBScript 中:

Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adPersistXML = 1

Dim strCon, cn, rs

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
strCon = "Provider= Microsoft.Jet.OLEDB.4.0; Data Source=" & "C:\Docs\LTD.mdb"

cn.Open strCon
rs.Open "Select * from Table1", cn, adOpenStatic, adLockOptimistic

If Not rs.EOF Then
    rs.MoveFirst 
    rs.Save "C:\Docs\Table1.xml", adPersistXML
End If

rs.Close
cn.Close

【讨论】:

MS Access 吐出的 XML 是否与您的 ADO 经典(非 ADO.NET)代码吐出的 XML 相同?【参考方案2】:

据我所知,唯一的方法是使用 msaccess.exe 上的 /nostartup 开关

所以你必须使用shell命令来获取访问对象

我有一个打开数据库并返回对象的函数(这是您必须转换为 C# 的 VBA 代码)

Private Function OpenDatabaseWithShell(pDatabaseFullPath As String) As Access.Application

Dim AccObj As Access.Application

    On Error GoTo ErrorHandler

    Set OpenDatabaseWithShell = Nothing

    Dim cmd As String

    On Error Resume Next

    ' basically build full msaccess.exe path and append database name and command switches
    cmd = SysCmd(acSysCmdAccessDir) & "MSAccess.exe """ & psDatabaseFullPath & """"
    cmd = cmd & " /nostartup /excl"

    'start ms access with shell
    Shell PathName:=cmd

    Do 'Wait for shelled process to finish.
      Err = 0
      Set AccObj = GetObject(pDatabaseFullPath)
    Loop While Err <> 0

    On Error GoTo ErrorHandler

    'return access object
    Set OpenDatabaseWithShell = AccObj

NormalExit:
    Exit Function

ErrorHandler:
    'error logging here
    Exit Function

End Function

编辑: 这是一些 VB.NET 代码的link,它做类似的事情。向下滚动到“创建完整的示例 Visual Basic .NET 项目”并查找“ShellGetDB”函数

【讨论】:

以上是关于使用 OLE 时如何绕过 MS Access 启动?的主要内容,如果未能解决你的问题,请参考以下文章

如何绕过MS Access列号限制:定义的字段太多

在 Visual Studio C# 中从 MS Access 数据库中获取 OLE(位图)对象,我的代码有啥问题?

防止用户绕过 MS Access 上的登录表单

使用表单在 MS Access 数据库中存储 PDF

如何在打开 MS Access DB 时禁用宏和启动值

如何在 SQL Server 中存储图片(MS Access 界面)