我在postgre中有类似的东西:
create type "test_complex_rec" as (
num$ numeric,
str$ character varying
)
create or replace function "test_complex_fun"(INOUT params "test_complex_rec") as
$BODY$
begin
params.num$ := params.num$ + 1;
params.str$ := 'some result';
end;
$BODY$ LANGUAGE plpgsql
和c#代码:
using (var q1 = new PgSqlCommand("test_complex_fun", connection) { CommandType = CommandType.StoredProcedure })
{
var rowType = PgSqlRowType.GetRowType("test_complex_rec", connection);
var complexValue = new PgSqlRow(rowType);
complexValue[0] = 3;
complexValue[1] = "lala";
var compositeParam = new PgSqlParameter("params", complexValue)
{
Direction = ParameterDirection.InputOutput
};
// add it manually
//q1.Parameters.Add(compositeParam);
// lets try describe from metadata
q1.ParameterCheck = true;
q1.Prepare();
q1.Parameters[0].Value = complexValue;
q1.ExecuteNonQuery(); // Anyway, we will get ArgumentOutOfRange
}
执行最后一行将引发ArgumentOutOfRange。
未处理的类型' System.ArgumentOutOfRangeException'发生在Devart.Data.dll中 附加信息:输出参数' params'的值。在命令执行结果中不存在。
使用复合参数的正确方法是什么?根据DBMonitor,它会传递正确的参数(3,' lala')来运行,但如何检索' out' c#代码中的值?