Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5127
Есть связка - проект ADP в Access 2003 и MS SQL 2000. Таблица заполняется через форму. Несколько полей не должны иметь значение NULL. Если перейти на другую запись не заполнив их, то выдается сообщение об ошибке (см. приложенный рисунок). Как перехватить это сообщение? Попытка применить в форме "условие на значение" и "сообщение об ошибке" для нужных полей не срабатывает.
Сделал поиск на форуме. Нашел ветки Как заменить сообщения об ошибках в проекте? и ADP. User-Friendly сообщения для Foreign Key Constraint'ов , сообщения об ошибках в ADP Использую событие формы
Private Sub Form_Error(DataErr As Integer, Response As Integer)
Отлавливаю значение DataErr (оно равно 515). Но как выловить сообщение, которое сервер пересылает на клиент (Access), что бы изъять из него имя поля? В семействе CurrentProject.Connection.Errors данный код ошибки, отсутствует.
И примечание. Даже два. В вышеуказанных топиках есть ссылки на сайт HIPROG.COM К сожалению в связи с переездом сайта ссылки ведут в пустоту. И второе. При создании базы SQL из Access в ней отсутствует таблица sysmessages

К сообщению приложен файл. Размер - 0Kb
18 апр 07, 17:39    [4038762]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
bILL HEAD
Guest
а внутри Private Sub Form_Error посмотреть в цикле всех мемберов коллекции CurrentProject.Connection.Errors ?
18 апр 07, 18:36    [4039179]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
bILL HEAD
Guest
типа так
Private Sub Form_Error(DataErr As Integer, Response As Integer)
Dim Err As ADODB.Error 
   For Each Err In CurrentProject.Connection.Errors
      Debug.Print Err.Description
   Next
   Response = acDataErrContinue
End Sub
насчет Response - не уверен в правильности
возможно как то по другому нужно отбить акцесовское сообщение об ошибке
18 апр 07, 18:46    [4039235]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5127
Да, я просматривал состав коллекции Errors. Правда другим методом, через окно Expression. Там нужного сообщения не было.
А Response я присваюваю 0. Тогда сообщение сервера не выводится.
18 апр 07, 18:50    [4039257]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
bILL HEAD
Guest
?acDataErrContinue
0
:)
18 апр 07, 18:54    [4039280]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
ByKiS
Member

Откуда:
Сообщений: 3760
А чем плох тригер (или CHECK) и RAISERROR? По мойму нормально...
Насчёт таблицы sysmessages - есть вьюшка sys.messages в master.
18 апр 07, 19:05    [4039348]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
bILL HEAD
Guest
515 - это нумерация ошибки на сервере
select description from sysmessages where error = 515
18 апр 07, 19:05    [4039349]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
bILL HEAD
Guest
сорри. так надо
select description from master.dbo.sysmessages where error=515

Cannot insert the value NULL into column '%.*ls', table '%.*ls'; column does not allow nulls. %ls fails.
но как получить имя поля - не знаю
18 апр 07, 19:08    [4039370]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5127
to ByKis

А зачем тригер? А? Только для отправки сообщений? В конструкторе выставляется запрешение нулевого значения для заданного поля. Заполнение таблицы идет через форму. Зачем триггер?

Вьюшку в мастере не нашел. Таблица sysmessage в мастере есть. Но я говорил о том, что в базе, созданной при помощи Access 2003 (в других не знаю) её нет. Кстати, ни у кого нет этой таблицы с русскими сообщениями?

to ILL HEAD

Что 515 - это номер ошибки - это я вычислил. А вот как перехватить сам текст сообщения? Из него я бы нужную инфу уж как нибудь выцарапал.
19 апр 07, 11:11    [4041018]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
ByKiS
Member

Откуда:
Сообщений: 3760
Joss
А зачем тригер? А? Только для отправки сообщений?
Да :)

Joss
Кстати, ни у кого нет этой таблицы с русскими сообщениями?
За стенкой на SQL видел ссылку где-то, поищи.

ЗЫ: У тебя случайно нет статьи про индексы?
19 апр 07, 11:16    [4041055]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
пдд
Guest
Joss
............. Таблица sysmessage в мастере есть. Но я говорил о том, что в базе, созданной при помощи Access 2003 (в других не знаю) её нет. ........

Так она в принципе только в базе master должна быть, насколько я понимаю.
19 апр 07, 11:43    [4041252]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5127
Ходил на форум по MS SQL.
Ссылку на таблицу с русскими сообщениями не нашел. Зато есть много рассуждений о том, что это делать не надо.

Может кто нибудь подскажет, как всё-таки выловить текст сообщения с SQL Servera?

==================================================================
А, ты, вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса?
19 апр 07, 16:19    [4043582]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
сочувствующий
Guest
вот этот пост не помог?
19 апр 07, 16:24    [4043612]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
ILL HEAD
Member [заблокирован]

