gpt4 book ai didi

c# - Npgsql 参数化查询输出与 PostGIS 不兼容

转载 作者:太空狗 更新时间:2023-10-30 00:54:33 30 4
gpt4 key购买 nike

我在 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 参数化查询一起工作?

最佳答案

我不是 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

注意逗号。现在终于可以用了吗?
如果没有,就用大锤敲打它。咕噜咕噜。

确实如此 - 使用 ST_SetSRID()现在代替 ST_GeomFromText()。见评论。

关于c# - Npgsql 参数化查询输出与 PostGIS 不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12429874/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com