PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Npgsql/ Postgresql:fungsi tidak ada pesan kesalahan saat itu

Perhatikan bahwa postgres mengizinkan fungsi yang berlebihan , jadi tidak hanya fungsi NAME yang perlu ada, tetapi jenis parameter fungsi juga akan digunakan untuk menentukan kelebihan beban mana yang akan digunakan, mis.

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

Fungsinya tidak sama dengan

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

dll.

Saat memanggil fungsi-fungsi ini, nama parameter, jenis, dan kemungkinan pesanan semuanya harus cocok, jika tidak, Anda akan mendapatkan

Satu gotcha tambahan yang terus menggigit saya adalah aturan sensitivitas huruf besar-kecil Postgressql saat mendefinisikan fungsi. Misalnya, tanpa "" di sekitarnya kutipan, definisi fungsi berikut (menggunakan pengaturan default di pgAdmin 3):

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

mendaftarkan fungsi dengan tanda tangan:(gunakan alat IDE untuk memverifikasi ini)

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

Akibatnya, setiap upaya dalam C# untuk mengikat ke

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

akan gagal dengan kesalahan. Sebagai gantinya, Anda harus mengikat parameter huruf kecil semua, yaitu

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

Kecuali jika Anda mendefinisikan Fungsi dengan Kutipan:

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

Itulah mengapa penting bagi Anda untuk menyetujui konvensi casing di database/organisasi Anda, dan kemudian mematuhinya (semua huruf kecil cukup umum)

Sebuah alternatif, meskipun juga rentan menjadi rapuh, tidak mengikat dengan parameter bernama sama sekali, dan sebagai gantinya menggunakan posisi ordinal parameter, untuk mengikatnya mis.

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 berbeda tidak berfungsi

  2. Pemicu Postgres dan penguncian baris

  3. persentil dari data histogram

  4. Rails mengatur ulang SEMUA urutan Postgres?

  5. Kembalikan tipe untuk fungsi dengan array_agg()