You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core调用带OUT参数的PostgreSQL存储过程时触发42883错误:存储过程不存在

.NET Core调用带OUT参数的PostgreSQL存储过程时触发42883错误:存储过程不存在

我来帮你捋清楚这个问题,PostgreSQL抛出的42883错误本质是找不到匹配签名的存储过程,问题根源出在你调用存储过程的语法上,和你的.NET Core代码参数设置的逻辑无关。

为什么会出现这个错误?

PostgreSQL对存储过程的签名匹配是严格包含所有参数的——不管是IN、OUT还是INOUT参数,都会被算进存储过程的签名里。你代码里的CALL usp_delete_announcements(@in_id)语句只传入了1个IN参数,但你的实际存储过程应该是包含1个IN + 3个OUT参数的(总共4个参数),所以PostgreSQL会去寻找仅接收1个IN参数的usp_delete_announcements,自然找不到,就抛出了“不存在”的错误。

怎么解决?

你需要修正CALL语句,把所有参数(包括OUT参数的占位符)都明确列出来,让PostgreSQL能匹配到正确的存储过程签名。具体修改如下:

修正后的完整代码

using (NpgsqlConnection conn = new NpgsqlConnection(connectionString))
{
    conn.Open();
    // 关键修改:在CALL语句中添加所有OUT参数的占位符
    using (NpgsqlCommand cmd = new NpgsqlCommand("CALL usp_delete_announcements(@in_id, @out_announcements_id, @out_error_code, @out_message)", conn))
    {
        cmd.CommandType = CommandType.Text; 
        cmd.Parameters.AddWithValue("@in_id", Convert.ToInt32(strDecryptedId));
        // 以下OUT参数的设置无需改动
        cmd.Parameters.Add("@out_announcements_id", NpgsqlTypes.NpgsqlDbType.Integer).Direction = ParameterDirection.Output;
        cmd.Parameters.Add("@out_error_code", NpgsqlTypes.NpgsqlDbType.Integer).Direction = ParameterDirection.Output;
        cmd.Parameters.Add("@out_message", NpgsqlTypes.NpgsqlDbType.Varchar).Direction = ParameterDirection.Output;
        cmd.ExecuteNonQuery();
        response.Id = (int)cmd.Parameters["@out_announcements_id"].Value;
        response.Message = cmd.Parameters["@out_message"].Value.ToString();
    }
}

额外需要确认的几个点

  1. 核对存储过程的实际定义
    你可以在PostgreSQL的psql工具里执行\df+ usp_delete_announcements,或者通过查询系统表确认存储过程的完整参数列表:

    SELECT 
        parameter_name, 
        mode, 
        data_type 
    FROM information_schema.parameters 
    WHERE specific_name = 'usp_delete_announcements';
    

    确保参数的数量、类型、方向(IN/OUT)和你代码里的设置完全匹配。

  2. 关于CommandType的说明
    你设置的cmd.CommandType = CommandType.Text;是完全正确的,Npgsql对PostgreSQL存储过程的调用推荐用文本执行CALL语句,不要用CommandType.StoredProcedure(这个更多是为兼容SQL Server等数据库的存储过程调用逻辑)。

  3. 参数名称的一致性
    确认你代码里的参数名称(比如@in_id)和存储过程定义里的参数名称完全一致,PostgreSQL会根据名称匹配参数,避免因为名称不匹配导致的隐性错误。

备注:内容来源于stack exchange,提问作者yaminisai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 10:45:28