В классическом сценарии asp у меня есть куча обновлений sql. Если произошла ошибка sql, она обрабатывается пользовательской страницей ошибок 500, на которой записываются значения
' get the extended error information
Set ASPErr = Server.GetLastError()
strASPDesc = ASPErr.ASPDescription
strASPNumber = ASPErr.ASPCode
intASPLine = clng(ASPErr.Line)
intASPColumn = clng(ASPErr.Column)
strDesc = ASPErr.Description
strNumber = "0x" & Hex(ASPErr.Number)
strASPFile = ASPErr.File
strERRline = ASPErr.Source
и регистрирует это в sql-таблице. Так что это легко отлаживать в случае ошибок. Однако это может привести к несогласованности базы данных, если некоторые операторы были выполнены, а другие нет.
Так что теперь я завернул его в подпрограмму.
on error resume next
conn.beginTrans
do_transaction
if err.number=0 then
conn.commitTrans
response.write "OK"
else
conn.rollbackTrans
Response.write "Error # " & CStr(Err.Number) & " " & Err.Description & vbCrLf
Response.write "Source: " & Err.Source & vbCrLf
end if
err.clear
on error goto 0
'here the actual transaction is done:
sub do_transaction
set rs=conn.execute("SELECT ....")
conn.execute("UPDATE ...")
conn.execute("INSERT ...")
conn.execute("DELETE ...")
end sub
Это откатит всю транзакцию в случае ошибки, однако теперь я не вижу, какой оператор вызвал ошибку.
Объект Err
не содержит строки или столбца, а Server.GetLastError()
не заполняется, за исключением столбца 78, который вообще не имеет никакого смысла.
Есть ли способ узнать, что вызвало ошибку?
Можно ли получить sql-оператор из объекта conn?