postgresでは
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, varchar, boolean)
と同じ機能ではありません
CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)
など
これらの関数を呼び出すときは、パラメーター名、タイプ、場合によっては順序がすべて一致している必要があります。一致していない場合は、
を取得します。
私を悩ませ続けるもう1つの落とし穴は、関数を定義するときの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)