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和DapperNuGet包,版本保持兼容。
内容的提问来源于stack exchange,提问作者AG70
相关产品推荐
相关产品推荐

