参数化几何sql命令c#在ASP.NET,不工作

本文关键字:NET ASP 工作 sql 命令 参数 | 更新日期: 2023-09-27 17:54:32

我已经使用了这个字符串并使用字符串连接对它进行了测试。但是,正如您所知道的,使用它来格式化sql命令是不安全的。

 SqlCommand param = new SqlCommand();
        param.CommandText = "INSERT INTO Circle (Center_Point, Circle_Data) VALUES (geometry::STGeomFromText('POINT(@center_lat @center_lng)',0),geometry::STGeomFromText('POLYGON((@polygon))',0));";
        param.Parameters.Add(new SqlParameter("@center_lat", center_lat));
        param.Parameters.Add(new SqlParameter("@center_lng", center_lng));
        param.Parameters.Add(new SqlParameter("@polygon", polygon));

我去参数化字符串,得到以下错误:

System.Data.SqlClient。SqlException (0x80131904):一个。net框架执行用户定义例程或聚合时发生错误"几何":系统。FormatException: 24141:期望在输入的第17位。输入有@center_lat。

看起来没有将值放入字符串中。但是当我遍历代码时,它确实保存了值。

有什么问题吗?

谢谢

参数化几何sql命令c#在ASP.NET,不工作

感谢我。我必须将正确的程序集添加到ASP.net项目中,这使我能够正确地设置UDT类型。更新后的代码如下。

SqlCommand param = new SqlCommand();
        SqlGeometry point = SqlGeometry.Point(center_lat,center_lng,0);
        SqlGeometry poly = SqlGeometry.STPolyFromText(new SqlChars(new SqlString(polygon)),0);
        param.CommandText = "INSERT INTO Circle (Center_Point, Circle_Data) VALUES (@point,@poly);";
        param.Parameters.Add(new SqlParameter("@point", SqlDbType.Udt));
        param.Parameters.Add(new SqlParameter("@poly", SqlDbType.Udt));
        param.Parameters["@point"].UdtTypeName = "geometry";
        param.Parameters["@poly"].UdtTypeName = "geometry";
        param.Parameters["@point"].Value = point;
        param.Parameters["@poly"].Value = poly;

对于我来说,使用MySQL几何,我必须使用MySqlGeometry类而不是SqlGeometry,就像@SammyG

的答案一样
parameters.Add(new
{
   ...
   MyGeometryObject = MySqlGeometry.Parse($"POINT({point.WGS84Lon} {point.WGS84Lat})").Value,
});