C#将WKT格式几何字符串存入SQL Server Geometry类型字段的方案咨询
问题原因
你当前的写法错误点在于将geometry::Parse的SQL函数调用逻辑直接作为参数值传入,参数化查询会将你传入的整个字符串视为WKT文本内容,相当于数据库最终尝试解析的WKT是geometry::Parse(POLYGON((0 0, 150 0, 150 150, 0 150, 0 0))),显然不符合WKT的格式规范,所以触发格式错误。
无需引入SQL Server Types包的实现方案
你可以直接将geometry::Parse的调用逻辑写在SQL语句中,参数仅传递纯WKT字符串即可,所有几何解析逻辑完全由SQL Server端执行,客户端不需要额外安装任何依赖包:
String shape = "POLYGON((0 0, 150 0, 150 150, 0 150, 0 0))" ; // 将geometry::Parse内置到SQL语句里,参数仅传入WKT本身 String insertSQL = "INSERT INTO x (shape) values (geometry::Parse(@shape))"; SqlCommand cmd = new SqlCommand(insertSQL, sqlConnection); cmd.CommandType = System.Data.CommandType.Text; // 直接传WKT字符串作为参数值即可 cmd.Parameters.AddWithValue("@shape", shape); cmd.ExecuteNonQuery();
如果你需要指定空间参考标识符(SRID),可以将SQL语句中的方法替换为geometry::STGeomFromText(@shape, 你的SRID数值)。
什么时候需要安装SQL Server Types Nuget包
只有当你需要在C#客户端本地处理Geometry类型数据(比如本地计算几何面积、判断空间相交关系、解析WKT为强类型对象做业务逻辑处理)时,才需要引入Microsoft.SqlServer.Types包,单纯做WKT入库转Geometry类型的场景完全不需要额外依赖。
内容的提问来源于stack exchange,提问作者IvoBardolf
相关产品推荐
相关产品推荐

