2009-05-13 2 views
2

Я пытаюсь загрузить из текстовых файлов, запросов в коллекцию запросов MS Access с помощью VBScript. Я использую что-то вроде этого: Код зарождается от Here.Альтернатива Application.LoadFromText для запросов MS Access

for each myFile in folder.Files 
    objecttype = fso.GetExtensionName(myFile.Name) 
    objectname = fso.GetBaseName(myFile.Name) 
    WScript.Echo " " & objectname & " (" & objecttype & ")" 

    if (objecttype = "form") then 
     oApplication.LoadFromText acForm, objectname, myFile.Path 
    elseif (objecttype = "bas") then 
     oApplication.LoadFromText acModule, objectname, myFile.Path 
    elseif (objecttype = "mac") then 
     oApplication.LoadFromText acMacro, objectname, myFile.Path 
    elseif (objecttype = "report") then 
     oApplication.LoadFromText acReport, objectname, myFile.Path 
    elseif (objecttype = "sql") then 
     'oApplication.LoadFromText acQuery, objectname, myFile.Path 
     ' Add create querydef code here 
    end if 

next 

Но я не уверен, как создать определение запроса с помощью VBScript.

Любые идеи?

Примечание: я первоначально вывезенных в файл, используя что-то вроде этого:

For Each myObj In oApplication.CurrentDb.QueryDefs 
    Set f = fso.CreateTextFile(sExportpath & "\" & myObj.Name & ".sql", True) 
    f.WriteLine(myObj.SQL) 
    f.Close 
Next 

ответ

4

Это экономит Defs запрос,

For i = 0 To db.QueryDefs.Count - 1 
    Application.SaveAsText acQuery, db.QueryDefs(i).Name, sExportpath & "\" & db.QueryDefs(i).Name & ".sql" 
Next i 

Тогда LoadFromText должен работать

+2

Const acQuery = 1 –

+1

Хотя редко, когда у вас есть запрос, который имеет подзапрос в качестве входной таблицы , LoadFromText будет работать, но создаст поврежденный запрос. Внутри экспортированного txt-файла запроса будет раздел с «Begin InputTables», а значение «Name» таблицы будет вашим SQL-подзапросом. После импорта доступ интерпретирует это имя как имя запроса. Обходной путь заключается в анализе файла экспорта запроса, поиске подзапросов и «распаковывании» их во время процесса экспорта. Я столкнулся с этим, потому что мне пришлось написать процедуру автоматического исправления, которая очищала поврежденные двоичные блоки из объектов Access. – DHW

3

Просто для полноты I хотел добавить мое решение.

if (objecttype = "form") then 
    oApplication.LoadFromText acForm, objectname, myFile.Path 
elseif (objecttype = "bas") then 
    oApplication.LoadFromText acModule, objectname, myFile.Path 
elseif (objecttype = "mac") then 
    oApplication.LoadFromText acMacro, objectname, myFile.Path 
elseif (objecttype = "report") then 
    oApplication.LoadFromText acReport, objectname, myFile.Path 
elseif (objecttype = "sql") then 
    oApplication.LoadFromText acQuery, objectname, myFile.Path 
end if 

Видимо все, что нужно быть прибавляли:

Const acQuery = 1 

Благодаря DJ