【问题标题】:Npgsql parameterized query output incompatible with PostGISNpgsql 参数化查询输出与 PostGIS 不兼容
【发布时间】:2012-09-14 18:17:23
【问题描述】:

我在 Npgsql 命令中有这个参数化查询:

UPDATE raw.geocoding
SET the_geom = ST_Transform(ST_GeomFromText('POINT(:longitude :latitude)', 4326),3081)
WHERE id=:id

:longutide:latitudedoubleidint

实际针对数据库运行的查询如下所示:

UPDATE raw.geocoding
SET the_geom = ST_Transform(ST_GeomFromText('POINT(((E'-96.6864379495382')::float8) ((E'32.792527154088')::float8))', 4326),3081)
WHERE id=((10793455)::int4)

感谢 Erwin Brandstetter here 的帮助,很明显需要简化查询以使用 PostGIS。他建议这样做:

UPDATE raw.geocoding
SET    the_geom = ST_Transform(ST_GeomFromText(
                  $$POINT(:longitude :latitude)$$::geometry, 4326), 3081)
WHERE  id = :id

我想我可以使用动态查询来创建它,每次运行时我都会手动更新查询,但是有没有办法使用 Npgsql 参数化查询来实现它?

【问题讨论】:

    标签: c# postgresql postgis npgsql sql-parametrized-query


    【解决方案1】:

    我不是npgsql 的专家,但我认为您的参数化查询可以这样工作:

    UPDATE raw.geocoding
    SET    the_geom = ST_Transform(ST_GeomFromText(:mygeom, 4326), 3081)
    WHERE  id = :id
    

    mygeom 会保存这个字符串:

    POINT(96.6864379495382 32.792527154088)
    

    .. 从您的其他变量中预先组装。会产生这样的查询:

    UPDATE raw.geocoding
    SET    the_geom = ST_Transform(ST_GeomFromText(
                 (E'POINT(96.6864379495382 32.792527154088)')::text, 4326),3081)
    WHERE  id=((10793455)::int4)
    

    应该可以。


    如果您在组装字符串时遇到问题(如您的评论所示),还有一种更优雅的方法。根据hint from @Paul on my previous answer - PostGIS 为此目的提供了一个专用功能:

    ST_MakePoint(double precision x, double precision y)
    

    Details in the manual。有了这个,我们终于到达了:

    UPDATE raw.geocoding
    SET    the_geom = ST_Transform(ST_SetSRID(
                   ST_MakePoint(:longitude, :latitude), 4326), 3081)
    WHERE  id = :id
    

    注意逗号。它现在终于可以工作了吗?
    如果不行,就用大锤敲打它。 Grml.

    确实如此 - 现在使用 ST_SetSRID() 而不是 ST_GeomFromText()。见评论。

    【讨论】:

    • 不幸的是,它仍然添加类型和转义:UPDATE raw.geocoding SET the_geom = ST_Transform(ST_GeomFromText('POINT(((E'-96.8569734692574 32.6630535721779')::varchar))', 4326),3081) WHERE id=((12490336)::int4),这会导致不同的语法错误:ERROR: 42601: syntax error at or near "32.6630535721779"。我的直觉是动态构造的查询。
    • @ArenCambre:这玩意不会被杀死吧?我又加了一个。
    • 谢谢。这适用于一个例外:ST_GeomFromText 变为 ST_SetSRIDST_GeomFromText 是不必要的,因为 ST_MakePoint 提出了一个观点,所以没有要转换的文本。相反,我只需要设置点的 SRID。感谢您对此的帮助!
    • @ArenCambre 有道理。我修改了最终开始工作的参数化查询的答案。耶! :)
    【解决方案2】:

    就我而言,我使用的是:

    NpgsqlCommand command = new NpgsqlCommand(
                    "select ST_Distance( ST_SetSRID(" +
                        "ST_MakePoint(@longitude, @latitude), 4326)," +
                        "(select geom from segments where segment_id= @id )," +
                        "true)",
                        m_DBConnection);
    

    它奏效了。另外,请尝试:

     NpgsqlCommand command = new NpgsqlCommand(
                    "select ST_AsText( ST_ClosestPoint( ST_GeomFromText('POINT(" +
                        longitude.ToString(CultureInfo.GetCultureInfo("en-US").NumberFormat) + " " +
                        latitude.ToString(CultureInfo.GetCultureInfo("en-US").NumberFormat) + ")', 4326)," +
                            "(select geom from segments where segment_id= @id )))",
                            m_DBConnection);
    

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 2021-01-25
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      相关资源
      最近更新 更多