Когда я создаю соединение с базой данных, используя объект 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 есть какая-либо успешная вставка, я никогда не узнаю, вызвала ли какая-либо другая часть оператора ошибку.