sql >> Databasteknik >  >> RDS >> PostgreSQL

Npgsql/ Postgresql:funktionen finns inte felmeddelande när den gör det

Observera att postgres tillåter funktionsöverbelastning , så inte bara behöver funktionen NAME existera, utan typerna av funktionsparametrarna kommer också att användas för att bestämma vilken överbelastning som ska användas, t.ex.

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

Är inte samma funktion som

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

etc.

När du anropar dessa funktioner måste alla parameternamn, typer och eventuella beställningar matcha, annars får du

En ytterligare gotcha som fortsätter att bita mig är Postgressqls regler för skiftlägeskänslighet när man definierar funktioner. Till exempel utan någon omgivande "" citat, följande funktionsdefinition (med standardinställningarna i pgAdmin 3):

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

registrerar funktionen med signaturen:(använd ett IDE-verktyg för att verifiera detta)

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

Som ett resultat, alla försök i C# att binda till

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

kommer att misslyckas med felet. Istället måste du binda mot parametrarna med små bokstäver, dvs.

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

Såvida du inte definierar funktionen med citat:

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

Det är därför det är viktigt för dig att komma överens om en casingkonvention i din databas/organisation och sedan hålla dig till den (alla små bokstäver är ganska vanligt)

Ett alternativ, om än också benäget att vara bräckligt, är att inte binda med namngivna parametrar alls, utan istället använda parameterns ordningsposition för att binda den t.ex.

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. Hur avgör man om en MySQL-uppdateringsfråga lyckades när den data som skickas i frågan är densamma som den som redan finns i databasen?

  2. Hur infogar jag ett värde i en select-sats med JavaScript, speciellt när jag använder express och postgres?

  3. PL/SQL-samling:Kapslad tabell i Oracle-databas

  4. Postgresql-gräns med N grupper