在.NET中将流用作PostgreSQL参数

3
有没有办法在.NET中将Stream作为SQL参数传递,以将查询插入到Postgres的bytea/jsonb列中?由于我已经有了Stream,而这些列类型是二进制类型,所以我正在尝试将其传递给查询,而不是读取它并将其传递给byte[]/string。

就像在SQL Server的此示例使用Java的JDBC驱动程序的此示例中一样。

我尝试过类似以下的东西:
public static async Task Insert(NpgsqlConnection connection, Guid id, Stream payload)
{
    string commandText = $"INSERT INTO some_table (id, payload, occurred_on) " +
    $"VALUES (@id, @payload, @occurred_on)";
    await using var cmd = new NpgsqlCommand(commandText, connection);
    cmd.Parameters.AddWithValue("id", id);
    cmd.Parameters.AddWithValue("payload", payload);
    cmd.Parameters.AddWithValue("occurred_on", DateTime.Now);

    await cmd.ExecuteNonQueryAsync();
}

但它抛出了一个异常:

System.InvalidCastException: '无法使用ByteaHandler处理器写入CLR类型System.IO.MemoryStream'

我发现这里有一个https://www.npgsql.org/doc/copy.html#raw-binary-copy,但我想插入一行多列数据,其中一个作为流传递,如果我没记错的话,用这个方法是不可能的。


1
看起来这刚被添加到NpgSql https://github.com/npgsql/npgsql/pull/4517 - Charlieface
2个回答

3
如 Charlieface 所指出的那样,从 npgsql 版本 7.0 开始(目前处于预览阶段;我在版本 7.0.0-preview.7 上进行了测试),将有可能将一个 Stream 作为参数传递到 bytea 列中。您只需要像处理其他任何类型一样将其传递即可。唯一的例外是当 Stream 不可寻址时,需要在 DbParameter.Size 属性中提供其大小。
public static async Task Insert(NpgsqlConnection connection, Guid id, Stream payload)
{
    string commandText = $"INSERT INTO some_table (id, payload, occurred_on) " +
    $"VALUES (@id, @payload, @occurred_on)";
    await using var cmd = new NpgsqlCommand(commandText, connection);
    cmd.Parameters.AddWithValue("id", id);
    cmd.Parameters.AddWithValue("payload", payload);
    cmd.Parameters.AddWithValue("occurred_on", DateTime.Now);

    await cmd.ExecuteNonQueryAsync();
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接