Что нового

[Ошибки] Как вывести дескриптор ошибки

Vitorio

Новичок
Сообщения
18
Репутация
0
Есть некий скрипт, использующий библиотеку ADO.au3 (h ttps://www.autoitscript.com/forum/files/file/389-adoau3-udf/?tab=comments) для соединения с базой данных и вставки туда данных с сайта.
Код:
...
; SetUP internal ADO.au3 UDF COMError Handler
_ADO_ComErrorHandler_UserFunction(_ADO_COMErrorHandler)
...
For $x=0 To UBound($arez) - 1
$sSQL = "insert into mytab_oper values(to_date('" & $arez[$x][0] & "','DD.MM.YYYY HH24:MI')," & _
											 "'" & StringStripWS($arez[$x][1],1) & "'," & _
											 "'" & StringStripWS($arez[$x][2],1) & "'," & _
											 "to_date('" & $arez[$x][3] & "','DD.MM.YYYY')," & _
											 "to_number('" & StringStripWS($arez[$x][4],8) & "')," & _
											 "'" & StringRegExpReplace(StringStripWS($arez[$x][5],1),"'","''") & "'," & _
											 "to_number('" & StringStripWS($arez[$x][6],8) & "')," & _
											 "'" & StringRegExpReplace(StringStripWS($arez[$x][7],1),"'","''") & "'," & _
											 "to_number('" & StringRegExpReplace($arez[$x][8],",",".") & "')," & _
											 "to_number('" & StringRegExpReplace($arez[$x][9],",",".") & "')," & _
											 "to_number('" & StringRegExpReplace($arez[$x][10],",",".") & "')," & _
											 "to_number('" & StringRegExpReplace($arez[$x][11],",",".") & "')," & _
											 "to_number('" & StringRegExpReplace($arez[$x][12],",",".") & "')," & _
											 "to_number('" & StringRegExpReplace($arez[$x][13],",",".") & "')," & _
											 "to_number('" & StringRegExpReplace($arez[$x][14],",",".") & "')," & _
											 "to_number('" & StringRegExpReplace($arez[$x][15],",",".") & "')," & _
											 "to_number('" & StringRegExpReplace($arez[$x][16],",",".") & "')," & _
											 "to_number('" & StringRegExpReplace($arez[$x][17],",",".") & "')," & _
											 "to_number('" & StringRegExpReplace($arez[$x][18],",",".") & "')," & _
											 "to_number('" & StringRegExpReplace($arez[$x][19],",",".") & "')," & _
											  "'" & StringStripWS($arez[$x][20],1) & "')"
;ConsoleWrite('$sSQL = '&$sSQL & @CRLF)
_ADO_Execute($oConnection, $sSQL)
Next
...

При возникновении ошибки при вставке данных в консоль выводится сообщение типа:
###############################
ADO.au3 v.2.1.13 BETA (1155) : ==> COM Error intercepted !
$oADO_Error.description is: [Oracle][ODBC][Ora]ORA-01438: value larger than specified precision allowed for this column

$oADO_Error.windescription: Ошибка.

$oADO_Error.number is: 80020009
$oADO_Error.lastdllerror is: 0
$oADO_Error.scriptline is: 1155
$oADO_Error.source is: Microsoft OLE DB Provider for ODBC Drivers
$oADO_Error.helpfile is:
$oADO_Error.helpcontext is: 0
###############################

Вопрос: как вывести только дескриптор возникшей ошибки, т.е. значение $oADO_Error.description в лог файл, или хотя бы в отдельную переменную?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Найдите функцию _ADO_COMErrorHandler, посмотрите как она сделана и напишите свою, что бы $oADO_Error.description писался в лог. И имя функции подставите сюда по _ADO_ComErrorHandler_UserFunction(ваша функция)
 
Автор
V

Vitorio

Новичок
Сообщения
18
Репутация
0
Функция _ADO_COMErrorHandler входит в библиотеку ADO.au3:
Код:
Func _ADO_COMErrorHandler($oADO_Error)
	; Error Object
	; https://msdn.microsoft.com/en-us/library/windows/desktop/ms677507(v=vs.85).aspx

	; Error Object Properties, Methods, and Events
	; https://msdn.microsoft.com/en-us/library/windows/desktop/ms678396(v=vs.85).aspx

	Local $HexNumber = Hex($oADO_Error.number, 8)
	Local $sSQL_ComErrorDescription = ''
	$sSQL_ComErrorDescription &= "ADO.au3 v." & _ADO_UDFVersion() & " (" & $oADO_Error.scriptline & ") : ==> COM Error intercepted !" & @CRLF
	$sSQL_ComErrorDescription &= "$oADO_Error.description is: " & @TAB & $oADO_Error.description & @CRLF
	$sSQL_ComErrorDescription &= "$oADO_Error.windescription: " & @TAB & $oADO_Error.windescription & @CRLF
	$sSQL_ComErrorDescription &= "$oADO_Error.number is: " & @TAB & $HexNumber & @CRLF
	$sSQL_ComErrorDescription &= "$oADO_Error.lastdllerror is: " & @TAB & $oADO_Error.lastdllerror & @CRLF
	$sSQL_ComErrorDescription &= "$oADO_Error.scriptline is: " & @TAB & $oADO_Error.scriptline & @CRLF

	; Source Property (ADO Error)
	; https://msdn.microsoft.com/en-us/library/windows/desktop/ms675830(v=vs.85).aspx
	$sSQL_ComErrorDescription &= "$oADO_Error.source is: " & @TAB & $oADO_Error.source & @CRLF
	$sSQL_ComErrorDescription &= "$oADO_Error.helpfile is: " & @TAB & $oADO_Error.helpfile & @CRLF
	$sSQL_ComErrorDescription &= "$oADO_Error.helpcontext is: " & @TAB & $oADO_Error.helpcontext & @CRLF

	#CS
		; NativeError Property (ADO)
		; https://msdn.microsoft.com/en-us/library/windows/desktop/ms678049(v=vs.85).aspx
		$sSQL_ComErrorDescription &= "$oADO_Error.NativeError is: " & @TAB & $oADO_Error.NativeError & @CRLF

		; SQLState Property
		; https://msdn.microsoft.com/en-us/library/windows/desktop/ms681570(v=vs.85).aspx
		$sSQL_ComErrorDescription &= "$oADO_Error.SQLState is: " & @TAB & $oADO_Error.SQLState & @CRLF

	#CE

	ConsoleWrite("###############################" & @CRLF & $sSQL_ComErrorDescription & "###############################" & @CRLF)
	SetError($ADO_ERR_GENERAL, $ADO_EXT_DEFAULT, $sSQL_ComErrorDescription)
EndFunc   ;==>_ADO_COMErrorHandler

Зачем писать свою? Может как-нибудь можно использовать её? (прошу прощения за дилетантский вопрос)
На всякий случай и сама функция _ADO_Execute, которая вызывает ошибку:
Код:
; #FUNCTION# ====================================================================================================================
; Name ..........: _ADO_Execute
; Description ...: Executes an SQL Query
; Syntax ........: _ADO_Execute(Byref $oConnection, $sQuery[, $bReturnAsArray = False[, $bFieldNamesInFirstRow = False]])
; Parameters ....: $oConnection         - [in/out] an object. ADODB.Connection object.
;                  $sQuery              - a string value. SQL Statement to be executed.
;                  $bReturnAsArray      - [optional] a boolean value. Default is False.
;                  $bFieldNamesInFirstRow- [optional] a boolean value. Default is False.
; Return values .: On Success - Returns $oRecordset object or $aRecordsetAsArray
;                  On Failure - Returns $ADO_RET_FAILURE and set @error to $ADO_ERR_*
; Author ........: Chris Lambert
; Modified ......: mLipok
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; no
; ===============================================================================================================================
Func _ADO_Execute(ByRef $oConnection, $sQuery, $bReturnAsArray = False, $bFieldNamesInFirstRow = False)
	; Error handler, automatic cleanup at end of function
	Local $oADO_COM_ErrorHandler = ObjEvent("AutoIt.Error", __ADO_ComErrorHandler_InternalFunction)
	If @error Then Return SetError($ADO_ERR_COMHANDLER, @error, $ADO_RET_FAILURE)
	#forceref $oADO_COM_ErrorHandler

	__ADO_Connection_IsReady($oConnection)
	If @error Then
		Return SetError(@error, @extended, $ADO_RET_FAILURE)
	ElseIf Not IsString($sQuery) Then
		Return SetError($ADO_ERR_INVALIDPARAMETERTYPE, $ADO_EXT_PARAM2, $ADO_RET_FAILURE)
	ElseIf $sQuery = '' Then
		Return SetError($ADO_ERR_INVALIDPARAMETERVALUE, $ADO_EXT_PARAM2, $ADO_RET_FAILURE)
	ElseIf Not IsBool($bReturnAsArray) Then
		Return SetError($ADO_ERR_INVALIDPARAMETERTYPE, $ADO_EXT_PARAM3, $ADO_RET_FAILURE)
	ElseIf Not IsBool($bFieldNamesInFirstRow) Then
		Return SetError($ADO_ERR_INVALIDPARAMETERTYPE, $ADO_EXT_PARAM4, $ADO_RET_FAILURE)
	EndIf

	Local $oRecordset = $oConnection.Execute($sQuery)
	If @error Then Return SetError($ADO_ERR_COMERROR, @error, $ADO_RET_FAILURE)

	If $bReturnAsArray Then
		Local $aRecordsetAsArray = _ADO_Recordset_ToArray($oRecordset, $bFieldNamesInFirstRow)
		Return SetError(@error, @extended, $aRecordsetAsArray)
	EndIf

	Return SetError($ADO_ERR_SUCCESS, $ADO_EXT_DEFAULT, $oRecordset)

EndFunc   ;==>_ADO_Execute
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
_ADO_ComErrorHandler_UserFunction("MyErrFunc")


здесь твой код


	Func MyErrFunc()
		FileWrite(@ScriptDir&'\log.txt', "err.description is: " & @TAB & $oADO_Error.description & @CRLF)
	EndFunc
 
Автор
V

Vitorio

Новичок
Сообщения
18
Репутация
0
sngr сказал(а):
Код:
_ADO_ComErrorHandler_UserFunction("MyErrFunc")


здесь твой код


	Func MyErrFunc()
		FileWrite(@ScriptDir&'\log.txt', "err.description is: " & @TAB & $oADO_Error.description & @CRLF)
	EndFunc

т.е. не надо вставлять после вызова функции _ADO_Execute:
Код:
if @error Then

и т.д.?
 
Верх