Новият API за общ параметър наистина има проблем - трябва да приема обикновен .NET null (а не DBNull.Value ), отворих този проблем
за да проследите това, то ще бъде коригирано в 4.0.3.
Имайте предвид, че както бележката към документацията
казва, че целият смисъл на общия API е да се избягва използването на Value свойство, което е от тип object . Ако използвате общия NpgsqlParameter<int> но задайте Value , вашият int ще бъде поставен в кутия, нарушавайки целта на API. Трябва да присвоявате на TypedValue , който е от тип int и няма да се боксира. Ето защо не можете да присвоите DBNull.Value за указване на нулева стойност (това е различен тип .NET).
Някои бележки относно това дали трябва да се използва този нов общ API:
- Ако пишете много типове стойности (напр.
int,DateTime...) това ще премахне всички разпределения на боксове. Дали това ще бъде значително зависи от вашето приложение – профилирайте внимателно. - Общите API винаги трябва да се предпочитат пред негенеричните, когато типът е известен по време на компилиране. Това позволява на компилатора да проверява коректността на типа рано и прави кода ви по-ясен - използваме
List<string>вместоArrayListкато въпрос на добро кодиране, дори когато производителността не е проблем - Основният (единствен?) недостатък на генеричния API е, че той е специфичен за Npgsql, което прави вашия код непреносим към други драйвери на бази данни (въпреки че има проблем за превръщането на това (или нещо подобно) в част от ADO.NET).