如何在 DevArt PostgreSql dotConnect 处理复合类型参数
How to deal with composite type arguments at DevArt PostgreSql dotConnect
我在 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。
An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in Devart.Data.dll
Additional information: The value for the output parameter 'params' is absent in the command execution result.
使用复合参数的正确方法是什么?根据 DBMonitor 它将正确的参数 (3, 'lala') 传递给函数,但是如何在 c# 代码中检索 'out' 值?
修复了使用复合类型 INOUT 参数的错误:http://forums.devart.com/viewtopic.php?f=3&t=36447.
我在 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。
An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in Devart.Data.dll
Additional information: The value for the output parameter 'params' is absent in the command execution result.
使用复合参数的正确方法是什么?根据 DBMonitor 它将正确的参数 (3, 'lala') 传递给函数,但是如何在 c# 代码中检索 'out' 值?
修复了使用复合类型 INOUT 参数的错误:http://forums.devart.com/viewtopic.php?f=3&t=36447.