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

使用Dapper向PostgreSQL存储过程传递DATE参数失败问题排查

问题描述

存储过程定义:

CREATE OR REPLACE PROCEDURE simplemenuproc(
    appcode IN VARCHAR, 
    myDtTm DATE, 
    ref1 INOUT REFCURSOR
)
LANGUAGE plpgsql
AS $BODY$
-- Procedure body
$BODY$;

调用的C#代码:

NpgsqlTransaction tran = connection.BeginTransaction();
var parameters = new DynamicParameters();
parameters.Add("appcode", "PPM", direction: ParameterDirection.Input);
parameters.Add("myDtTm", DateOnly.Parse(DateTime.UtcNow.ToString("yyyy-MM-dd")), DbType.Date, direction: ParameterDirection.Input);
parameters.Add("ref1", direction: ParameterDirection.InputOutput);

// Execute the stored procedure
await connection.ExecuteAsync(storedProcedureName, parameters, commandType: CommandType.StoredProcedure);

首次执行错误:

42883: procedure simplemenuproc(appcode => text, myDtTm => date, ref1 => unknown) does not exist

修改日期参数传递方式后:

parameters.Add("myDtTm", DateTime.UtcNow.Date, direction: ParameterDirection.Input);

错误变为:

42883: procedure simplemenuproc(appcode => text, myDtTm => timestamp with time zone, ref1 => unknown) does not exist

环境信息:

  • 数据库:PostgreSQL
  • ORM:Dapper
  • 驱动:Npgsql

问题:

  1. 如何在Dapper和Npgsql中正确向PostgreSQL存储过程传递DATE类型的动态参数?
  2. 为何参数类型看似匹配时仍找不到存储过程?
解决方案

1. 正确传递DATE类型参数

直接使用Npgsql专属的类型枚举指定参数类型,避免DbType映射的歧义,有两种可行写法:

  • 方法一:结合DateOnly类型与NpgsqlDbType.Date
parameters.Add("myDtTm", DateOnly.FromDateTime(DateTime.UtcNow), NpgsqlDbType.Date, direction: ParameterDirection.Input);
  • 方法二:使用DateTime类型并明确指定NpgsqlDbType.Date
parameters.Add("myDtTm", DateTime.UtcNow.Date, NpgsqlDbType.Date, direction: ParameterDirection.Input);

2. 参数类型看似匹配仍找不到存储过程的原因

  • ref1参数未指定类型:错误信息中的ref1 => unknown是核心问题。存储过程定义中ref1为INOUT REFCURSOR类型,但代码仅指定了参数方向,未明确类型,导致PostgreSQL无法识别该参数类型,整体参数签名与存储过程定义不匹配。
  • PostgreSQL强类型匹配机制:PostgreSQL对存储过程的参数类型是严格匹配的,只要有一个参数类型无法确定或不匹配,就会返回“存储过程不存在”的错误,不会单独提示单个参数的类型问题。
  • DbType与NpgsqlDbType映射差异:最初使用DbType.Date时,Npgsql并未精准映射为PostgreSQL的DATE类型,结合ref1的类型缺失问题,进一步导致签名不匹配。

补充:ref1参数需指定正确类型,写法如下:

parameters.Add("ref1", null, NpgsqlDbType.Refcursor, direction: ParameterDirection.InputOutput);

内容的提问来源于stack exchange,提问作者Hemanth Kumar Chilamkurthi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:50:11