MS Access зависает после импорта текста - PullRequest
1 голос
/ 07 августа 2009

У меня есть следующий код для импорта файла с разделителями в базу данных Access 2003:

Public Function importTextFile(sFile As String,  _
                                sTable As String, _
                                sSpecification As String)
On Error GoTo importTextFile_EH

' Validate arguments to see if the objects exist; if not, give a message 
' and exit
If Not FileExists(sFile) Then
    MsgBox "File " & sFile & " does not exist; import terminated.",  _
                                vbCritical + vbOKOnly,  _
                                "Error"
    Exit Function
End If

If Not TableExists(sTable) Then
    MsgBox "Table " & sTable & " does not exist; import terminated.",  _
                                vbCritical + vbOKOnly,  _
                                "Error"
    Exit Function
End If

If Not SpecExists(sSpecification) Then
    MsgBox "Import Specification " & sSpecification &  _
                                " does not exist; import terminated.",  _
                                vbCritical + vbOKOnly,  _
                                "Error"
    Exit Function
End If

' Display a warning to let the user cancel if this is run by mistake.
If vbYes = MsgBox("WARNING: This will delete all data currently in " &  _
                                sTable & "; do you wish to continue?",  _
                                vbExclamation + vbYesNo,  _
                                "Import Text File") Then
    DoCmd.Hourglass Yes

    ' Cleardown the data in the table.
    DoCmd.Echo Yes, "Deleting data in " & sTable & " table..."
    DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE " & sTable & ".* FROM " & sTable & ";"
    DoCmd.SetWarnings True

    ' Import the text file into the table. 
    DoCmd.TransferText acImportDelim, sSpecification, sTable, sFile

    DoCmd.Echo Yes, "Import complete"
    DoCmd.Hourglass No
Else
    DoCmd.Echo Yes, "Import cancelled."
End If
Exit Function

importTextFile_EH:
    Debug.Print Err.Number & "-" & Err.Description

End Function

Я могу вызвать эту функцию из макроса, используя RunCode с аргументом Function Name, оцененным как

importTextFile (Application.CurrentProject.Path & "\" &  _
                                "batch_results.txt",  _
                                "BatchEngineResults", _
                                "specResults") 

и работает нормально. Я также могу вызвать его из окна Immediate, и оно работает без проблем.

Однако, если я вызываю функцию из формы (из события Click командной кнопки), то Access зависает. Похоже, что импорт завершен (индикатор выполнения импорта в строке состояния окна базы данных Access показывает, запущен и завершен импорт), но затем Access перестает отвечать как на форму, так и на окно базы данных Access. Диспетчер задач не указывает, что Access завис (состояние задачи «Выполнено»), и я могу закрыть Access с помощью кнопки «Закрыть» в строке заголовка. Когда я снова открываю базу данных, моя таблица содержит все данные из текстового файла, поэтому импорт работает.

Я также пытался вызвать макрос из формы, но получил те же результаты.

У кого-нибудь есть идеи?

ОБНОВЛЕНИЕ: Я попытался позвонить в MsgBox после вызова функции:

importTextFile (Application.CurrentProject.Path & "\" &  _
                                "batch_results.txt",  _
                                "BatchEngineResults",  _
                                "specResults") 
MsgBox "After Import"

Появляется окно сообщения, и оно реагирует. Когда я отклоняю его, Access зависает, как и раньше. Как вы думаете, это означает, что у меня может быть проблема где-то еще с формой, а не с этой функцией?

Ответы [ 2 ]

1 голос
/ 08 августа 2009

У вас есть Да и Нет после DoCmd. [ что-то ], где вы должны иметь True и False. В дополнение к их изменению, рассмотрите возможность добавления Option Explicit в начале вашего модуля.

Я думаю, что Да обрабатывается как пустая переменная, поэтому при оценке в логическом контексте имеет тот же результат, что и Ложь. Например, следующий код (без Option Explicit) напечатает False в Immediate Window:

Public Sub evaluateYes()
    If Yes Then
        Debug.Print "True"
    Else
        Debug.Print "False"
    End If
End Sub

При использовании опции Explicit Access получит сообщение об ошибке компиляции «Переменная не определена» и выделит слово «Да».

Обновление : попробуйте закомментировать ваши заявления DoCmd.Echo. Access по-прежнему зависает, когда ваш код не вызывает DoCmd.Echo?

В ответ на ваш комментарий я понятия не имею, почему ваш код работает при вызове из макроса или из непосредственного окна, но не при вызове из нажатия кнопки на форме.

1 голос
/ 07 августа 2009

Тестируете ли вы это, если для параметра Обработка ошибок установлено значение «Разорвать все ошибки»? Убедитесь, что вы есть. Ваша обработка ошибок может быть улучшена - нет инструкции для выхода при возникновении ошибки. Полагаю, в этом нет необходимости, но это ваша возможность убраться.

Мне интересно, есть ли у вас эхо-сигнал? Когда он кажется замороженным, попробуйте ввести «Application.Echo True» в окне «Немедленно».

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