我在 Npgsql 命令中有这个参数化查询:
UPDATE raw.geocoding
SET the_geom = ST_Transform(ST_GeomFromText('POINT(:longitude :latitude)', 4326),3081)
WHERE id=:id
:longutide
和 :latitude
是double,id
是int .
实际针对数据库运行的查询如下所示:
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/