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