Почему объект ADODB.connection глотает ошибки? - PullRequest
1 голос
/ 04 марта 2020

Когда я создаю соединение с базой данных, используя объект ADODB.Connection для создания соединения с базой данных SQLServer, я ожидаю, что когда я использую оператор throw, я ожидаю иметь записи в коллекции conn.Errors.

Вместо этого, если я выполню одно из следующих двух действий, коллекция ошибок будет пустой:

  • Возвращает любые строки в качестве результирующего набора. Это может произойти, если серьезность ошибки достаточно мала, чтобы строки все еще возвращались вызывающей стороне
  • Если я успешно вставлю какие-либо строки в любую таблицу где-нибудь в моем операторе sql, все остальные ошибки будут игнорироваться объект ADO.

Второй сценарий особенно расстраивает, и я не могу найти документацию, объясняющую, почему это может произойти, или как этого избежать.

Воспроизвести

$conn = New-Object -ComObject ADODB.Connection
$conn.Open("Provider=SQLNCLI11;Initial Catalog=master;Application Name=Application;Data Source=.;DataTypeComptibility=80;Integrated Security=SSPI")
$conn.Execute('THROW 50000, ''Exceptional Exception'', 10')

После этой последовательности вызов

$conn.Errors.count

вернет 1

Однако, если вы сейчас выполните

$conn.Execute('CREATE TABLE #t (name varchar(256)); INSERT #t values(''name''); DROP TABLE #t ; THROW 50000, ''Sad, Ignored Exception'', 10')

Затем вызов

$conn.Errors.count

приводит к 0

Есть ли сценарий, в котором такое поведение было бы желательным? Я не понимаю мышления, которое могло бы заставить объект вести себя таким образом.

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

В нынешнем виде, если в моем операторе sql есть какая-либо успешная вставка, я никогда не узнаю, вызвала ли какая-либо другая часть оператора ошибку.

...