C#下Dapper结合MySqlGeometry如何正确读取MySQL表中Polygon几何数据
Dapper读取MySQL Polygon几何字段的调整方案
原参考实现仅能正确解析Point类型,核心问题在于两处逻辑缺陷:一是硬编码将返回值强制转为字节数组构造MySqlGeometry,丢失了连接器内置的全几何类型解析能力;二是直接查询原始几何字段时,返回的MySQL私有二进制格式和标准WKB格式不匹配,导致Polygon等复杂几何类型的字节流解析错位。
具体调整步骤
- 修正自定义类型处理器的解析逻辑
原处理器直接将值强转为byte[]构造MySqlGeometry的写法,会跳过连接器内置的几何元数据识别流程,调整后需要兼容不同返回值类型,优先调用连接器内置的WKB反序列化方法,而非裸构造对象:public class MySqlGeometryTypeHandler : SqlMapper.TypeHandler<MySqlGeometry> { public override MySqlGeometry Parse(object value) { // 兼容连接器已完成解析的MySqlGeometry实例 if (value is MySqlGeometry parsedGeometry) { return parsedGeometry; } // 处理原始字节流,调用内置反序列化方法识别全几何类型 if (value is byte[] rawBytes) { return MySqlGeometry.Deserialize(rawBytes); } throw new InvalidOperationException($"暂不支持解析类型为 {value.GetType()} 的几何字段"); } public override void SetValue(IDbDataParameter parameter, MySqlGeometry value) { // 显式指定MySQL参数的几何类型,避免映射异常 if (parameter is MySqlParameter mysqlParameter) { mysqlParameter.MySqlDbType = MySqlDbType.Geometry; } parameter.Value = value; } } - 调整SQL查询逻辑,避免私有格式解析错位
直接select *拉取原始几何字段时,MySQL返回的是带SRID前缀的私有二进制格式,和MySqlGeometry反序列化依赖的标准WKB格式不兼容,会导致Polygon等复杂几何类型的坐标偏移、类型识别错误。查询时主动将几何字段转为标准WKB格式返回即可:// 用ST_AsBinary显式返回标准WKB,必要时可同步返回SRID信息补全坐标系属性 string querySql = "SELECT id, ST_AsBinary(g) AS g FROM geo;"; List<Geo> datas = Dapper.SqlMapper.Query<Geo>(cnn, querySql).ToList(); - 补充Polygon类型的读取适配
经上述调整后,拿到的MySqlGeometry实例可通过GeometryType属性识别实际几何类型(值为3时对应Polygon),调用内置的GetPolygonData()方法即可读取多边形的环坐标点集合,无需额外第三方几何库。
注意:不要将自定义类型处理器绑定到byte[]类型上,否则会覆盖MySQL连接器本身的几何字段解析流程,重新出现仅支持Point类型的问题;类型处理器需要在首次建立数据库连接前完成注册,避免Dapper缓存旧的参数映射逻辑。
内容的提问来源于stack exchange,提问作者Daniel Gordon
相关产品推荐
相关产品推荐

