使用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
问题:
- 如何在Dapper和Npgsql中正确向PostgreSQL存储过程传递DATE类型的动态参数?
- 为何参数类型看似匹配时仍找不到存储过程?
解决方案
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
相关产品推荐
相关产品推荐

