Обърнете внимание, че postgres позволява претоварване на функции , така че не само функцията NAME трябва да съществува, но и типовете параметри на функцията също ще се използват за определяне кое претоварване да се използва, напр.
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, varchar, boolean)
Не е същата функция като
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)
и т.н.
Когато извиквате тези функции, имената на параметрите, типовете и евентуално поръчките трябва да съвпадат, в противен случай ще получите
Една допълнителна грешка, която продължава да ме дразни, са правилата на Postgressql за чувствителност към главни и малки букви при дефиниране на функции. Например без околни ""
кавички, следната дефиниция на функция (с помощта на настройките по подразбиране в pgAdmin 3):
CREATE FUNCTION MySchema.MyFunction(Parameter1 VARCHAR(40), parameTer2 VARCHAR(20))
регистрира функцията със сигнатурата:(използвайте IDE инструмент, за да проверите това)
myschema.myfunction(parameter1 VARCHAR(40), parameter2 VARCHAR(20))
В резултат на това всеки опит в C# да се свърже с
command.Parameters.Add("Parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameTer2", NpgsqlDbType.Varchar, 20);
ще се провали с грешката. Вместо това ще трябва да се свържете с параметрите с малки букви, т.е.
command.Parameters.Add("parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameter2", NpgsqlDbType.Varchar, 20);
Освен ако не дефинирате функцията с кавички:
CREATE FUNCTION "MySchema"."MyFunction"("Parameter1" VARCHAR(40), "parameTer2" VARCHAR(20))
Ето защо е важно да се споразумеете за конвенция за малки букви във вашата база данни/организация и след това да се придържате към нея (всички малки букви е доста често)
Алтернатива, макар и склонна да бъде крехка, е изобщо да не се обвързвате с именувани параметри, а вместо това да използвате поредната позиция на параметъра, за да го обвържете, напр.
var myParameter = new NpgsqlParameter
{
// Leave `ParameterName` out entirely,
Direction = ParameterDirection.Input,
IsNullable = false,
NpgsqlDbType = NpgsqlDbType.Varchar,
Size = 20,
Value = "SomeValue"
};
command.Parameters.Add(myParameter);
// Same for other parameter(s)