Как обойти запуск MS Access при использовании OLE? - PullRequest
1 голос
/ 14 января 2009

Я пытаюсь сделать автоматический экспорт xml из базы данных доступа, используя C # и OLE. Все работает отлично, за исключением того, что форма запуска отображается и не закрывается без вмешательства пользователя.

Вот что я делаю до сих пор:

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();

Ответы [ 2 ]

3 голосов
/ 14 января 2009

Не нужно открывать 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
0 голосов
/ 14 января 2009

Насколько я знаю, единственный способ - использовать ключ / nostartup на msaccess.exe

Таким образом, вы должны использовать команду оболочки, чтобы получить объект доступа

У меня есть функция, которая открывает базу данных и возвращает объект (это код VBA, который вам нужно будет преобразовать в C #)

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

EDIT: Вот ссылка на некоторый код VB.NET, который делает подобное. Прокрутите вниз до «Создание полного примера проекта Visual Basic .NET» и найдите функцию «ShellGetDB»

...