postgresql 升级.NET Core时Postgres函数不工作

f8rj6qna  于 2023-01-12  发布在  PostgreSQL
关注(0)|答案(1)|浏览(172)

当我们把我们的.net核心和其他软件包升级到最新版本时,Postgres功能不工作。早些时候,同样的代码工作得很好。
我们正在使用函数而不是存储过程。

DbTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);

try
{
        using (DbCommand command = connection.CreateCommand())
        {
            command.Transaction = transaction;
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = Constants.StoredProcedure.SPNAME;
            command.Parameters.Add(new NpgsqlParameter("Param1", NpgsqlTypes.NpgsqlDbType.Integer)
            { Value = val1 });
            command.Parameters.Add(new NpgsqlParameter("Param2", NpgsqlTypes.NpgsqlDbType.Varchar)
            { Value = val2 });
            command.Parameters.Add(new NpgsqlParameter("Param3", NpgsqlTypes.NpgsqlDbType.Varchar)
            { Value = val3 });
            var res = command.ExecuteScalar();
            transaction.Commit();
}}

发生错误- Npgsql.postgresException:“42809:公共。NotableEventUserModeratorJoinOrder(参数1 =〉整数,参数2 =〉字符变量,参数3 =〉字符变量)不是过程
我们注解了command.CommandType = CommandType.StoredProcedure;行,然后收到错误- PostgreSQL,Npgsql返回42601:语法错误在

klsxnrf1

klsxnrf11#

这是npgsql 7中一个有文档记录的突破性更改。
关于存储过程/函数的文档还指出:
警告
从Npgsql 7.0开始,CommandType.StoredProcedure现在调用存储过程,并且不再像以前那样工作。有关详细信息以及如何退出此更改,请参阅发行说明。
有两个选择
1.禁用新功能
NpgsqlCommand.CommandType设置为CommandType.StoredProcedure时,Npgsql现在生成SQL来调用PostgreSQL存储过程,而不是像以前一样生成函数。要退出此破坏性更改并继续像以前一样调用函数,请按如下所示启用Npgsql.EnableStoredProcedureCompatMode AppContext开关:
AppContext.SetSwitch("Npgsql.EnableStoredProcedureCompatMode", true);

1.使用常规select调用函数
using var cmd = new NpgsqlCommand("SELECT my_func(1, 2)", conn);

相关问题