Upozorňujeme, že postgres umožňuje přetížení funkcí , takže nejen že funkce NAME musí existovat, ale typy parametrů funkce budou také použity k určení, jaké přetížení použít, např.
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, varchar, boolean)
Není stejná funkce jako
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)
atd.
Při volání těchto funkcí se musí všechny názvy parametrů, typy a případně objednávky shodovat, jinak dostanete
Dalším problémem, který mě neustále kousá, jsou pravidla Postgressql pro rozlišování velkých a malých písmen při definování funkcí. Například bez jakéhokoli okolního ""
uvozovky, následující definice funkce (s použitím výchozího nastavení v pgAdmin 3):
CREATE FUNCTION MySchema.MyFunction(Parameter1 VARCHAR(40), parameTer2 VARCHAR(20))
zaregistruje funkci s podpisem:(k ověření použijte nástroj IDE)
myschema.myfunction(parameter1 VARCHAR(40), parameter2 VARCHAR(20))
Výsledkem je jakýkoli pokus v C# o vazbu na
command.Parameters.Add("Parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameTer2", NpgsqlDbType.Varchar, 20);
selže s chybou. Místo toho se budete muset vázat na parametry s malými písmeny, tj.
command.Parameters.Add("parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameter2", NpgsqlDbType.Varchar, 20);
Pokud nedefinujete funkci s uvozovkami:
CREATE FUNCTION "MySchema"."MyFunction"("Parameter1" VARCHAR(40), "parameTer2" VARCHAR(20))
Proto je důležité, abyste se ve své databázi/organizaci dohodli na konvenci velkých a malých písmen a pak se jí drželi ( všechna malá písmena je docela běžné)
Alternativou, i když také náchylnou ke křehkosti, je nesvázat se s pojmenovanými parametry vůbec a místo toho použít ordinální pozici parametru, např.
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)