Свойство DataException.Number реализовано через обращение к провайдеру:
return _dbManager.DataProvider.Convert(InnerException, ConvertType.ExceptionToErrorNumber) as int?;
OleDbDataProvider.Convert для случая ConvertType.ExceptionToErrorNumber пытается привести полученный объект к OleDbException.
Если это не получается то выходим из switch и возвращается InnerException как есть, а строчка кода приведённая выше пытается привести его к (int?) типу, имеем Invalid cast exception.
Проблема в моём случае возникла при вызове процедуры которой ещё нет в базе -- вместо понятного сообщения я получаю Invalid cast, из-за того что InnerException в этом случае это InvalidOperationException.