получение сообщений MS SQL в коде VBA

aleks2
Дата: 29.01.2016 14:50:50
Получение серверных сообщений в коде VBA
Пытаюсь воспроизвести элементарную обработку сообщений сервера по мотивам
http://stackoverflow.com/questions/3013447/how-to-retrieve-all-errors-and-messages-from-a-query-using-ado

Sub Test2()
  Dim conn As ADODB.Connection
 
  Set conn = New ADODB.Connection
  conn.Provider = CurrentProject.Connection.Provider
  conn.ConnectionString = CurrentProject.Connection.ConnectionString
  conn.Open

  Dim rs As ADODB.Recordset
  Set rs = conn.Execute("print 'Foo'" & vbCrLf & "print 'Bar'" & vbCrLf & "raiserror ('xyz', 10, 127)")

  Dim error As ADODB.error

  For Each error In conn.Errors
       MsgBox error.Description
   Next

  While Not (rs Is Nothing)
    For Each error In conn.Errors
        MsgBox error.Description
    Next
    Set rs = rs.NextRecordset
  Wend
  
End Sub


НО! Я ничего не получаю. Хотя, вроде, по утверждениям MS сообщения и ошибки все должны быть в Errors.

Выполнение запроса
print 'Foo'
print 'Bar'
raiserror ('xyz', 10, 127)
в MSSMS возвращает
Foo
Bar
xyz

Если
raiserror ('xyz', 10, 127) поменять на raiserror ('xyz', 16, 127) - ошибка в колекции появляется.
Eugene_p1
Дата: 29.01.2016 17:05:33
aleks2,

У меня работает такой код:

Dim i As Integer
    For i = 0 To objConn.Errors.Count - 1
        tbLog.Value = tbLog.Value & vbCrLf & objConn.Errors(i).Description
    Next


Если что,
Dim objConn As New ADODB.Connection



Попробуйте такую итерацию!
Eugene_p1
Дата: 29.01.2016 17:07:12
А, я, кажется, знаю в чем у вас беда.

aleks2
  Dim error As ADODB.error


Вот в этом.
Напишите так:
  Dim err As ADODB.error
2732
Дата: 29.01.2016 17:17:28
aleks2,

adp шоле ?
Акс использует сервисный провайдер, вот он, видимо, и "глушит".
та сделай
conn.ConnectionString = "Provider=SQLOLEDB;Server=...
MrShin
Дата: 30.01.2016 08:49:37
Eugene_p1
Напишите так:
  Dim err As ADODB.error


Err - тоже имя системного объекта, такие имена лучше не давать
aleks2
Дата: 30.01.2016 09:28:55
2732
aleks2,

adp шоле ?
Акс использует сервисный провайдер, вот он, видимо, и "глушит".
та сделай
conn.ConnectionString = "Provider=SQLOLEDB;Server=...


Итак, БИНГО!

Sub Test2()
  Dim conn As ADODB.Connection
 
  Set conn = New ADODB.Connection
  conn.ConnectionString = CurrentProject.BaseConnectionString
  conn.Open

  Dim rs As ADODB.Recordset
  Set rs = conn.Execute("print 'Foo'" & vbCrLf & "print 'Bar'" & vbCrLf & "raiserror ('xyz', 10, 127)")

  Dim error As ADODB.error

  While Not (rs Is Nothing)
    For Each error In conn.Errors
        MsgBox error.Description
    Next
    Set rs = rs.NextRecordset
  Wend
  
End Sub
aleks2
Дата: 30.01.2016 11:43:55
Однако счастие не полно.
Работать на отдельном соединении внутри ADP можно, но геморройно.

Может кто знает как и где можно получить сообщения сервера на основном соединении .ADP?
Eugene_p1
Дата: 01.02.2016 17:47:32
MrShin
Eugene_p1
Напишите так:
  Dim err As ADODB.error


Err - тоже имя системного объекта, такие имена лучше не давать

Чорт! :)
Спасибо! Я в общем-то про это и хотел сказать.