具有多个受影响的行的RETURNING子句

时间:2018-12-05 05:43:28

标签: c# npgsql

有没有一种方法可以使用Npgsql使用准备好的UPDATE语句,该语句可以从RETURNING子句返回多个受影响的行?

当返回受影响的一行时,通过将RETURNING参数标记为Out方向参数并从命令参数中获取其返回值,我已经能够实现这一点,但这仅在更新了一行的情况下有效: / p>

string sql = "UPDATE my_schema.jobs SET order_number=@order_number WHERE job_id = @job_id RETURNING job_id, order_number, created_time, state;"

var stmt = new NpgsqlCommand(sql, connection, transaction);

stmt.Parameters.Add("job_id", NpgsqlDbType.Bigint);
stmt.Parameters.Add("order_number", NpgsqlDbType.Varchar);

var outParam = new NpgsqlParameter("created_time", NpgsqlDbType.Bigint) { Direction = System.Data.ParameterDirection.Output };
stmt.Parameters.Add(outParam);

outParam = new NpgsqlParameter("state", NpgsqlDbType.Varchar) { Direction = System.Data.ParameterDirection.Output };
stmt.Parameters.Add(outParam);

await stmt.PrepareAsync(cancel);

...

stmt.Parameters["job_id"].Value = 10;
stmt.Parameters["order_number"].Value = "BT100";

int recordsAffected = await stmt.ExecuteNonQueryAsync(cancel);

if (recordsAffected != 0)
{
   long returnedJobId = stmt.Parameters["job_id"].Value as long;
   string returnedOrder = stmt.Parameters["order_number"].ToString();
   long returnedCreated = stmt.Parameters["created_time"].Value as long;
   string returnedState = stmt.Parameters["state"].ToString();
}

但是,如果有多个行与WHERE子句匹配,则PSQL语句可以从RETURNING子句返回多行。 NpgsqlCommand类是否可以通过非查询命令执行来访问返回的,受更新影响的行集?

1 个答案:

答案 0 :(得分:0)

UPDATE ... RETURNING ...返回一个常规结果集,其中包含与数据库中更新的行一样多的行。您可以像使用任何常规SELECT一样使用DbCommand.ExecuteReader()来使用该结果集。

OUT参数仅适用于返回标量值(或固定数量的标量值)的情况,而不适用于任意数量的行(具有任意数量的列)的情况。

通常,OUT参数在Npgsql / PostgreSQL中并不是真正有用的-无论您在考虑使用OUT参数的任何地方,都可以将输出作为常规结果集进行处理。 Read this section of the docs for more info.