Observe que o postgres permite sobrecarga de função , portanto, não apenas a função NAME precisa existir, mas os tipos dos parâmetros da função também serão usados para determinar qual sobrecarga usar, por exemplo,
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, varchar, boolean)
Não é a mesma função que
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)
etc.
Ao chamar essas funções, os nomes dos parâmetros, tipos e possivelmente pedidos devem corresponder, caso contrário, você obterá o
Uma pegadinha adicional que continua me mordendo são as regras de diferenciação de maiúsculas e minúsculas do Postgressql ao definir funções. Por exemplo, sem qualquer
""
ao redor aspas, a seguinte definição de função (usando as configurações padrão no pgAdmin 3):CREATE FUNCTION MySchema.MyFunction(Parameter1 VARCHAR(40), parameTer2 VARCHAR(20))
registra a função com a assinatura:(use uma ferramenta IDE para verificar isso)
myschema.myfunction(parameter1 VARCHAR(40), parameter2 VARCHAR(20))
Como resultado, qualquer tentativa em C# de se ligar a
command.Parameters.Add("Parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameTer2", NpgsqlDbType.Varchar, 20);
falhará com o erro. Em vez disso, você precisará vincular os parâmetros em letras minúsculas, ou seja,
command.Parameters.Add("parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameter2", NpgsqlDbType.Varchar, 20);
A menos que você defina a Função com aspas:
CREATE FUNCTION "MySchema"."MyFunction"("Parameter1" VARCHAR(40), "parameTer2" VARCHAR(20))
É por isso que é importante que você concorde com uma convenção de caixa em seu banco de dados/organização e cumpra-a (todos em minúsculas é bastante comum)
Uma alternativa, embora também propensa a ser frágil, é não vincular com parâmetros nomeados e, em vez disso, usar a posição ordinal do parâmetro, para vinculá-lo, por exemplo
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)