有没有一种方法可以使用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类是否可以通过非查询命令执行来访问返回的,受更新影响的行集?
答案 0 :(得分:0)
UPDATE ... RETURNING ...
返回一个常规结果集,其中包含与数据库中更新的行一样多的行。您可以像使用任何常规SELECT
一样使用DbCommand.ExecuteReader()
来使用该结果集。
OUT参数仅适用于返回标量值(或固定数量的标量值)的情况,而不适用于任意数量的行(具有任意数量的列)的情况。
通常,OUT参数在Npgsql / PostgreSQL中并不是真正有用的-无论您在考虑使用OUT参数的任何地方,都可以将输出作为常规结果集进行处理。 Read this section of the docs for more info.。