Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / запись кода ошибки БД в таблицу / 22 сообщений из 22, страница 1 из 1
15.03.2016, 09:35
    #39191923
jediAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
Здравствуйте. Есть БД SQL server+Access 2013. К БД обращаются примерно 150 пользователей. на компьютерах пользователей установлен не полный аксесс, а Runtime. При работе периодически возникают ошибки - иногда даже при запуске приложения. При этом Runtime закрывается с критической ошибкой. Можно ли записать в отдельную таблицу код и описание ошибки при её возникновении чтобы при необходимости выгрузить записи и посмотреть, что у кого произошло? как это можно сделать? В БД я сделал отдельную таблицу для этих записей: Ошибки(КодЗаписи, КодОшибки, дата, пользователь). Помогите пожалуйста.
...
Рейтинг: 0 / 0
15.03.2016, 09:39
    #39191926
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
jediAlexпри запуске приложения... закрывается с критической ошибкой.
Можно ли программой записать данные в БД, если программа не запустилась? сам-то как думаешь...
...
Рейтинг: 0 / 0
15.03.2016, 09:53
    #39191933
jediAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
AkinajediAlexпри запуске приложения... закрывается с критической ошибкой.
Можно ли программой записать данные в БД, если программа не запустилась? сам-то как думаешь...
ну есть способ вытащить код ошибки? например в файл?
...
Рейтинг: 0 / 0
15.03.2016, 10:01
    #39191938
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
jediAlexесть способ вытащить код ошибки? например в файл?
Конечно... открываешь журнал событий (разделы Система и Приложение) и сохраняешь в файл...
...
Рейтинг: 0 / 0
15.03.2016, 10:07
    #39191941
jediAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
юзеры в журнал событий не полезут...они не знают вообще что это
...
Рейтинг: 0 / 0
15.03.2016, 10:14
    #39191946
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
jediAlexюзеры в журнал событий не полезут...они не знают вообще что это
Дык и не надо.
Ставте обработчики ошибок.
Попытайтесь локализовать ошибку.
...
Рейтинг: 0 / 0
15.03.2016, 11:04
    #39192003
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
Само собой нужна обработка ошибок, причем для точной локализации проблемы строки нужно пронумеровать, а в записи об ошибке или просто в сообщении пользователю выводить номер строки, где произошла ошибка. Нумеровать строки умеет, например, MZ-Tools. Он же и вставляет обработчики по нажатию кнопки.

Я, например, использую обработчики такого типа:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Private Sub Command2_Click()

10    On Error GoTo ErrorHandler

20    DoCmd.Close

ExitHere:
30       On Error Resume Next
40       Exit Sub

ErrorHandler:
50    Select Case Err
      Case 0
60       Resume Next
70    Case Else
80       MsgBox "Error " & Err.Number & " (" & Err.Description & "), Line " & Erl & " in procedure Command2_Click of Form_Form1", vbExclamation + vbMsgBoxHelpButton, "Error " & Now(), Err.HelpFile, Err.HelpContext
90       Resume ExitHere
100   End Select
End Sub


Есть варианты, где вместо сообщения вызывается процедура, которая пишет ошибку в таблицу и отсылает сообщение с деталями на почту.
...
Рейтинг: 0 / 0
15.03.2016, 11:08
    #39192011
jediAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
а метод WriteErrorToTable объекта Err? как правильно использовать этот метод?
...
Рейтинг: 0 / 0
15.03.2016, 11:20
    #39192022
jediAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
так вот что за таблица должна быть? её самому создавать? какая структура этой таблицы должна быть? Как записать информацию об ошибке в таблицу? метод записи в общем я наверное нашел, но как им пользоваться...
...
Рейтинг: 0 / 0
15.03.2016, 11:34
    #39192046
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
MrShinЕсть варианты, где вместо сообщения вызывается процедура, которая пишет ошибку в таблицу и отсылает сообщение с деталями на почту.Ага, из обработчика ошибок... что такое double fault - знаешь?
...
Рейтинг: 0 / 0
15.03.2016, 12:38
    #39192164
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
AkinaMrShinЕсть варианты, где вместо сообщения вызывается процедура, которая пишет ошибку в таблицу и отсылает сообщение с деталями на почту.Ага, из обработчика ошибок... что такое double fault - знаешь?
Предусмотрено там это. В случае ошибки внутри обработчика ошибки выдается сообщение о совсем непредвиденной ошибке с текстами обеих ошибок :)
...
Рейтинг: 0 / 0
15.03.2016, 12:42
    #39192173
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
jediAlexа метод WriteErrorToTable объекта Err?

