Merk op dat postgres overbelasting van functies toestaat , dus niet alleen de functie NAAM moet bestaan, maar de typen functieparameters worden ook gebruikt om te bepalen welke overbelasting moet worden gebruikt, bijvoorbeeld
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, varchar, boolean)
Is niet dezelfde functie als
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)
enz.
Bij het aanroepen van deze functies moeten de parameternamen, typen en eventuele orders allemaal overeenkomen, anders krijg je de
Een bijkomend probleem dat me blijft bijten, zijn de regels voor hoofdlettergevoeligheid van Postgressql bij het definiëren van functies. Bijvoorbeeld zonder omringende ""
aanhalingstekens, de volgende functiedefinitie (met de standaardinstellingen in pgAdmin 3):
CREATE FUNCTION MySchema.MyFunction(Parameter1 VARCHAR(40), parameTer2 VARCHAR(20))
registreert de functie met de handtekening:(gebruik een IDE-tool om dit te verifiëren)
myschema.myfunction(parameter1 VARCHAR(40), parameter2 VARCHAR(20))
Als gevolg hiervan kan elke poging in C# om te binden aan
command.Parameters.Add("Parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameTer2", NpgsqlDbType.Varchar, 20);
zal mislukken met de fout. In plaats daarvan moet je binden tegen de parameters die alleen in kleine letters zijn, d.w.z.
command.Parameters.Add("parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameter2", NpgsqlDbType.Varchar, 20);
Tenzij u de functie met aanhalingstekens definieert:
CREATE FUNCTION "MySchema"."MyFunction"("Parameter1" VARCHAR(40), "parameTer2" VARCHAR(20))
Daarom is het belangrijk dat je het eens bent over een behuizingsconventie in je database / organisatie, en je daar vervolgens aan houdt (allemaal kleine letters komt vrij vaak voor)
Een alternatief, dat ook kwetsbaar is, is om helemaal niet te binden met benoemde parameters, en in plaats daarvan de ordinale positie van de parameter te gebruiken om het te binden, bijvoorbeeld
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)