PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Npgsql/ Postgresql:функцията не съществува съобщение за грешка, когато съществува

Обърнете внимание, че postgres позволява претоварване на функции , така че не само функцията NAME трябва да съществува, но и типовете параметри на функцията също ще се използват за определяне кое претоварване да се използва, напр.

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

Не е същата функция като

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

и т.н.

Когато извиквате тези функции, имената на параметрите, типовете и евентуално поръчките трябва да съвпадат, в противен случай ще получите

Една допълнителна грешка, която продължава да ме дразни, са правилата на Postgressql за чувствителност към главни и малки букви при дефиниране на функции. Например без околни "" кавички, следната дефиниция на функция (с помощта на настройките по подразбиране в pgAdmin 3):

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

регистрира функцията със сигнатурата:(използвайте IDE инструмент, за да проверите това)

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

В резултат на това всеки опит в C# да се свърже с

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

ще се провали с грешката. Вместо това ще трябва да се свържете с параметрите с малки букви, т.е.

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

Освен ако не дефинирате функцията с кавички:

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

Ето защо е важно да се споразумеете за конвенция за малки букви във вашата база данни/организация и след това да се придържате към нея (всички малки букви е доста често)

Алтернатива, макар и склонна да бъде крехка, е изобщо да не се обвързвате с именувани параметри, а вместо това да използвате поредната позиция на параметъра, за да го обвържете, напр.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL връзката е изтекла OperationalError на Django и нов сървър

  2. PostgreSQL 13:ОГРАНИЧЕНИЕ... С ВРЪЗКИ

  3. PostgreSQL denescape JSON низ

  4. Как да създадете нова база данни с вече инсталирано разширение hstore?

  5. Разбиране на ограниченията за проверка в PostgreSQL