Как экспортировать объекты запроса MS Access в текстовый файл

В MS Access мне нужно выполнить резервное копирование всех запросов в текстовый файл

Я могу сделать это с другими объектами Access, например, следующий пример - это резервная копия всех отчетов в текстовый файл

Dim oApplication
Set oApplication = CreateObject("Access.Application")

For Each myObj In oApplication.CurrentProject.AllReports
        WScript.Echo "Report  " & myObj.fullname
        oApplication.SaveAsText acReport, myObj.fullname, sExportpath & "\" & myObj.fullname & ".report"
Next

Ive попробовал следующее для резервного копирования всех запросов

For Each myObj In oApplication.CurrentData.AllQueries
    WScript.Echo "Query  " & myObj.fullname
    oApplication.SaveAsText acQuery, myObj.Name, sExportpath & "\" & myObj.Name & ".query"
Next

Однако полученный текстовый файл является результатом запроса. Это определенно не определение запроса, которое я ищу.

Чтобы быть ясным, это изображение того, что Im пытается экспортировать в текст

enter image description here

Есть ли у кого-нибудь идеи о том, как это можно сделать?

Ответ 1

Значение константы acQuery равно 1. (Перечисление AcObjectType)

Возможно, ваши результаты связаны с тем, что код использует 6 вместо 1. Я не знаю, что должно произойти в этой ситуации, потому что ни одна из констант AcObjectType не имеет значения 6. Используя Access VBA, когда я попробовал SaveAsText с 6, произошло что-то странное: выходной файл был создан, но Windows запретила мне просматривать его содержимое; вскоре появилось диалоговое окно, похожее на то, что Access искал что-то на SQL Server... хотя определение запроса, которое я сохранял, не связано с SQL Server. Странные вещи!

Ответ 2

Итерация через QueryDefs должна работать для вас

Dim def As DAO.QueryDef
Dim defCol As DAO.QueryDefs

Set defCol = CurrentDb.QueryDefs

For Each def In defCol
    Debug.Print def.SQL
Next

Ответ 3

Как насчет этого (требуется "Microsoft Scripting Runtime" в разделе "Инструменты | Ссылки в редакторе VBA" ):

Dim Def As DAO.QueryDef
Def FSO As New Scripting.FileSystemObject, Stream As Scripting.TextStream
For Each Def In CurrentDb.QueryDefs
  Set Stream = FSO.CreateTextFile(sExportpath & "\" & Def.Name & ".query")
  Stream.Write(Def.SQL)
  Stream.Close
Next

В качестве альтернативы, если вы используете VBScript:

Dim Def, FSO, Stream
Set FSO = CreateObject("Scripting.FileSystemObject")
For Each Def In oApplication.CurrentDb.QueryDefs
  Set Stream = FSO.CreateTextFile(sExportpath & "\" & Def.Name & ".query")
  Stream.Write(Def.SQL)
  Stream.Close
Next