当它们成为更大字符串的一部分时,添加prepare语句变量

时间:2012-04-18 09:02:10

标签: postgresql postgis

基本上我的问题是这个。我有一个sql语句,它是从我的数据库中的表中获取的。此SQL语句在其中包含用于预准备语句变量的占位符。我正在使用包装器类来处理替换变量。包装器类处理在传递给PostgreSQL时确保它们是正确的类型。我在声明中遇到语法错误,这让我很生气。预准备语句的一部分是ST_GeomFromText()函数中使用的字符串。此字符串的值通过预准备语句变量填充。奇怪的是,变量不仅仅被连接到字符串中,而是被我收到的错误的外观视为单独的实体。请参阅下面的我尝试过的查询示例和错误消息。

任何人都可以对此有所了解吗?这让我很生气。我必须能够从文本构建此几何体,并且参数必须能够通过预准备语句传递。我已经跟踪了C#中的跟踪,它结束了将值作为字符串传递给我的命令对象参数,因此在我能够查看的代码中没有进行转换会使这些被视为除字符串之外的任何内容。

语句(从表中返回)

数字1.带值

select st_xmin(a) minx, st_ymin(a) miny, st_xmax(a) maxx, st_ymax(a) maxy 
from 
   ST_ENVELOPE(
       ST_TRANSFORM(
          ST_GeomFromText('POLYGON(('||138082||' '||12907||','||207179||' '||12907||','||207179||' '||88647||','||138082||' '||88647'||','||138082||' '||12907||'))',27700),4326)) 
as a

数字1.没有值

select st_xmin(a) minx, st_ymin(a) miny, st_xmax(a) maxx, st_ymax(a) maxy 
from 
   ST_ENVELOPE(
      ST_TRANSFORM(
         ST_GeomFromText('POLYGON(('||:0||' '||:1||','||:2||' '||:3||','||:4||' '||:5||','||:6||' '||:7'||','||:8||' '||:9||'))',27700),:10)) 
as a

数字2.带值

select st_xmin(a) minx, st_ymin(a) miny, st_xmax(a) maxx, st_ymax(a) maxy
from 
   ST_ENVELOPE(
      ST_TRANSFORM(
         ST_GeomFromText($$POLYGON((138082 12907, 207179 12907, 207179 88647, 138082 88647, 138082 12907))$$,27700), 4326)) 
as a

数字2.带值

select st_xmin(a) minx, st_ymin(a) miny, st_xmax(a) maxx, st_ymax(a) maxy
from 
   ST_ENVELOPE(
      ST_TRANSFORM(
         ST_GeomFromText($$POLYGON((:0 :1, :2 :3, :4 :5, :6 :7, :8 :9))$$,27700),:10)) 
as a;

PostgreSQL日志错误:

第1名

2012-04-18 09:39:41 BST ERROR:  syntax error at or near "'||'" at character 283
2012-04-18 09:39:41 BST STATEMENT:  select st_xmin(a) minx, st_ymin(a) miny, st_xmax(a) maxx, st_ymax(a) maxy from ST_ENVELOPE(ST_TRANSFORM(ST_GeomFromText('POLYGON(('||((E'138082'))||' '||((E'12907'))||','||((E'207179'))||' '||((E'12907'))||','||((E'207179'))||' '||((E'88647'))||','||((E'138082'))||' '||((E'88647'))'||','||((E'138082'))||' '||((E'12907'))||'))',27700),((E'4326')))) as a

第2名

09:39:27 BST ERROR:  parse error - invalid geometry
2012-04-18 09:39:27 BST HINT:  "POLYGON(((" <-- parse error at position 10 within geometry
2012-04-18 09:39:27 BST STATEMENT:  select st_xmin(a) minx, st_ymin(a) miny, st_xmax(a) maxx, st_ymax(a) maxy ,1, 1 from ST_ENVELOPE(ST_TRANSFORM(ST_GeomFromText($$POLYGON((((E'464217')) ((E'133902')), ((E'591014')) ((E'133902')), ((E'591014')) ((E'261209')), ((E'464217')) ((E'261209')), ((E'464217')) ((E'133902'))))$$,27700),((E'4326')))) as a;

1 个答案:

答案 0 :(得分:2)

您的第一个错误是在字符行283处出现额外'字符的简单语法错误。将88647'||更改为88647||,将:7'||更改为{{1}为你的无价值版本。

我无法重现你的第二个错误。

关于MBR的主题,你见过box functions/types吗?他们可以帮助你。