Откуда:
Сообщений: 8498
как устроен адп в потрохах - не знаю
но если при возникновении ошибки (или до действий которые могут вызвать предполагаемую ошибку)
сделать тоже самое но через СВОЙ ado-recordset то ошибку перехватить можно
19 апр 07, 16:30    [4043662]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
ILL HEAD
Member [заблокирован]

Откуда:
Сообщений: 8498
ступил. масло масленное получается.
19 апр 07, 16:41    [4043752]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
ILL HEAD
Member [заблокирован]

Откуда:
Сообщений: 8498
получилось выдернуть имя поля из сообщения об ошибке
при выполнении обновления своим адо-рекордсетом
если номер ошибки err.number= -2147217900 то из err.description строковыми фукциями выдергиваю имя поля
19 апр 07, 17:01    [4043927]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
ILL HEAD
Member [заблокирован]

Откуда:
Сообщений: 8498
автор
если номер ошибки err.number= -2147217900
это в mdb

в адп err.number= -2147217873
если ничего не путаю конечно
19 апр 07, 17:07    [4043981]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
ILL HEAD
Member [заблокирован]

Откуда:
Сообщений: 8498
вот такой код (возможно это несерьезный подход)
Private Sub Form_Error(DataErr As Integer, Response As Integer)
Dim str As String
Dim adoRS As ADODB.Recordset

On Error GoTo errL
    If DataErr = 515 Then
        Set adoRS = New ADODB.Recordset
        adoRS.CursorLocation = adUseClient
        Set adoRS = Me.Recordset
        adoRS.Update
    End If
exL:
    Set adoRS = Nothing
    Exit Sub
errL:
    If Err.Number = -2147217873 Then
        str = Err.Description
        str = Mid(str, _
                InStr(str, "Cannot insert the value NULL into column ") + _
                Len("Cannot insert the value NULL into column ") + 1)
        str = Left(str, InStr(str, "'") - 1)
        MsgBox "Не введено значение в поле [" & str & "] таблицы"
        Response = acDataErrContinue
    End If
GoTo exL

End Sub
но дает то что нужно
19 апр 07, 17:35    [4044175]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
ByKiS
Member

Откуда:
Сообщений: 3760
-2147217873
А как со всем остальным? Как я понял, Joss хочет заменить все ошибки СКЛ сервера на понятные пользователю... Хотя конечно ифами можно обработать ТОР10 самых популярных ошибок
19 апр 07, 17:53    [4044327]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
KrukVN
Member [заблокирован]

Откуда: РБ, Гомель
Сообщений: 778
А не нужно ничего исправлять и перехватывать ИМХО
Пусть пользователь видит как нам программистам трудно :)
С какими андроидными (как сказал ЛП) текстами приходится работать, ужас!
Пару раз пользователь такую вот х… увидит, глазками похлопает, и больше так делать не будет, а то мало ли конец света наступит.
Я на этих сообщениях особо не зацикливаюсь, но, правда, стараюсь (если это возможно), подобных сообщений вообще не допускать.
19 апр 07, 18:06    [4044419]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
KrukVN
Member [заблокирован]

Откуда: РБ, Гомель
Сообщений: 778
ILL HEAD
If Err.Number = -2147217873 Then

Пытался так делать, но потом обнаружил, что номер ошибки может меняться. Толи это от версии скула зависит, толи еще отчего, разбираться не стал.
19 апр 07, 18:16    [4044472]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
PA
Member

Откуда: Санкт-Петербург
Сообщений: 4146
Private WithEvents mRecordSet As Recordset

Private Sub Form_Error(DataErr As Integer, Response As Integer)
    Select Case DataErr
        Case 515
            Response = acDataErrContinue
        Case Else
    End Select
    
End Sub

Private Sub Form_Open(Cancel As Integer)
    Set mRecordSet = Me.Recordset
End Sub

Private Sub mRecordSet_RecordChangeComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal cRecords As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
    If adStatus = adStatusErrorsOccurred Then MsgBox pError.Description, vbCritical Or vbOKOnly, "Ошибочка вышла:"
End Sub
19 апр 07, 19:03    [4044766]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5127
To PA

Можете прокоментировать свой код? Я не всё понял. Тупая подстановка в исполняемую программу не работает. Может надо что-то добавить?
20 апр 07, 10:23    [4046648]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
ILL HEAD
Member [заблокирован]

Откуда:
Сообщений: 8498
код работает но имхо вашу проблему не решает (имя поля не поможет выцепить)
по событиям рекордсета см MSDN
20 апр 07, 10:53    [4046911]     Ответить | Цитировать Сообщить модератору
 Re: ADP+SQL SERVER, как перехватить сообщение об ошибке?  [new]
ILL HEAD
Member [заблокирован]

Откуда:
Сообщений: 8498
и вообще - ваш вопрос непонятен
зачем выяснять у сервера - какое поле он забраковал как NULL_ABLE
NOT_NULL_ABLE можно:
- знать на этапе проектирования формы и при работе программы проверять заполенность нужных полей
- или узнать по ходу работы программы (если бешеный админ поменял свойства полей)
20 апр 07, 11:08    [4047064]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft Access Ответить