c# - 我如何通过 Npgsql 调用 PROCEDURE 中的 OUT 参数

标签 c# postgresql npgsql

如何通过 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/

相关文章:

sql - 将 postgres 函数的结果作为参数返回给 SQL 存储过程

Java execute() 与 executeUpdate() 刷新 Postgresql 中的物化 View

sql - 如何生成记录并将它们从表中成对传播?

c# - Npgsql 3.0.0 解析枚举类型失败

debugging - Npgsql - 不支持指定的方法

c# - 移动 Sprite 的统一无限循环(老虎机卷轴)

c# - 使用 AutoMapper 找出映射的属性

c# - 有没有办法获得 PostgreSQL 服务名称?

c# - 被四舍五入咬伤了?

C# 并定义通用主题