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

Npgsql/ Postgresql:funktionen findes ikke fejlmeddelelse, når den gør det

Bemærk, at postgres tillader funktionsoverbelastning , så ikke kun skal funktionen NAME eksistere, men typerne af funktionsparametrene vil også blive brugt til at bestemme, hvilken overbelastning der skal bruges, f.eks.

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

Er ikke den samme funktion som

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

osv.

Når du kalder disse funktioner, skal parameternavne, typer og eventuelle ordrer alle matche, ellers får du

En ekstra gotcha, der bliver ved med at bide mig, er Postgressqls regler for følsomhed over for store og små bogstaver, når funktioner defineres. For eksempel uden nogen omgivende "" citater, følgende funktionsdefinition (ved at bruge standardindstillingerne i pgAdmin 3):

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

registrerer funktionen med signaturen:(brug et IDE-værktøj til at bekræfte dette)

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

Som et resultat, ethvert forsøg i C# på at binde til

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

vil fejle med fejlen. I stedet skal du binde mod parametrene med små bogstaver, dvs.

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

Medmindre du definerer funktionen med anførselstegn:

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

Derfor er det vigtigt for dig at blive enige om en casing-konvention i din database/organisation og derefter holde dig til den (alle små bogstaver er ret almindeligt)

Et alternativ, omend også tilbøjeligt til at være skrøbeligt, er slet ikke at binde med navngivne parametre, og i stedet bruge parameterens ordinalposition til at binde den f.eks.

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)


  1. Logging Framework for ASP.NET-applikationen

  2. pandasql vil ikke importere:ImportError:kan ikke importere navn til_sql

  3. Gem streng med specialtegn som anførselstegn eller omvendt skråstreg i postgresql-tabellen

  4. Indlæs PostgreSQL-tabel fra CSV med data med kommaer mellem parenteser