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)