Классический номер строки asp для объекта err - PullRequest
0 голосов
/ 18 апреля 2019

В классическом сценарии 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?

1 Ответ

0 голосов
/ 18 апреля 2019

Не думаю, что вы можете извлечь оператор sql в вашей обработке ошибок, но вы можете вставить его в переменную, например lastSql = "SELECT * FROM ...", а затем использовать эту переменную для обработки ошибок, поскольку она всегда будет содержать ваш последний оператор.

...