【问题标题】:Parametrizing geometry sql command c# in ASP.NET, not working在 ASP.NET 中参数化几何 sql 命令 c#,不起作用
【发布时间】:2015-06-08 08:15:42
【问题描述】:

我已经使用了这个字符串并用字符串连接对其进行了测试。但是你知道用它来格式化一个 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 框架 在执行用户定义的例程或聚合期间发生错误 “几何”:System.FormatException:24141:一个数字应该在 输入的第 17 位。输入有@center_lat。

看起来它没有将值放入字符串中。但是当我单步执行代码时,它确实保留了该值。

可能是什么问题?

谢谢

【问题讨论】:

  • ' 之间的所有内容都被视为字符串值的一部分,因此参数不会被给定值替换。
  • 关于如何解决这个问题的任何建议?我现在正在尝试方法..
  • 不确定是否有更聪明的方法,但要在保持参数不变的情况下使用 sql,您可以执行... select 'POINT(' + cast(@center_lat as varchar) + ' ' + ..... 之类的操作(注意,使用的参数类型决定了将包含的位数)
  • 我可以很好地连接字符串并且它可以工作,但是从 SQL 注入的角度来看,这不被认为是不安全的吗?这就是我参数化它的原因。
  • 如果您连接参数而不是值,则不会。我认为第一个版本使用了原始值,换句话说,连接发生在创建 sql 字符串时。 (例如" 'Point(" + center_lat。通过在字符串中使用'POINT(' + @center_lat etc ,您可以在sql 命令中进行连接,仍然使用参数化值。请注意,就Visual Studio 而言,您仍然使用一个字符串值并且不要连接任何东西。

标签: c# sql asp.net spatial-query


【解决方案1】:

感谢Me.Name。我必须将correct assemblies 添加到 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;

【讨论】:

    【解决方案2】:

    对我来说,使用 MySQL 几何,我必须使用 MySqlGeometry 类而不是 @SammyG 的答案中的 SqlGeometry

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

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 2017-03-25
      相关资源
      最近更新 更多