sql >> Database >  >> RDS >> PostgreSQL

Npgsql/ Postgresql:functie bestaat niet foutmelding wanneer dit wel het geval is

Merk op dat postgres overbelasting van functies toestaat , dus niet alleen de functie NAAM moet bestaan, maar de typen functieparameters worden ook gebruikt om te bepalen welke overbelasting moet worden gebruikt, bijvoorbeeld

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

Is niet dezelfde functie als

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

enz.

Bij het aanroepen van deze functies moeten de parameternamen, typen en eventuele orders allemaal overeenkomen, anders krijg je de

Een bijkomend probleem dat me blijft bijten, zijn de regels voor hoofdlettergevoeligheid van Postgressql bij het definiëren van functies. Bijvoorbeeld zonder omringende "" aanhalingstekens, de volgende functiedefinitie (met de standaardinstellingen in pgAdmin 3):

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

registreert de functie met de handtekening:(gebruik een IDE-tool om dit te verifiëren)

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

Als gevolg hiervan kan elke poging in C# om te binden aan

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

zal mislukken met de fout. In plaats daarvan moet je binden tegen de parameters die alleen in kleine letters zijn, d.w.z.

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

Tenzij u de functie met aanhalingstekens definieert:

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

Daarom is het belangrijk dat je het eens bent over een behuizingsconventie in je database / organisatie, en je daar vervolgens aan houdt (allemaal kleine letters komt vrij vaak voor)

Een alternatief, dat ook kwetsbaar is, is om helemaal niet te binden met benoemde parameters, en in plaats daarvan de ordinale positie van de parameter te gebruiken om het te binden, bijvoorbeeld

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. SELECT resultatenset gebruiken om UPDATE-query uit te voeren met MySQL Stored Procedures

  2. Een inleiding tot SQL-indexen

  3. Hoe Hangfire te configureren met Mysql-opslag

  4. MySQL Groeperen op datums tussen