繁体   English   中英

如何通过 Npgsql 在 PROCEDURE 中调用 OUT 参数

[英]How can i call OUT parameter in PROCEDURE via 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 文档 一些评论:

  • 您无需在 SQL 中指定输出参数 - 只需按照PostgreSQL 文档传递一个 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM