我正在尝试使用单个命令进行大容量插入。它对int/字符串这样的简单值有效,但在插入到jsonb
列时失败。
我的表格示例:CREATE TABLE data_table2 (id INTEGER NOT NULL, name TEXT NOT NULL, test jsonb, bar jsonb)
我来自.NET的查询(如果不使用@c
参数,则可以很好地工作):"INSERT INTO data_table2 (id, name, test, bar) SELECT * FROM unnest(@a, @b, @c, @d)"
我正在创建@a
参数,如下所示:new NpgsqlParameter<int[]>(name, value)
,这将导致逐行插入(正如我所希望的)。现在,当我添加下一个@c
jsonb参数时,它失败了,而不是逐行插入,我得到了一个错误42883: function pg_catalog.unnest(jsonb) does not exist
,这是一个谎言,因为我只能在前面为id/字符串插入它。.NET中的第三个参数如下所示:new NpgsqlParameter<string[]>(name, NpgsqlTypes.NpgsqlDbType.Jsonb) { Value = value.ToJson() }
而ToJson
方法做的是:value.Select(x => Newtonsoft.Json.JsonConvert.SerializeObject(x, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })).ToArray()
我已尝试将查询更改为:"INSERT INTO data_table2 (id, name, test) SELECT * FROM unnest(@a, @b, ARRAY[@c])"
它起作用了,但前两列插入没有问题,但第三列只插入了一行,其中包含所有结果,其余行为空。
有人能帮我看看我错过了什么吗?
1条答案
按热度按时间t9aqgxwy1#
问题是您没有传入JSONB文档的数组,您必须将参数更改为
如果仍然导致相同的错误,请确保ToJson实际返回数组。
另一种选择是将JSON作为字符串数组发送,并在INSERT语句中进行转换: