Access 2013, ошибка 2128 во время LoadfromText для форм - PullRequest
0 голосов
/ 11 июля 2019

Я использую код от здесь . С некоторыми незначительными изменениями. Это нормально работает в Access 2016, но вызывает ошибку во время импорта с Access 2013, который будет использоваться в. В идеале база данных должна работать с 2010 и 2013 годами.

Я создал виртуальную машину с Access 2013 (32 бита). Я запустил декомпозицию и составил код с модификациями и без них и получил ту же ошибку. Я также изменил тип файла с mdb на accdb, так как это было причиной сбоя в Access 2013.

Я пытался сохранить версию 2016 года в 2003 мдб. Запустил импорт / экспорт для этого, и он не работал вообще. Затем открыл mdb в Access 2013 и сохранил его как accdb, и он вернулся с той же ошибкой 2128.

Вот текущая версия кода экспорта / декомпозиции. Целью было удалить строки, которые не совместимы с 2016 по 2013 год.

Option Explicit

const acForm = 2
const acModule = 5
const acMacro = 4
const acReport = 3
Const acQuery = 1
Const acExportTable = 0

' BEGIN CODE
Dim fso, relDoc
Dim sExportpath
Dim sExpModules
dim sADPFilename
Set fso = CreateObject("Scripting.FileSystemObject")
Set relDoc = CreateObject("Microsoft.XMLDOM")


If (WScript.Arguments.Count = 0) then
    MsgBox "Please supply an Access DB Name!", vbExclamation, "Error"
    Wscript.Quit()
End if
sADPFilename = fso.GetAbsolutePathName(WScript.Arguments(0))

If (WScript.Arguments.Count > 1) then
  sExpModules = WScript.Arguments(1)
  If Ucase(sExpModules) = "ALL" then
    sExpModules = ""

  End If
Else 
  sExpModules = ""
End If

sExportpath = ""

exportModulesTxt sADPFilename, UCase(sExpModules)

If (Err <> 0) and (Err.Description <> NULL) Then
    MsgBox Err.Description, vbExclamation, "Error"
    Err.Clear
End If

Function exportModulesTxt(sADPFilename, sExpModules)
    Dim myComponent
    Dim sModuleType
    Dim sTempname
    Dim sOutstring
    dim myType, myName, myPath, sStubADPFilename

    myType = fso.GetExtensionName(sADPFilename)
    myName = fso.GetBaseName(sADPFilename)
    myPath = fso.GetParentFolderName(sADPFilename)

    sExportpath = myPath & "\Source\"
    sStubADPFilename = sExportpath & myName & "_stub." & myType

    WScript.Echo "copy stub to " & sStubADPFilename & "..."
    On Error Resume Next
        fso.CreateFolder(sExportpath)
    On Error Goto 0
    fso.CopyFile sADPFilename, sStubADPFilename

    WScript.Echo "starting Access..."
    Dim oApplication
    Set oApplication = CreateObject("Access.Application")
    WScript.Echo "opening " & sStubADPFilename & " ..."
    If (Right(sStubADPFilename,4) = ".adp") Then
        oApplication.OpenAccessProject sStubADPFilename
    Else
        oApplication.OpenCurrentDatabase sStubADPFilename
    End If

    oApplication.Visible = false

    WScript.Echo "exporting..."
    Dim myObj

    For Each myObj In oApplication.CurrentProject.AllForms
            If sExpModules = "" or instr(sExpModules, Ucase(myObj.fullname)) > 0 then
                WScript.Echo "  " & myObj.fullname
                oApplication.SaveAsText acForm, myObj.fullname, sExportpath & "\" & myObj.fullname & ".form"
                oApplication.DoCmd.Close acForm, myObj.fullname
            End if
    Next

        'sanitize forms since they contain version stuff that could break on import
        SanitizeTextFiles sExportpath, "form"

    For Each myObj In oApplication.CurrentProject.AllModules
            If sExpModules = "" or instr(sExpModules, Ucase(myObj.fullname)) > 0 then
                WScript.Echo "  " & myObj.fullname
                oApplication.SaveAsText acModule, myObj.fullname, sExportpath & "\" & myObj.fullname & ".base"
            End if
    Next
    For Each myObj In oApplication.CurrentProject.AllMacros
            If sExpModules = "" or instr(sExpModules, Ucase(myObj.fullname)) > 0 then
                WScript.Echo "  " & myObj.fullname
                oApplication.SaveAsText acMacro, myObj.fullname, sExportpath & "\" & myObj.fullname & ".mac"
            End if
    Next
    For Each myObj In oApplication.CurrentProject.AllReports
            If sExpModules = "" or instr(sExpModules, Ucase(myObj.fullname)) > 0 then
                WScript.Echo "  " & myObj.fullname
                oApplication.SaveAsText acReport, myObj.fullname, sExportpath & "\" & myObj.fullname & ".report"
            End if
    Next
    For Each myObj In oApplication.CurrentDb.QueryDefs
            If sExpModules = "" or instr(sExpModules, Ucase(myObj.name)) > 0 then
                Wscript.Echo "Exporting QUERY " & myObj.Name
                oApplication.SaveAsText acQuery, myObj.Name, sExportpath & "\" & myObj.Name & ".query.txt"
            End if
    Next

    WScript.Echo "compacting and overwriting stub ..."
    oApplication.CloseCurrentDatabase
    'oApplication.CompactRepair sStubADPFilename, sStubADPFilename & "_"
    oApplication.Quit

    fso.DeleteFile sStubADPFilename
    WScript.Echo "Deleted StubFile"

    'fso.CopyFile sStubADPFilename & "_", sStubADPFilename
    'fso.DeleteFile sStubADPFilename & "_"


