Tieni presente che postgres consente il sovraccarico di funzioni , quindi non solo la funzione NAME deve esistere, ma verranno utilizzati anche i tipi dei parametri della funzione per determinare quale overload utilizzare, ad es.
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, varchar, boolean)
Non è la stessa funzione di
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)
ecc.
Quando si chiamano queste funzioni, i nomi dei parametri, i tipi e possibilmente gli ordini devono corrispondere tutti, altrimenti otterrai il
Un altro trucco che continua a mordermi sono le regole di distinzione tra maiuscole e minuscole di Postgressql durante la definizione delle funzioni. Ad esempio, senza alcun ""
circostante virgolette, la seguente definizione di funzione (usando le impostazioni predefinite in pgAdmin 3):
CREATE FUNCTION MySchema.MyFunction(Parameter1 VARCHAR(40), parameTer2 VARCHAR(20))
registra la funzione con la firma:(usa uno strumento IDE per verificarlo)
myschema.myfunction(parameter1 VARCHAR(40), parameter2 VARCHAR(20))
Di conseguenza, qualsiasi tentativo in C# di eseguire l'associazione a
command.Parameters.Add("Parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameTer2", NpgsqlDbType.Varchar, 20);
fallirà con l'errore. Invece, dovrai eseguire il binding con i parametri tutti minuscoli, ad es.
command.Parameters.Add("parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameter2", NpgsqlDbType.Varchar, 20);
A meno che tu non definisca la funzione con virgolette:
CREATE FUNCTION "MySchema"."MyFunction"("Parameter1" VARCHAR(40), "parameTer2" VARCHAR(20))
Ecco perché è importante per te concordare una convenzione sull'involucro nel tuo database/organizzazione e quindi attenerti ad essa (tutto minuscolo è abbastanza comune)
Un'alternativa, sebbene incline anche a essere fragile, è non legare affatto con parametri denominati, e utilizzare invece la posizione ordinale del parametro, per legarlo ad es.
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)