• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

ошибки Ado

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Всем привет!
И снова вопрос... у меня уже просто паника.
Нужно отловить ошибки ADO.
Вот есть такая строчка templDoc.Form = Record.Fields.Item( "fgdfhk" ).Value
Понятное дело поля с таким именем fgdfhk нет.
Возникает ошибка... к сожалению в lotusscript нет отдельной ошибки на отсутствие поля, но есть в ADO.
припопытке перебрать коллекцию ошибок ADO ничего не получается. Коллекция пуста :(
перебираю так
Код:
	Forall oError In ADOConnection.Errors

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

End Forall


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

А то обсуждение становится похожим на шутку (за ранее прошу прощения, ничего личного)
чем отличаются русский, американский и еврейский форумы?

на американском форуме вы задаете вопрос и вам дают ответ
на еврейском форуме вы задаете вопрос и вам задают встречный вопрос
на русском форуме вы задаете вопрос и вам долго объясняют почему вы такой *цензура*.

так... пока разводили демагогию - нашел некоторые ошибки в интерпретации кода.
оказывается надо писать так
Код:
for i = 0 to ADOConnection.Errors.Count - 1

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

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

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

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
ToxaRat
Причем тут лотус? Мне надо проверять ADO! Читай внимательно
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
я не знаю ADO, и не вижу смысла его использования...
возможно там и есть обходные маневры по получению ошибок...
но хочется напомнить про существование jdbc
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
lmike , спасибо конечно... но я не прошу совета по поводу альтернатив!?
У меня есть конкретная задача, мне надо решить проблему
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
тогда чего вы хотите от лотусистов?
может разделом ошиблись? :(
Вы явно не внимательны и выдергиваете фразы из контекста.
Я разве спросил "Как проверить наличие поля в документе?"
По моему не. И даже не спросил как проверить наличие поля в ADO.
Суть моего вопроса - как обработать ошибки ADO.
Почему именно эти ошибки? - потому что в Lotusscript мало исключений касательно Ole-объектов.

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

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Код:
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 не спобен отловить ваши ошибки
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Ребята, вы прикалываетесь или реально не понимаете сути вопроса?
Вопрос как ОБРАБОТАТЬ ошибку,а не как ее предотвратить!
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
NickProstoNick
у вас в том, что вы пишите(так как ваше изначальное лотусскрипт как я понял не лотус) есть обработчик ошибок?
там наверно есть код ошибки и номер строки где вызвана ошибка?
в чем проблема отловить строку templDoc.Form = Record.Fields.Item( "fgdfhk" ).Value и подвязать код, что ошибка именно из-за отсуствия поля?

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

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

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
ToxaRat
вот этим вот ты отловишь ошибку Notes'a

Public Const ErrObjectVariableNotSet = 91

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

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

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
только вот к сожалению, под это исключение может попасть куча разных ошибок поставщика данных.
Мне надо классифицировать ошибки! Что именно произошло? Поле отсутствует или просто к нему нет доступа. А не просто ошибка 213
замечательно, мы наконец-то нашли общий язык

ну так в чем проблема то?
Ставите обработчик ЛОТУСИНЫЙ(если это у вас в лотусскрипте)!
и уже ВНУТРИ него считываете ошибку поставщика:

Код:
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

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

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

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
ToxaRat
ты первый пост читал? Ссылку смотрел?
Мне не нужна теория!
Ты практически пробовал делать о том что нашел в инете?

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

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

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

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

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

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
NickProstoNick
ндаа...
или вы чего-то не понимаете, или я
ADO вы как берете?
через ODBC или JDBC?
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
NickProstoNick
ндаа...
или вы чего-то не понимаете, или я
ADO вы как берете?
через ODBC или JDBC?

Молодой человек, вы меня пугаете! ADO через ODBC - очень интересно! На прямую через COM не пробовали?
Есть такие объекты ADODB.Connection, ADODB.RecordSet и т.д.
Хотя собственно... вы же мне ссылку давали. Вы хоть иногда читаете то, что советуете другим?
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
NickProstoNick
Так что часть вопросов я уже решил.
ПОКА остается такая ошибка:
эта конструкция templDoc.Form = Record.Fields.Item( "fgdfhk" ).Value генерирует ТОЛЬКО исключение Notes'a
хотя по идее должно еще возникать ошибка поставщика данных
большую часть я вам уже обьяснил, дальше пожалуй разжевывать откажусь, не нравится мне ваша корона и ваш тон...
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
большую часть я вам уже обьяснил, дальше пожалуй разжевывать откажусь, не нравится мне ваша корона и ваш тон...
Ну так надо помогать по существу, а не теоретизировать!
А еще надо читать пост внимательно! Я несколько раз говорил что читаю тот же сайт, который Вы мне рекомендовали!

А после такого
ADO вы как берете?
через ODBC или JDBC?
страшно спрашивать о чем-то другом!
 
O

oshmianski

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

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

Код:
'****************************************************Описание****************
**************************************************
' 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
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
ADO может соединяться с источником напрямую, а также используя ODBC
В этом я ОЧЕНЬ сильно сомневаюсь
думаю проблема в том, что Вы не можете однозначно идентифицировать ошибку
На ошибку натолкнулся совершенно случайно... вот какой парадокс случился....
вот эта конструкция templDoc.Form = Record.Fields.Item( "fgdfhk" ).Value генерирует ошибку Notes'a и самое интересное - описание ошибки "ADODB.Fields: Не удается найти объект в семействе, соответствующий требуемому имени или порядковому номеру." а ошибка ADO не генерируется при этом. как это поставщик данных не знает что у него нет поля?
 
O

oshmianski

В этом я ОЧЕНЬ сильно сомневаюсь
коллега, попробуйте функцию OpenConnectWithODBC в скрипте, что я выложил.

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!