У объекта Err нет такого метода, насколько мне известно.
...
Рейтинг: 0 / 0
21.03.2016, 14:12
    #39197149
jediAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
написал функцию для записи ошибки в таблицу:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Function Err_Routine()
On Error GoTo Err_Routine
Err_Routine:
Set rst = CurrentDb.OpenRecordset("ErrorsDatabase")
With rst
.AddNew
!НомерОшибки = Str(Err.Number)
!Описание = Err.Description
!Пользователь = CurrentUser
!Дата = Date
!Время = Time
.Update
End With
Set rst = Nothing
Exit_err_routine:
Exit Function

End Function


эту функцию поместил в общий модуль и вызываю её макросом при открытии БД(т.к. чаще всего ошибки при открытии происходят). При открытии БД срабатывает макрос, который запускает форму-навигатор по приложению. я изменил имя формы и получил ошибку при запуске БД.При этом моя функция сработала, но не записывается в таблицу код ошибки и описание ошибки(Description). В таблицу ошибок я добавил поле "Описание" с типом данных "Длинный текст", куда надо записывать Description ошибки. Полю "НомерОшибки" присваивается ноль, а описание ошибки пустое. имя пользователя, дата и время заполняются. Что не так?
...
Рейтинг: 0 / 0
21.03.2016, 14:44
    #39197190
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
jediAlex,
вы куда идете по переходу
не перепутали ли вы метки
да и запонить надо текущую ошибку
Код: vbnet
1.
2.
On Error GoTo Err_Routine
Err_Routine:



уберите On Error GoTo Err_Routine для отладки
...
Рейтинг: 0 / 0
21.03.2016, 14:55
    #39197205
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
Объект Err сбрасывается у вас после первой же команды по открытию рекордсета. Сначала запомните текущие значения, а потом все остальное. Да и выносить нужно запись ошибки в отдельную процедуру со своим обработчиком ошибок, а туда передавать только номер ошибки, описание, название процедуры, модуля и номер линии.
...
Рейтинг: 0 / 0
21.03.2016, 15:42
    #39197255
jediAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
попробовал так - перед открытием рекордсета запомнить значения:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Function Err_Routine()
Dim NumberError As Long
Dim decrError As String
On Error GoTo Err_Routine
NumberError = Err.Number
decrError = Err.Description
Err_Routine:
Set rst = CurrentDb.OpenRecordset("ErrorsDatabase")
With rst
.AddNew
!НомерОшибки = NumberError
!Описание = decrError
!Пользователь = CurrentUser
!Дата = Date
!Время = Time
.Update
End With
Set rst = Nothing
Exit_err_routine:
Exit Function

End Function


результат тот же...
...
Рейтинг: 0 / 0
21.03.2016, 15:50
    #39197262
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
jediAlexрезультат тот же...

Конечно! Команда
On Error GoTo Err_Routine
также сбрасывает объект Err.
...
Рейтинг: 0 / 0
21.03.2016, 16:01
    #39197274
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
Должно быть примерно так:

Объявляем обработчик в процедуре

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Public Function MyFunction()

On Error GoTo ErrorHandler

'.... тут мы что-то делаем, что может сгенерировать ошибку

ExitHere:
    On Error Resume Next
    ' тут мы закрываем открытые объекты и делаем прочие завершающие вещи
    Exit Function

ErrorHandler:
    ' вызываем собственно обработчик с записью ошибок
    LogError Err.Number, Err.Description, Erl, "MyFunction", "bas_MyModule"
    Resume ExitHere
End Function



