当我们把我们的.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:语法错误在
1条答案
按热度按时间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);