PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Npgsql/ Postgresql:la funzione non esiste messaggio di errore quando lo fa

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)