End Function

Sub SanitizeTextFiles(sImportpath, Ext)
    Dim fso, InFile, OutFile, FileName, txt, obj_name, folder
  Dim objectname, objecttype
    Dim oldFileAndPath

    Set fso = CreateObject("Scripting.FileSystemObject")

    Set folder = fso.GetFolder(sImportpath)
    oldFileAndPath = ""

    for each FileName in folder.Files

      if oldFileAndPath > "" then
            fso.Deletefile oldFileAndPath
            fso.MoveFile oldFileAndPath & ".san", oldFileAndPath
            oldFileAndPath = ""
        end if

        objecttype = fso.GetExtensionName(FileName.Name)
        objectname = fso.GetBaseName(FileName.Name)

        if objecttype = "form" then 
          oldFileAndPath = sImportpath & Filename.name
            Set InFile = fso.OpenTextFile(sImportpath & Filename.name, 1, false, -1)
            Set OutFile = fso.CreateTextFile(sImportpath & Filename.name & ".san", True, True)

            Do Until InFile.AtEndOfStream
                txt = InFile.ReadLine
                If Left(txt, 10) = "Checksum =" Then
                    ' Skip lines starting with Checksum
                ElseIf InStr(txt, "NoSaveCTIWhenDisabled =1") Then
                    ' Skip lines containning NoSaveCTIWhenDisabled
                ElseIf InStr(txt, "Begin") > 0 Then
                    If _
                        InStr(txt, "PrtDevNames =") > 0 Or _
                        InStr(txt, "PrtDevNamesW =") > 0 Or _
                        InStr(txt, "PrtDevModeW =") > 0 Or _
                        InStr(txt, "PrtDevMode =") > 0 _
                        Then

                        ' skip this block of code
                        Do Until InFile.AtEndOfStream
                            txt = InFile.ReadLine
                            If InStr(txt, "End") Then Exit Do
                        Loop
                    Else                       ' This line needs to be added
                        OutFile.WriteLine txt
                    End If                     ' This line needs to be added
                Else
                    OutFile.WriteLine txt
                End If
            Loop
            OutFile.Close
            InFile.Close
        else
          oldFileandPath = ""
        end if
    next

    if oldFileAndPath > "" then
            fso.Deletefile oldFileAndPath
            fso.MoveFile oldFileAndPath & ".san", oldFileAndPath
    end if

End Sub

Я получаю код ошибки 2128. Вместе с текстовым файлом, содержащим:

База данных обнаружила ошибку при импорте объекта
'Form1'.

Ошибка в строке 1. Этот объект был создан с более новой версией базы данных чем вы работаете в настоящее время.

Ответы [ 3 ]

1 голос
/ 19 июля 2019

Попробуйте удалить строки

Version =19
VersionRequired =19
Checksum =-1389803315

Из текстового файла до LoadFromText.

1 голос
/ 11 июля 2019

В идеале база данных должна работать с 2010 и 2013 годами.

Затем вам придется разрабатывать в Access 2010, самой ранней версии.Другого метода нет.

0 голосов
/ 19 июля 2019

Итак, у меня есть решение.

Для управления исходным кодом продолжайте использовать код декомпозиции и компоновки.Поскольку среда разработки 2016 года.

Чтобы отправить обновления в производственную среду, в Access 2010/2013 выполните следующие действия: Для развертывания разделите базу данных на внешний / внутренний интерфейсы для разработчиков и разработчиков.Затем для будущих обновлений отправьте новый интерфейс от Dev до Prod.Затем следует перекомпоновка таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...