postgresql - 使用 Entity Framework 核心在postgresql中执行存储函数返回原语

标签 postgresql .net-core stored-procedures npgsql

我有一个在 Postgresql 上运行的项目。我使用 Entity Framework 来执行将返回一些值(长)的存储过程。

 public override long GetHostSequenceNumber(byte hostId, byte srvId)
 {
    var hId = new Npgsql.NpgsqlParameter("@host_id", hostId);
    var sId = new Npgsql.NpgsqlParameter("@srv_id", srvId);
    var res = this.Database.SqlQuery<long>("select * from  dbo.bs_p_get_host_seqno( @host_id,@srv_id)", hId, sId).SingleOrDefault();
    return res;
  }

简单地说,假设此过程在某些表中搜索某些特定值。

而且效果很好。但是现在我切换到 Core 2.0,我找不到做同样事情的方法。我读过一些文章,他们说要使用 FromSql,但我不能使用它,因为我没有任何要添加到 DbContext 的实体。我也试过使用 ADO 并执行 SQL 命令,但结果总是 -1。

public override long GetHostSequenceNumber(byte hostId, byte srvId)
    {
        var hId = new Npgsql.NpgsqlParameter("@host_id", hostId);
        var sId = new Npgsql.NpgsqlParameter("@srv_id", srvId);
        var res = this.Database.ExecuteSqlCommand("select * from  bs_p_get_host_seqno(@host_id,@srv_id)", hId,sId);
        return res;
    }

但是 ExecuteSqlCommand 也总是返回 -1 并且它是 int 类型,我不知道如何得到我需要的结果。

最佳答案

所以我让它工作了。这是代码。

using (var command = this.Database.GetDbConnection().CreateCommand())
{
    command.CommandType = CommandType.StoredProcedure;
    command.CommandText = "bs_p_get_host_seqno";
    command.Parameters.Add(new Npgsql.NpgsqlParameter("host_id", NpgsqlTypes.NpgsqlDbType.Smallint)
    { Value = hostId });
    command.Parameters.Add(new Npgsql.NpgsqlParameter("srv_id", NpgsqlTypes.NpgsqlDbType.Smallint)
    { Value = srvId });
    if (command.Connection.State == ConnectionState.Closed)
        command.Connection.Open();
    var res = (long)command.ExecuteScalar();
    return res;
}

我的问题是我将“select * from bs_p_get_host_seqno”放入 command.CommandText 而不是函数名。

关于postgresql - 使用 Entity Framework 核心在postgresql中执行存储函数返回原语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47833763/

相关文章:

c# - 数据库事务中的并发线程导致 .NET Core EF Core 中的重大延迟

MySQL ORDER BY 与数字变量

ruby-on-rails - Windows 上的 PostgreSQL 和 Ruby 问题

postgresql - PostgresDB数据类型名称中的 "H"中的 "HStore"是什么意思?

sql - 将 1 周添加到时间戳

postgresql - DBIx::Class/SQL::Abstract 将 SQL 函数应用于 WHERE 子句中的列

.net-core - 在 MassTransit 消费者内部注入(inject)依赖项

c# - 如何在asp.net core中的startup.cs文件的configure方法中更改作用域服务的属性值

mysql - 增加一行中的列值

java - 使用 JDBC 调用 sql server 存储过程时出现 java.lang.NullPointerException