Pamiętaj, że postgres umożliwia przeciążanie funkcji , więc nie tylko funkcja NAZWA musi istnieć, ale typy parametrów funkcji będą również używane do określenia, którego przeciążenia użyć, np.
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, varchar, boolean)
To nie ta sama funkcja, co
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)
itp.
Podczas wywoływania tych funkcji wszystkie nazwy parametrów, typy i prawdopodobnie zamówienia muszą być zgodne, w przeciwnym razie otrzymasz
Dodatkowym problemem, który mnie ciągle gryzie, są reguły uwzględniania wielkości liter w Postgressql podczas definiowania funkcji. Na przykład bez otaczającego ""
cudzysłowy, następująca definicja funkcji (przy użyciu domyślnych ustawień w pgAdmin 3):
CREATE FUNCTION MySchema.MyFunction(Parameter1 VARCHAR(40), parameTer2 VARCHAR(20))
rejestruje funkcję z podpisem:(użyj narzędzia IDE, aby to sprawdzić)
myschema.myfunction(parameter1 VARCHAR(40), parameter2 VARCHAR(20))
W rezultacie każda próba powiązania w C# z
command.Parameters.Add("Parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameTer2", NpgsqlDbType.Varchar, 20);
nie powiedzie się z błędem. Zamiast tego będziesz musiał powiązać się z parametrami pisanymi małymi literami, tj.
command.Parameters.Add("parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameter2", NpgsqlDbType.Varchar, 20);
Chyba że zdefiniujesz funkcję za pomocą cudzysłowów:
CREATE FUNCTION "MySchema"."MyFunction"("Parameter1" VARCHAR(40), "parameTer2" VARCHAR(20))
Dlatego ważne jest, abyś zgodził się na konwencję wielkości liter w swojej bazie danych / organizacji, a następnie się jej trzymał (wszystkie małe jest dość powszechne)
Alternatywą, choć również podatną na delikatność, jest nie wiązanie w ogóle z nazwanymi parametrami, a zamiast tego użycie pozycji porządkowej parametru, aby go powiązać np.
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)