You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用Dapper向PostgreSQL JSONB字段插入数据报错咨询

解决Dapper向PostgreSQL JSONB字段插入数据的问题

直接传JSON字符串报错是因为PostgreSQL不会自动将text类型转换为jsonb,下面是几种可行的解决方式:

方法1:使用Npgsql原生JSONB类型包装数据

PostgreSQL的.NET驱动Npgsql提供了NpgsqlJsonb类型,专门用于处理JSONB字段,这是最推荐的方式:

情况1:已有JSON字符串

using NpgsqlTypes;
using Dapper;

var jsonString = "{\"name\":\"test\",\"age\":25}";
var jsonbData = NpgsqlJsonb.Parse(jsonString);

var sql = "INSERT INTO your_table (jsonb_field) VALUES (@JsonbData)";
await connection.ExecuteAsync(sql, new { JsonbData = jsonbData });

情况2:从C#对象转换

直接将对象序列化为JSONB类型,无需手动拼接字符串:

using NpgsqlTypes;
using Dapper;
using System.Text.Json;

var userObj = new 
{
    Name = "test",
    Age = 25,
    Tags = new[] { "admin", "user" }
};

var jsonbData = NpgsqlJsonb.FromObject(userObj, new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase // 可选,按需求配置序列化规则
});

var sql = "INSERT INTO your_table (jsonb_field) VALUES (@JsonbData)";
await connection.ExecuteAsync(sql, new { JsonbData = jsonbData });

方法2:SQL中显式转换类型

如果不想额外处理类型,可以在SQL语句里用::jsonb将字符串强制转换为JSONB类型:

using Dapper;

var jsonString = "{\"name\":\"test\",\"age\":25}";
var sql = "INSERT INTO your_table (jsonb_field) VALUES (@JsonString::jsonb)";
await connection.ExecuteAsync(sql, new { JsonString = jsonString });

方法3:全局配置类型映射(适用于频繁操作JSONB的场景)

在程序启动时注册类型映射,让Dapper自动将指定C#类型序列化为JSONB:

using Npgsql;

// 注册自定义类型与JSONB的映射
NpgsqlConnection.GlobalTypeMapper.MapJsonb<User>();

// 后续直接传入对象即可
var user = new User { Name = "test", Age = 25 };
var sql = "INSERT INTO your_table (jsonb_field) VALUES (@User)";
await connection.ExecuteAsync(sql, new { User = user });

注意:使用前确保已安装Npgsql和Dapper NuGet包,版本保持兼容。

内容的提问来源于stack exchange,提问作者AG70

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 06:22:48