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

标签 c# postgresql postgis npgsql prepared-statement

我在 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/

相关文章:

postgresql - 如何将此 postgis 数据转换为我可以与 Google map /KML 一起使用的格式

sql - 遍历表,对每一行执行计算

c# - GetWindowRect 不同于 Window.Left

c# - PLINQ AsParallel().ForAll() 访问资源

c# - 图分层布局算法

sql - 用同一列中的先前值填充空值

javascript - 如何防止 Knex 在 PostgreSQL 上插入尾随空格?

java - 执行了 CallableStatement,但未返回任何内容

c# - 在 C# 中查询 Access '07 数据库的问题

postgresql - 在 postgres 中以单用户模式创建扩展工作吗?