我正在将 PostgreSQL 与 .NET 项目结合使用,并且在使用动态参数传递 DATE 参数时,通过 Dapper 执行存储过程时遇到问题。
存储过程定义如下:
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
验证存储过程名称和参数类型。 myDtTm参数定义为DATE,但传递时似乎数据类型不匹配。
我的环境 数据库:PostgreSQL ORM:短小精悍 驱动程序:Npgsql
问题
如何使用 Dapper 和 Npgsql 中的动态参数正确地将 DATE 参数传递到 PostgreSQL 存储过程? 为什么参数类型看似匹配却找不到过程?
如果你现在需要就可以做
SELECT NOW() AT TIME ZONE 'UTC' AS utc_now;
在.net
NpgsqlTransaction tran = connection.BeginTransaction();
var parameters = new DynamicParameters();
parameters.Add("appcode", "PPM", direction: ParameterDirection.Input);
parameters.Add("myDtTm", DateTime.UtcNow.Date, DbType.Date, direction: ParameterDirection.Input);
parameters.Add("ref1", direction: ParameterDirection.InputOutput);
// Execute the stored procedure
await connection.ExecuteAsync(storedProcedureName, parameters, commandType: CommandType.StoredProcedure);