Для поставщика ADO.NET нет встроенного способа сообщить подробности о своих возможностях. Ранее SQLite также не поддерживал вложенные транзакции, но некоторые поставщики ADO.NET для SQLite подделывали его в коде (без надлежащей поддержки точек сохранения). В этом случае вы никогда не получите ошибок, но вы можете не получить ожидаемое поведение.
Я также видел много разных реализаций индексатора IDataReader. Раньше некоторые провайдеры генерировали исключение, когда передавали несуществующее имя поля, а некоторые провайдеры возвращали ноль. В ADO.NET 2.0 справочные документы были обновлены, чтобы указать, что поставщики должны выдавать исключение, но без проверенных исключений нет способа гарантировать, что все поставщики были должным образом обновлены.
Итак, вкратце, пространство имен System.Data.Common и различные поставщики ADO.NET значительно упрощают работу с различными базами данных, но вы должны знать, какие БД вы используете, и различия в каждом поставщике (большинство из которых, вероятно, будут недокументированными раздражающими причудами в отличие от больших различий).