【问题标题】:How to return the result of a postgresql function in c#? Console output empty如何在 C# 中返回 postgresql 函数的结果?控制台输出为空
【发布时间】:2015-09-23 06:57:53
【问题描述】:

我有一个问题,我在 postgresql 中有一个计算两个整数的函数,并且应该将结果返回到 c# (npgsql) 控制台,我不知道我的错误在哪里,因为调试器没有说什么我这很有帮助。

首先是c#和函数的代码。

                ...
            cmd.Parameters["x"].Value = 20;
            cmd.Parameters["y"].Value = 22;
            connection.Open();

            if (connection.State == System.Data.ConnectionState.Open) {
                //Console.WriteLine(cmd.Parameters["x"].Value);
                command.ExecuteNonQuery();
                Console.WriteLine(cmd.Parameters["sum"].Value);

            }

现在是数据库的代码:

CREATE OR REPLACE FUNCTION t2(
    IN x integer,
    IN y integer,
    OUT sum integer)
  RETURNS integer AS
$BODY$BEGIN
    sum := x + y;
    INSERT INTO  t2 (x, y, sum) values (x, y, sum);
END

所以当我尝试运行它时,

Console.WriteLine(cmd.Parameters["sum"].Value);

将为空且 ["sum"].Value 为 NULL。我究竟做错了什么?我说得对吗,当我说“sum”是一个 OUT 变量时,我不需要返回?

请帮忙。

已解决,谢谢大家! @Patrick 给了我正确的答案: 使用 ExecuteScalar() 而不是 ExecuteNonQuery()

【问题讨论】:

  • 你真的在执行命令吗?我在你的代码中看不到...
  • with command 是指函数吗?是的,我有,但我认为这不是问题? DbCommand command = connection.CreateCommand(); command.CommandText = "t2"; command.CommandType = CommandType.StoredProcedure;
  • 现在编辑了完整的代码 ;)
  • 我的意思是你的“命令”对象。您需要在打开连接后运行以“执行”开头的方法之一(抱歉,不记得是哪一个);这就是实际在数据库上运行查询的位...
  • 哦,你的意思是command.ExecuteNonQuery();?刚加了,试过了,还是不行。

标签: c# postgresql plpgsql


【解决方案1】:

而不是

command.ExecuteNonQuery();

你应该打电话

Object res = command.ExecuteScalar();
Console.WriteLine(res);

【讨论】:

  • 嗨帕特里克,不适合我。 Console.WriteLine(command.Parameters["sum"].Value); 保持为空。
  • ExecuteScalar() 返回函数调用的结果。你不应该看这里的参数,而是看调用的结果。
  • 这个我不太确定,但是Npgsql可能不支持使用PG@9​​87654325@参数。在 PG 中,声明的 OUT 参数只是 RETURNS 子句的符号变体。
  • 好的,那是真的,我得看看结果。谢谢,那行得通。所以失败是使用 ExecuteScalar() 而不是 ExecuteNonQuery()。谢谢!
  • 我是新手,我该怎么做?刚刚点击了钩子?
【解决方案2】:

您是否尝试运行此代码,例如 command.ExecuteNonQuery() ?因为您在没有实际执行查询的情况下读取值。

connection.Open();
command.ExecuteNonQuery();
int result = (int) cmd.Parameters["sum"].Value;
Console.WriteLine(result);

【讨论】:

  • 嗨,亚历克斯,对不起,我只是拿错了代码,因为我尝试了又尝试并禁用了 ExecuteNonQuery();我有它。当我尝试您的代码时,我得到一个带有int result = (int)command.Parameters["sum"].Value; 的 NullReferenceException
  • 谢谢亚历克斯。帕特里克解决了它,它是 ExecuteScalar 而不是 ExecuteNonQuery。无论如何,谢谢你。 ;)
  • 我考虑过,但删除了 ExecuteScalar 代码,因为它并不总是与输出参数一起工作 :) 很高兴您的数据提供者支持此功能。但不要太指望它
猜你喜欢
  • 2022-12-09
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 2016-01-12
  • 2017-09-06
相关资源
最近更新 更多