簡體   English   中英

使用實體框架核心在 postgresql 中執行返回原語的存儲函數

[英]Execute stored function returning primitive in postgresql using entity framework core

我有一個在 Postgresql 上運行的項目。 我使用實體框架來執行將返回一些值(長)的存儲過程。

 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 而不是函數名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM