如何通过 Npgsql 调用 PROCEDURE 中的 OUT 参数
当我运行下面的代码时出现此错误
-- PostgreSQL 14 -> 过程
CREATE OR REPLACE PROCEDURE sp_add_users_new(arrJsnUsers JSON[], jOut OUT JSON) AS $$
DECLARE
intSpStatus INT;
v json;
BEGIN
FOREACH v IN ARRAY arrJsnUsers
LOOP
INSERT INTO tbl_user (vhr_name, vhr_password, sin_record_status)
VALUES(v->>'strName', v->>'strPassword', (v->>'intRecordStatus')::SMALLINT);
END LOOP;
COMMIT;
intSpStatus = 1;
jOut['intSpStatus'] = intSpStatus;
END;
$$ LANGUAGE plpgsql
--点网核心5
using (NpgsqlConnection objCon = new NpgsqlConnection("..."))
{
objCon.Open();
using (NpgsqlCommand objSqlCommand = new NpgsqlCommand("CALL sp_add_users_new(:p1, :p2)", objCon))
{
// Parameters
NpgsqlParameter[] lstSqlParameter = {
new NpgsqlParameter("p1", NpgsqlDbType.Array|NpgsqlDbType.Json) {
Value = lstUsers,
DataTypeName = "arrJsnUsers"
},
new NpgsqlParameter("p2", NpgsqlDbType.Json) {
Value = jOut,
DataTypeName = "jOut",
Direction = ParameterDirection.Output
},
};
objSqlCommand.Parameters.AddRange(lstSqlParameter);
// Execute
IDataReader objDataReader = objSqlCommand.ExecuteReader();
}
objCon.Close();
}
--错误
42703: column "p2" does not exist
最佳答案
下面是一个有效的示例 - 建议阅读 Npgsql docs on this 。一些评论:
- 您无需在 SQL 中指定输出参数 - 只需按照 PostgreSQL docs 传递 NULL .
- 由于 @p2 是输出参数,因此指定其值没有任何意义(上面的
jOut1
)。 - DataTypeName(上面的
jOut
)在这里也没有意义;用于向 Npgsql 指示要发送哪种 PG 类型作为输入参数(类似于 NpgsqlDbType)。
using var objCon = new NpgsqlConnection("Host=localhost;Username=test;Password=test");
objCon.Open();
using var objSqlCommand = new NpgsqlCommand("CALL sp_add_users_new(@p1, NULL)", objCon);
// Parameters
var lstUsers = new[] { @"{ ""Foo"": ""Bar"" }" };
NpgsqlParameter[] lstSqlParameter = {
new NpgsqlParameter("p1", NpgsqlDbType.Array|NpgsqlDbType.Json) { Value = lstUsers, DataTypeName = "arrJsnUsers"},
new NpgsqlParameter("p2", NpgsqlDbType.Json) { Direction = ParameterDirection.Output},
};
objSqlCommand.Parameters.AddRange(lstSqlParameter);
// Execute
IDataReader objDataReader = objSqlCommand.ExecuteReader();
Console.WriteLine(objSqlCommand.Parameters[1].Value);
关于c# - 我如何通过 Npgsql 调用 PROCEDURE 中的 OUT 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72413889/