使用 entity framework 核心在 postgresql 中执行返回原语的存储函数
Execute stored function returning primitive in postgresql using entity framework core
我有一个关于 Postgresql 的项目 运行。我使用 Entity framework 来执行将 return 一些值(长)的存储过程。
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 也总是 returns -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 来执行将 return 一些值(长)的存储过程。
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 也总是 returns -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 而不是函数名。