Observera att postgres tillåter funktionsöverbelastning , så inte bara behöver funktionen NAME existera, utan typerna av funktionsparametrarna kommer också att användas för att bestämma vilken överbelastning som ska användas, t.ex.
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, varchar, boolean)
Är inte samma funktion som
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)
etc.
När du anropar dessa funktioner måste alla parameternamn, typer och eventuella beställningar matcha, annars får du
En ytterligare gotcha som fortsätter att bita mig är Postgressqls regler för skiftlägeskänslighet när man definierar funktioner. Till exempel utan någon omgivande ""
citat, följande funktionsdefinition (med standardinställningarna i pgAdmin 3):
CREATE FUNCTION MySchema.MyFunction(Parameter1 VARCHAR(40), parameTer2 VARCHAR(20))
registrerar funktionen med signaturen:(använd ett IDE-verktyg för att verifiera detta)
myschema.myfunction(parameter1 VARCHAR(40), parameter2 VARCHAR(20))
Som ett resultat, alla försök i C# att binda till
command.Parameters.Add("Parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameTer2", NpgsqlDbType.Varchar, 20);
kommer att misslyckas med felet. Istället måste du binda mot parametrarna med små bokstäver, dvs.
command.Parameters.Add("parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameter2", NpgsqlDbType.Varchar, 20);
Såvida du inte definierar funktionen med citat:
CREATE FUNCTION "MySchema"."MyFunction"("Parameter1" VARCHAR(40), "parameTer2" VARCHAR(20))
Det är därför det är viktigt för dig att komma överens om en casingkonvention i din databas/organisation och sedan hålla dig till den (alla små bokstäver är ganska vanligt)
Ett alternativ, om än också benäget att vara bräckligt, är att inte binda med namngivna parametrar alls, utan istället använda parameterns ordningsposition för att binda den t.ex.
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)