ошибки Ado

Тема в разделе "Lotus - Программирование", создана пользователем NickProstoNick, 9 окт 2009.

  1. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Всем привет!
    И снова вопрос... у меня уже просто паника.
    Нужно отловить ошибки ADO.
    Вот есть такая строчка templDoc.Form = Record.Fields.Item( "fgdfhk" ).Value
    Понятное дело поля с таким именем fgdfhk нет.
    Возникает ошибка... к сожалению в lotusscript нет отдельной ошибки на отсутствие поля, но есть в ADO.
    припопытке перебрать коллекцию ошибок ADO ничего не получается. Коллекция пуста :(
    перебираю так
    Код (Text):
        Forall oError In ADOConnection.Errors

    strTmp = strTmp & " ADO Error # " & oError.Number
    strTmp = strTmp & " Description:" & oError.Description
    strTmp = strTmp & " Source: " & oError.Source

    End Forall
    Читаю тут

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

    А то обсуждение становится похожим на шутку (за ранее прошу прощения, ничего личного)
    так... пока разводили демагогию - нашел некоторые ошибки в интерпретации кода.
    оказывается надо писать так
    Код (Text):
    for i = 0 to ADOConnection.Errors.Count - 1

    Set oError = ADOConnection.Errors.Item( i )
    ....

    next
    Так что часть вопросов я уже решил.

    ПОКА остается такая ошибка:
    эта конструкция templDoc.Form = Record.Fields.Item( "fgdfhk" ).Value генерирует ТОЛЬКО исключение Notes'a
    хотя по идее должно еще возникать ошибка поставщика данных.
     
  2. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    if Doc.HasItem("Name") then

    всё в лотусе есть
     
  3. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    ToxaRat
    Причем тут лотус? Мне надо проверять ADO! Читай внимательно
     
  4. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    я не знаю ADO, и не вижу смысла его использования...
    возможно там и есть обходные маневры по получению ошибок...
    но хочется напомнить про существование jdbc
     
  5. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    lmike , спасибо конечно... но я не прошу совета по поводу альтернатив!?
    У меня есть конкретная задача, мне надо решить проблему
     
  6. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    тогда чего вы хотите от лотусистов?
    может разделом ошиблись? :(
     
  7. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Вы явно не внимательны и выдергиваете фразы из контекста.
    Я разве спросил "Как проверить наличие поля в документе?"
    По моему не. И даже не спросил как проверить наличие поля в ADO.
    Суть моего вопроса - как обработать ошибки ADO.
    Почему именно эти ошибки? - потому что в Lotusscript мало исключений касательно Ole-объектов.

    Хотя может вы не знаете как работать с ADO... тогда вопросов нет
     
  8. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    Код (Text):
    set conn=Server.CreateObject("ADODB.Connection")
    conn.Provider="Microsoft.Jet.OLEDB.4.0"
    conn.Open "c:/webdata/northwind.mdb"

    set rs=Server.CreateObject("ADODB.recordset")
    rs.Open "Select * from Customers", conn

    for each x in rs.fields
    response.write(x.name)
    response.write(" = ")
    response.write(x.value)
    next
    проходите по всем полям и просекайте каких нету

    это не наши проблемы, что мелкософт в своём ADO не спобен отловить ваши ошибки
     
  9. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Ребята, вы прикалываетесь или реально не понимаете сути вопроса?
    Вопрос как ОБРАБОТАТЬ ошибку,а не как ее предотвратить!
     
  10. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    NickProstoNick
    у вас в том, что вы пишите(так как ваше изначальное лотусскрипт как я понял не лотус) есть обработчик ошибок?
    там наверно есть код ошибки и номер строки где вызвана ошибка?
    в чем проблема отловить строку templDoc.Form = Record.Fields.Item( "fgdfhk" ).Value и подвязать код, что ошибка именно из-за отсуствия поля?

    Код (Text):
    on error goto err1
    ......
    templDoc.Form = Record.Fields.Item( "fgdfhk" ).Value
    .....
    exit sub

    err1:
    if err=91 and erl=2 then - обработка ошибки;)
     
  11. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    ToxaRat
    вот этим вот ты отловишь ошибку Notes'a

    Public Const ErrObjectVariableNotSet = 91

    А надо отлавливать ошибку COM
    Public Const ErrOLEException = 213

    только вот к сожалению, под это исключение может попасть куча разных ошибок поставщика данных.
    Мне надо классифицировать ошибки! Что именно произошло? Поле отсутствует или просто к нему нет доступа. А не просто ошибка 213
     
  12. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    замечательно, мы наконец-то нашли общий язык

    ну так в чем проблема то?
    Ставите обработчик ЛОТУСИНЫЙ(если это у вас в лотусскрипте)!
    и уже ВНУТРИ него считываете ошибку поставщика:
    http://www.w3schools.com/ado/ado_ref_error.asp
    Код (Text):
    for each objErr in objConn.Errors
    response.write("<p>")
    response.write("Description: ")
    response.write(objErr.Description & "<br />")
    response.write("Help context: ")
    response.write(objErr.HelpContext & "<br />")
    response.write("Help file: ")
    response.write(objErr.HelpFile & "<br />")
    response.write("Native error: ")
    response.write(objErr.NativeError & "<br />")
    response.write("Error number: ")
    response.write(objErr.Number & "<br />")
    response.write("Error source: ")
    response.write(objErr.Source & "<br />")
    response.write("SQL state: ")
    response.write(objErr.SQLState & "<br />")
    response.write("</p>")
    next
    и тем самым вытяните, что же было не так, и если нужно в самом лотусином обработчике вернетесь назад или пойдете другим путем

    такой ответ вас устроит? :(
     
  13. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    ToxaRat
    ты первый пост читал? Ссылку смотрел?
    Мне не нужна теория!
    Ты практически пробовал делать о том что нашел в инете?

    Перефразирую вопрос.

    Кто реально пробовал обрабатывать ошибки ADO? У кого это получилось?

    не все что ты написал работает в Lotusscript
    например вот эта конструкция
    Код (Text):
    for each objErr in objConn.Errors
    даже если ее переписать так ForAll и т.д. не применима для обработки ошибок... доказано опытным путем.
    оказывается надо писать так
    Код (Text):
    for i = 0 to objConn.Errors.Count - 1

    Set objErr = objConn.Errors.Item( i )
    ....

    next
    Так что часть вопросов я уже решил.
    ПОКА остается такая ошибка:
    эта конструкция templDoc.Form = Record.Fields.Item( "fgdfhk" ).Value генерирует ТОЛЬКО исключение Notes'a
    хотя по идее должно еще возникать ошибка поставщика данных
     
  14. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    NickProstoNick
    ндаа...
    или вы чего-то не понимаете, или я
    ADO вы как берете?
    через ODBC или JDBC?
     
  15. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Молодой человек, вы меня пугаете! ADO через ODBC - очень интересно! На прямую через COM не пробовали?
    Есть такие объекты ADODB.Connection, ADODB.RecordSet и т.д.
    Хотя собственно... вы же мне ссылку давали. Вы хоть иногда читаете то, что советуете другим?
     
  16. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    NickProstoNick
    большую часть я вам уже обьяснил, дальше пожалуй разжевывать откажусь, не нравится мне ваша корона и ваш тон...
     
  17. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Ну так надо помогать по существу, а не теоретизировать!
    А еще надо читать пост внимательно! Я несколько раз говорил что читаю тот же сайт, который Вы мне рекомендовали!

    А после такого
    страшно спрашивать о чем-то другом!
     
  18. oshmianski

    oshmianski Гость

    очень интересная дискуссия )))
    вставлю свои 5 копеек.

    давно это было, но на сколько помню ADO может соединяться с источником напрямую, а также используя ODBC (по крайней мере на Windows), может и еще как.
    ник, думаю проблема в том, что Вы не можете однозначно идентифицировать ошибку, т.к. они накапливаются. я очищал контейнер ошибок после обработки.
    ниже отрывок рабочего (когда-то) кода:

    Код (Text):
    '****************************************************Описание****************
    **************************************************
    ' 08.02.2006
    ' Класс позволяет соединяться с SQL хранилищем и выполнять запросы.
    ' Все функции возвращают true, в случае удачи, или false, в случае неудачи.
    ' В случае возникновения ошибок переменной "ErrorString" присваивается соответствующий текст.
    '****************************************************************************
    ******************************************************
    Class ADOConnect
    con As Variant
    ErrorString As String
    ErrorNum As Long

    Sub new
    ErrorString = ""
    End Sub

    Property Get GetErrorString As String
    GetErrorString = ErrorString
    End Property
    Property Get GetErrorNum As Long
    GetErrorNum = ErrorNum
    End Property

    Function OpenConnectWithODBC(ODBCName As String, UserName As String, Password As String) As Boolean
    '****************************************************Описание****************
    **************************************************
    ' Фунция соединяется с ODBC источником
    ' Возвращаемое значение: true - если все нормально; false - если произошла ошибка.
    ' В случае неудачного подключения к ODBC источнику
    ' переменной "ErrorString" присваивается соответствующий текст
    '****************************************************************************
    ******************************************************
    On Error Goto errorhandler
    OpenConnectWithODBC = False

    Set con = CreateObject("ADODB.Connection")     

    Con.ConnectionString = "Data Source=" & ODBCName & ";UID=" & UserName & ";PWD=" & Password
    Con.Open

    OpenConnectWithODBC = True
    Ex:
    Exit Function
    errorhandler:      
    ErrorString = "ADOConnect: OpenConnectWithODBC: Не удалось подключиться к ODBC источнику" &_
    ". Код ошибки: " & Cstr(con.Errors.Item(0).Number) &_
    ". Ошибка: " & con.Errors.Item(0).Description
    ErrorNum = con.Errors.Item(0).Number
    con.Errors.Clear
    Resume ex
    End Function   

    Function OpenConnectWithDBName(ServerName As String, DBName As String, UserName As String, Password As String) As Boolean
    '****************************************************Описание****************
    **************************************************
    ' Фунция соединяется с SQL хранилищем напрямую, минуя ODBC
    ' Возвращаемое значение: true - если все нормально; false - если произошла ошибка.
    ' В случае неудачного подключения к ODBC источнику
    ' переменной "ErrorString" присваивается соответствующий текст
    '****************************************************************************
    ******************************************************
    On Error Goto errorhandler
    Dim conStr As String
    OpenConnectWithDBName = False      

    Set con = CreateObject("ADODB.Connection")

    conStr = "Provider=SQLOLEDB.1;Password=" & Password &_
    ";Persist Security Info=True;User ID=" & UserName &_
    ";Initial Catalog=" & DBName &_
    ";Data Source=" & ServerName

    Con.ConnectionString = conStr
    Con.Open
    OpenConnectWithDBName = True
    Ex:
    Exit Function
    errorhandler:      
    ErrorString = "ADOConnect: OpenConnectWithDBName: Не удалось подключиться к бд" &_
    ". Код ошибки: " & Cstr(con.Errors.Item(0).Number) &_
    ". Ошибка: " & con.Errors.Item(0).Description
    ErrorNum = con.Errors.Item(0).Number
    con.Errors.Clear
    Resume ex
    End Function   

    Function ExecSQLQuery(SQLQuery As String) As Boolean
    '****************************************************Описание****************
    **************************************************
    ' Фунция выполняет sql команду. Данные не возвращает!
    ' Возвращаемое значение: true - если все нормально; false - если произошла ошибка.
    ' В случае возникновения ошибки переменной "ErrorString" присваивается соответствующий текст.
    '****************************************************************************
    ******************************************************
    On Error Goto errorhandler
    ExecSQLQuery = False

    con.Execute SQLQuery, , 1
    'If Len(con.Errors.Item(0).Description) > 0 Then Error 2006

    ExecSQLQuery = True
    Ex:
    Exit Function
    errorhandler:      
    ErrorString = "ADOConnect: ExecSQLQuery: Не удалось выполнить sql команду" &_
    ". Код ошибки: " & Cstr(con.Errors.Item(0).Number) &_
    ". Ошибка: " & con.Errors.Item(0).Description
    ErrorNum = con.Errors.Item(0).Number
    con.Errors.Clear
    Resume ex
    End Function

    Function ExecStoredProcedure(StoredProcedureName As String) As Boolean
    '****************************************************Описание****************
    **************************************************
    ' Фунция выполняет хранимую процедуру.
    ' Возвращаемое значение: true - если все нормально; false - если произошла ошибка.
    ' В случае возникновения ошибки переменной "ErrorString" присваивается соответствующий текст.
    '****************************************************************************
    ******************************************************
    On Error Goto errorhandler
    ExecStoredProcedure = False

    con.Execute StoredProcedureName, , 4
    'If con.Errors.Count > 0 Then
    '   Goto errorhandler
    'End If
    ExecStoredProcedure = True
    Ex:
    Exit Function
    errorhandler:      
    ErrorString = "ADOConnect: ExecStoredProcedure: Не удалось выполнить хранимую процедуру" &_
    ". Код ошибки: " & Cstr(con.Errors.Item(0).Number) &_
    ". Ошибка: " & con.Errors.Item(0).Description
    ErrorNum = con.Errors.Item(0).Number
    con.Errors.Clear
    Resume ex
    End Function

    Function CloseConnect As Boolean
    '****************************************************Описание****************
    **************************************************
    ' Фунция отключает от источника.
    ' Возвращаемое значение: true - если все нормально; false - если произошла ошибка.
    '****************************************************************************
    ******************************************************
    On Error Goto errorhandler
    CloseConnect = False

    con.Close
    'Delete con
    CloseConnect =True
    Ex:
    Exit Function
    errorhandler:
    ErrorString = "ADOConnect: CloseConnect: Не удалось отключиться к ODBC источника" &_
    ". Код ошибки: " & Cstr(con.Errors.Item(0).Number) &_
    ". Ошибка: " & con.Errors.Item(0).Description
    ErrorNum = con.Errors.Item(0).Number
    con.Errors.Clear
    Resume ex
    End Function   
    End Class
     
  19. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    В этом я ОЧЕНЬ сильно сомневаюсь
    На ошибку натолкнулся совершенно случайно... вот какой парадокс случился....
    вот эта конструкция templDoc.Form = Record.Fields.Item( "fgdfhk" ).Value генерирует ошибку Notes'a и самое интересное - описание ошибки "ADODB.Fields: Не удается найти объект в семействе, соответствующий требуемому имени или порядковому номеру." а ошибка ADO не генерируется при этом. как это поставщик данных не знает что у него нет поля?
     
  20. oshmianski

    oshmianski Гость

    коллега, попробуйте функцию OpenConnectWithODBC в скрипте, что я выложил.

    т.е. лотусовая Error возвращает описание ошибки, а ADO контейнер ошибок пуст?
    хм, чудес не бывает. ADO обязательно что-нить возратит.
    хотя... сам на такие грабли не наступал.
     
Загрузка...

Поделиться этой страницей