如何将InsertCommand参数设置为函数调用?

3

我正在开发一个使用PostgreSQL数据库和PostGIS扩展的GIS应用程序。我已经为整个项目创建了数据访问逻辑,除了几何值插入之外,一切都正常。

我必须将几何值作为函数调用传递:

INSERT INTO mygeotable (id, name, geom) VALUES 
    (1, "MyName", ST_GeomFromText('POINT(755888.4156 112458.556)', 23700))

正如您所看到的,我需要在 INSERT 中调用 ST_GeomFromText PostGIS函数以获取 geom 列值。从ADO.NET的角度来看,这个 geom 列是一个字符串值,但它不能在 INSERT 中设置为文本。
我认为ADO.NET会自动按照以下方式格式化我的 INSERT 命令:
INSERT INTO mygeotable (id, name, geom) VALUES 
    (1, "MyName", "ST_GeomFromText('POINT(755888.4156 112458.556)', 23700)")

由于引号的问题,这是错误的!

我该如何设置INSERT命令的geom参数以使用ST_GeomFromText函数调用?

我为每个列使用参数。InsertCommand CommandText是:

INSERT INTO mygeotable (id, name, geom) VALUES (id, name, geom)

geom参数的DbType是字符串。对于函数调用,没有DbType!


我为每一列使用参数。InsertCommand CommandText 是:INSERT INTO mygeotable (id, name, geom) VALUES (id, name, geom)。geom 参数 DbType 为 String。函数调用没有 DbType! - ggabor
1个回答

1
将参数作为数字传递给函数,而不是传递整个函数调用:
INSERT INTO mygeotable (id, name, geom) VALUES
    (id, name, ST_GeomFromText('POINT(X Y)', Z))

顺便提一下,像"MyName"这样的双引号并不会生成有效的字符串,因为它们被保留用于标识符。字符串应该用单引号括起来。


没错!双引号是无效的,我只是打得比较快。所以问题出在当我设置值:row["geom"] = "ST_GeomFromText('POINT(1, 2)', 23700)",然后调用adapter.Update(table)时,它会抛出一个“无效几何体”异常,这意味着插入命令文本是错误的,因为从sql窗格中我可以运行相同的查询而没有错误。 - ggabor
如果您想传递数字XY值来创建一个点,请使用ST_MakePoint(X, Y)。此外,您可能需要将其包装在ST_SetSRID(geom, 23700)中以设置SRID。更多信息请参见此处 - Mike T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接