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

如何在无SQL Server环境下用C#借助Microsoft.SqlServer.Types将gml:Polygon转换为SQL Server Geometry十六进制字符串

将SqlGeometry转换为SQL Server内部十六进制字符串的正确方法

你已经通过GeomFromGml成功生成了SqlGeometry对象,现在要得到和SSMS中convert(geometry, ...)返回完全一致的十六进制字符串,核心问题在于:STAsBinary()返回的是标准WKB格式,而你需要的是SQL Server专属的内部二进制存储格式。

解决方案

直接使用SqlGeometry的Serialize()方法获取SQL Server原生的二进制数据,再把它转换成带0x前缀的十六进制字符串就行,具体步骤如下:

  1. 调用Serialize()获取SqlBytes,这就是SQL Server存储geometry时用的二进制内容
  2. 将SqlBytes转成字节数组,再格式化为十六进制字符串(记得加0x前缀)

完整代码示例

using System;
using System.Data.SqlTypes;
using System.IO;
using System.Text;

class GeometryConversionDemo
{
    static void Main()
    {
        // 你的GML多边形字符串
        string gmlInput = "<gml:Polygon xmlns:gml=\"http://www.opengis.net/gml\"><gml:exterior><gml:LinearRing><gml:posList>1 2 3 4 5 6 1 2</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>";
        
        // 转成SqlXml供GeomFromGml使用
        SqlXml gmlXml = new SqlXml(new MemoryStream(Encoding.UTF8.GetBytes(gmlInput)));
        SqlGeometry targetGeometry = SqlGeometry.GeomFromGml(gmlXml, 4326);

        // 获取SQL Server内部格式的二进制数据
        SqlBytes internalBinaryData = targetGeometry.Serialize();
        byte[] byteArray = internalBinaryData.Value;

        // 转换为目标十六进制字符串
        string sqlHexString = "0x" + BitConverter.ToString(byteArray).Replace("-", "").ToUpper();

        // 输出结果和SSMS里的convert结果完全一致
        Console.WriteLine(sqlHexString);
    }
}

为什么之前的尝试不对?

你之前用STAsBinary()拿到的是**OGC标准的WKB(Well-Known Binary)**格式,这个格式只包含几何形状的基础信息,没有SQL Server额外存储的元数据(比如SRID的存储方式、内部结构标记等)。而Serialize()方法返回的是SQL Server为geometry类型定义的专属二进制格式,和数据库里存储的、SSMS显示的内容完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:27:35