C# 将字符串作为几何图形保存到数据库

Posted

技术标签:

【中文标题】C# 将字符串作为几何图形保存到数据库【英文标题】:C# Save String To Database As Geometry 【发布时间】:2021-12-11 22:15:49 【问题描述】:

现在我们正在以字符串的形式获取几何数据,我们需要将其作为 Geometry 类型保存到我们的 SQL 数据库中。

目前,我正在尝试做一些看起来像这样的事情

String shape = "POLYGON((0 0, 150 0, 150 150, 0 150, 0 0))" ;
String insertSQL = "INSERT INTO x (shape) values (@shape)";

SqlCommand cmd = new SqlCommand(insertSql, sqlConnection);
cmd.CommandType = System.Data.Text;

cmd.Parameters.AddWithValue("@shape", "geometry::Parse("+shape+")");

cmd.ExecuteNonQuery();

每次执行查询都会出错:

“在执行用户定义的例程或聚合“几何”期间发生 .NET Framework 错误:

System.FormatException: 24114: 输入知名文本 (WKT) 中的标签 geometry::Parse('POL 无效。有效标签为 POINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION、CIRCULARSTRING 、COMPOUNDCURVE、CURVEPOLYGON 和 FULLGLOBE(仅限地理数据类型)。

System.FormatException:

在 Microsoft.SqlServer.Types.OpenGisTypes.ParseLabel(字符串输入) 在 Microsoft.SqlServer.Types.WellKnownTextReader.ParseTaggedText(OpenGisType 类型) 在 Microsoft.SqlServer.Types.WellKnownTextReader.Read(OpenGisType 类型,Int32 srid) 在 Microsoft.SqlServer.Types.SqlGeometry.GeometryFromText(OpenGisType 类型,SqlChars 文本,Int32 srid) 在 Microsoft.SqlServer.Types.SqlGeometry.Parse(SqlString s)。

语句已终止。"

有没有办法在不导入 SQL SERVER Types 包的情况下直接完成此任务?或者是实现这一目标的唯一方法是包含 Nuget 包并从那里开始?

【问题讨论】:

您可以提供minimal reproducible example,而不是“看起来像这样的东西”?当前代码无法编译,问题完全可能在于您的实际代码与您向我们展示的代码之间的差异之一。 您确定文本是您认为的那样吗?也许有一个看不见的字符,或者Y不是英文Y? 请注意,使用编辑后的代码,您根本没有使用 shape 变量... 一个字符串 包含 geometry::Parse 一点也不像对geometry::Parse实际调用,它传递一个字符串。无论发生什么其他事情,都不应该将其嵌入到参数声称的“值”中。 不能参数化调用sql函数... 【参考方案1】:

SQL 查询中的参数用于防止 SQL 注入 - 这意味着您在查询参数中包含的任何内容都不会被视为数据以外的任何内容,不会被评估,因此geometry::Parse 不会运行。试试这样的:

String shape = "POLYGON((0 0, 150 0, 150 150, 0 150, 0 0))" ;
String insertSQL = "INSERT INTO x (shape) values (geometry::Parse(@shape))";

SqlCommand cmd = new SqlCommand(insertSql, sqlConnection);
cmd.CommandType = System.Data.Text;

cmd.Parameters.AddWithValue("@shape", shape);

cmd.ExecuteNonQuery();

【讨论】:

我不敢相信我没有想到将函数调用放在插入 sql 中,这很有效。谢谢! 小提琴供参考dbfiddle.uk/…

以上是关于C# 将字符串作为几何图形保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

C# - Emgu Cv - 人脸识别 - 将保存到 Access 数据库的人脸训练集作为二进制文件加载到 EigenObjectRecognizer 中以进行人脸识别

matplotlib 可以将元数据添加到保存的图形中吗?

C# 保存对象

C# Bitmap.Save 将图像作为路径保存到其他位置

C#怎样将数组作为文件流保存起来

如何将图形保存为png或jpg文件c#