А в обработчике уже пишем данные и выводим сообщение. Вот мой обработчик, берите, если хотите. Чтобы номер строки был не нулевым, строки основного кода должны быть пронумерованы.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
Function LogError(ByVal lngErrNumber As Long, ByVal strErrDescription As String, strLine As String, _
                  strCallingProc As String, Optional strCallingModule As String, Optional vParameters = "{Missing}", Optional bShowUser As Boolean = True) As Boolean
    On Error GoTo Err_LogError
    ' Purpose: Generic error handler.
    ' Logs errors to table "ErrorLog".
    ' Arguments: lngErrNumber - value of Err.Number
    ' strErrDescription - value of err.description
    ' strLine - code line number (Erl) Erl=0 if no row number in the line
    ' strCallingProc - name of sub|function that generated the error.
    ' strCallingModule - name of code module that generated the error.
    ' vParameters - optional string: List of parameters to record.
    ' bShowUser - optional boolean: If False, suppresses display.
    Dim strMsg As String                              ' String for display in MsgBox
    Dim rst    As DAO.Recordset                       ' The Aph_tblErrorLog table
    Select Case lngErrNumber
        Case 0
            Debug.Print strCallingProc & " called error 0."
        Case 2501                                     ' Cancelled
            'Do nothing.
        Case Else
            If bShowUser Then
                strMsg = "Error " & lngErrNumber & " (" & strErrDescription & "), Line " & strLine & " in procedure " & _
                strCallingProc & ", module " & strCallingModule
                MsgBox strMsg, vbExclamation, "Error " & Now()
            End If
            Set rst = CurrentDb.OpenRecordset("tbl_ErrorLog", , dbAppendOnly)
            rst.AddNew
            rst![ErrorNumber] = lngErrNumber
            rst![ErrorDescription] = Left$(strErrDescription, 255)
            rst![CreatedTimeStamp] = Now()
            rst![ErrLine] = strLine
            rst![CallingProc] = strCallingProc
            rst![Module] = strCallingModule
            rst![UserName] = GetOSUserName()
            rst![PersonID] = 1
            rst![ShowUser] = bShowUser
            If vParameters <> "{Missing}" Then
                rst![Parameters] = Left(vParameters, 255)
            End If
            rst.Update
            rst.Close
            LogError = True
            
    End Select
    
Exit_LogError:
    Set rst = Nothing
    Exit Function
Err_LogError:
    strMsg = "An unexpected situation arose in your program." & vbCrLf & _
             "Please write down the following details:" & vbCrLf & vbCrLf & _
             "Calling Proc: " & strCallingProc & vbCrLf & _
             "Error Number " & lngErrNumber & " in line " & strLine & vbCrLf & strErrDescription & vbCrLf & vbCrLf & _
             "Unable to record because Error " & Err.Number & " in line " & Erl & vbCrLf & Err.Description
    MsgBox strMsg, vbCritical, "LogError()"
    Resume Exit_LogError
End Function

...
Рейтинг: 0 / 0
22.03.2016, 08:44
    #39197627
jediAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
можно ли программно записать ошибку DSN при подключении к БД на сервере? если можно, как это сделать?
...
Рейтинг: 0 / 0
24.03.2016, 10:28
    #39199338
jediAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
сделал так:
при загрузке главной формы срабатывает обработчик:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Sub Form_Load()

On Error GoTo ErrorHandler

DoCmd.SetWarnings False
DoCmd.OpenQuery "ОтчетыДляУдаления", acViewNormal, acEdit
DoCmd.SetWarnings True
ExitHere:
   On Error Resume Next
       Exit Sub
    
ErrorHandler:
    
    Err_Routine Err.Number, Err.Description, "FormsModule"
    Resume ExitHere
End Sub


Err_Routine - функция в общем модуле "FormsModule" ,которая записывает содержание ошибки в таблицу базы данных. Текст функции:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Function Err_Routine()
Dim NumberError As Long
Dim decrError As String
NumberError = Err.Number
decrError = Err.Description
GoTo Err_Routine
Err_Routine:
Set rst = CurrentDb.OpenRecordset("ErrorsDatabase")
With rst
.AddNew
!НомерОшибки = NumberError
!Описание = decrError
!Пользователь = Environ("username")
!ИмяКомпьютера = Environ("Computername")
!Дата = Date
!Время = Time()
.Update
End With
Set rst = Nothing
Exit_err_routine:
Exit Function
End Function


При запуске БД обработчик и функция срабатывают как надо - содержимое ошибки, имя пользователя, имя компьютера, дата и время записываются в таблицу, но на строке
Код: vbnet
1.
Err_Routine Err.Number, Err.Description, Erl, "Form_Load", "FormsModule"

вылетает ошибка "13 type mismatch"
что не так с типами и где? не пойму...
Структура таблицы для записи ошибок("ErrorsDatabase"): код -счетчик, ключ;НомерОшибки - целое;Описание - короткий текст;Пользователь - короткий текст;ИмяКомпьютера - короткий текст;Дата - дата и время(краткий формат даты);Время - дата и время(краткий формат времени).Помогите пожалуйста
...
Рейтинг: 0 / 0
24.03.2016, 11:49
    #39199438
\\\\
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
jediAlex,
Код: vbnet
1.
2.
Function Err_Routine( )
...


Код: vbnet
1.
Err_Routine Err.Number, Err.Description, Erl, "Form_Load", "FormsModule"

Эммм... Не понял. А где список имён и типов передаваемых параметров?
...
Рейтинг: 0 / 0
24.03.2016, 11:56
    #39199457
jediAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запись кода ошибки БД в таблицу
все, разобрался
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / запись кода ошибки БД в таблицу / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]