Как вы экспортируете объекты запроса 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

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

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

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

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

введите описание изображения здесь

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


person MichaelTaylor3D    schedule 27.11.2013    source источник
comment
У меня нет этой проблемы с Access 2007 или 2010. Использование SaveAsText acQuery дает мне определение запроса ... которое включает в себя свойство SQL и различные другие атрибуты, хранящиеся в Access, в определении. Но SaveAsText определенно не дает мне данных, которые возвращает выполнение запроса. Кажется странным добавить к 2013 году. :-(   -  person HansUp    schedule 28.11.2013
comment
какое значение вы используете для acQuery? Я устанавливаю acForm = 2, acModule = 5, acMacro = 4, acReport = 3 и acQuery = 6   -  person MichaelTaylor3D    schedule 28.11.2013
comment
который включает свойство SQL и различные другие атрибуты. Доступ хранит в определении maby im не возвращает свойство SQL в виде обычного текста, и с ним связаны другие данные? (Возвращенный текстовый файл на самом деле был очень большим двоичным зашифрованным файлом, который я предположил как результат запроса)   -  person MichaelTaylor3D    schedule 28.11.2013
comment
Я сделал это из Access VBA. acQuery равно 1. См. AcObjectType Enumeration. Ни одна из этих констант не имеет значения 6.   -  person HansUp    schedule 28.11.2013
comment
великий я искал этот лист перечисления   -  person MichaelTaylor3D    schedule 28.11.2013
comment
Ваш ответ был правильным, если вы поместите его в качестве ответа, я не приму его. Просто не забудьте упомянуть, что моя константа acQuery была отключена, чтобы у других людей, которые это читали, был некоторый контекст.   -  person MichaelTaylor3D    schedule 28.11.2013
comment
Используйте обозреватель объектов в IDE редактора Access VB. Я просто искал там acQuery. Затем поискал имя перечисления, чтобы найти вам эту веб-ссылку.   -  person HansUp    schedule 28.11.2013


Ответы (3)


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

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

person HansUp    schedule 27.11.2013
comment
Я нашел ваш пост, пытаясь понять, что означает 6. Я нашел его в надстройке служебной программы с небольшими комментариями. Кажется, создается копия файла базы данных, который включает таблицы. Нас не должно удивлять, что недокументированная команда принимает некоторые недокументированные параметры. - person Ben; 06.06.2019

Итерации по 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
person Steve Salowitz    schedule 27.11.2013

Как насчет этого (требуется отметка «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
person Chris Rolliston    schedule 27.11.2013
comment
что вы имеете в виду, требует проверки «Microsoft Scripting Runtime» в разделе «Инструменты | Ссылки в VBA». Я действительно запускаю этот скрипт в оболочке с помощью cscript. Он основан на следующем ответе: stackoverflow.com/questions/187506/ - person MichaelTaylor3D; 28.11.2013