sql >> Base de Datos >  >> RDS >> PostgreSQL

Npgsql/ Postgresql:la función no existe mensaje de error cuando existe

Tenga en cuenta que postgres permite sobrecarga de funciones , por lo que no solo es necesario que exista la función NOMBRE, sino que los tipos de los parámetros de la función también se usarán para determinar qué sobrecarga usar, por ejemplo,

CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, varchar, boolean)   

No es la misma función que

CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)

etc

Al llamar a estas funciones, los nombres de los parámetros, los tipos y posiblemente los órdenes deben coincidir; de lo contrario, obtendrá el

Un problema adicional que me sigue molestando son las reglas de distinción entre mayúsculas y minúsculas de Postgressql al definir funciones. Por ejemplo, sin ningún "" circundante entre comillas, la siguiente definición de función (usando la configuración predeterminada en pgAdmin 3):

CREATE FUNCTION MySchema.MyFunction(Parameter1 VARCHAR(40), parameTer2 VARCHAR(20))

registra la función con la firma:(use una herramienta IDE para verificar esto)

myschema.myfunction(parameter1 VARCHAR(40), parameter2 VARCHAR(20))

Como resultado, cualquier intento en C# de vincular a

command.Parameters.Add("Parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameTer2", NpgsqlDbType.Varchar, 20);

fallará con el error. En su lugar, deberá enlazar con los parámetros en minúsculas, es decir,

command.Parameters.Add("parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameter2", NpgsqlDbType.Varchar, 20);

A menos que defina la función con comillas:

CREATE FUNCTION "MySchema"."MyFunction"("Parameter1" VARCHAR(40), "parameTer2" VARCHAR(20))

Por eso es importante que acuerde una convención de mayúsculas y minúsculas en su base de datos/organización y luego respétela (todo en minúsculas es bastante común)

Una alternativa, aunque también propensa a ser frágil, es no enlazar con parámetros con nombre en absoluto, y en su lugar usar la posición ordinal del parámetro, para enlazarlo, por ejemplo,

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)