Bemærk, at postgres tillader funktionsoverbelastning , så ikke kun skal funktionen NAME eksistere, men typerne af funktionsparametrene vil også blive brugt til at bestemme, hvilken overbelastning der skal bruges, f.eks.
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, varchar, boolean)
Er ikke den samme funktion som
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)
osv.
Når du kalder disse funktioner, skal parameternavne, typer og eventuelle ordrer alle matche, ellers får du
En ekstra gotcha, der bliver ved med at bide mig, er Postgressqls regler for følsomhed over for store og små bogstaver, når funktioner defineres. For eksempel uden nogen omgivende ""
citater, følgende funktionsdefinition (ved at bruge standardindstillingerne i pgAdmin 3):
CREATE FUNCTION MySchema.MyFunction(Parameter1 VARCHAR(40), parameTer2 VARCHAR(20))
registrerer funktionen med signaturen:(brug et IDE-værktøj til at bekræfte dette)
myschema.myfunction(parameter1 VARCHAR(40), parameter2 VARCHAR(20))
Som et resultat, ethvert forsøg i C# på at binde til
command.Parameters.Add("Parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameTer2", NpgsqlDbType.Varchar, 20);
vil fejle med fejlen. I stedet skal du binde mod parametrene med små bogstaver, dvs.
command.Parameters.Add("parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameter2", NpgsqlDbType.Varchar, 20);
Medmindre du definerer funktionen med anførselstegn:
CREATE FUNCTION "MySchema"."MyFunction"("Parameter1" VARCHAR(40), "parameTer2" VARCHAR(20))
Derfor er det vigtigt for dig at blive enige om en casing-konvention i din database/organisation og derefter holde dig til den (alle små bogstaver er ret almindeligt)
Et alternativ, omend også tilbøjeligt til at være skrøbeligt, er slet ikke at binde med navngivne parametre, og i stedet bruge parameterens ordinalposition til at binde den f.eks.
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)