Lưu ý rằng postgres cho phép quá tải hàm , do đó, không chỉ hàm NAME cần tồn tại mà các loại tham số hàm cũng sẽ được sử dụng để xác định quá tải nào sẽ sử dụng, ví dụ:
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, varchar, boolean)
Không cùng chức năng với
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)
vv
Khi gọi các hàm này, tên tham số, loại và có thể cả thứ tự phải khớp, nếu không bạn sẽ nhận được
Một vấn đề khác khiến tôi đau đầu là các quy tắc phân biệt chữ hoa chữ thường của Postgressql khi xác định các hàm. Ví dụ:không có bất kỳ ""
nào xung quanh dấu ngoặc kép, định nghĩa hàm sau (sử dụng cài đặt mặc định trong pgAdmin 3):
CREATE FUNCTION MySchema.MyFunction(Parameter1 VARCHAR(40), parameTer2 VARCHAR(20))
đăng ký chức năng bằng chữ ký:(sử dụng công cụ IDE để xác minh điều này)
myschema.myfunction(parameter1 VARCHAR(40), parameter2 VARCHAR(20))
Do đó, bất kỳ nỗ lực nào trong C # để liên kết với
command.Parameters.Add("Parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameTer2", NpgsqlDbType.Varchar, 20);
sẽ thất bại với lỗi. Thay vào đó, bạn sẽ cần phải liên kết với các tham số toàn chữ thường, tức là
command.Parameters.Add("parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameter2", NpgsqlDbType.Varchar, 20);
Trừ khi bạn xác định Hàm bằng Dấu ngoặc kép:
CREATE FUNCTION "MySchema"."MyFunction"("Parameter1" VARCHAR(40), "parameTer2" VARCHAR(20))
Đó là lý do tại sao điều quan trọng là bạn phải đồng ý về quy ước cách viết hoa trong cơ sở dữ liệu / tổ chức của mình và sau đó tuân thủ nó ( tất cả chữ thường khá phổ biến)
Một giải pháp thay thế, mặc dù cũng dễ bị hỏng, là hoàn toàn không liên kết với các tham số được đặt tên, và thay vào đó, sử dụng vị trí thứ tự của tham số, để liên kết nó, ví dụ:
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)