0

我正在使用具有 ST_GEOMETRY 空间类型的 ArcSDE 和 Oracle。我正在使用 SqlGeoemtry 类型编写 C# 代码。我想要的是能够请求相交但使用 wkb 而不是 wkt。我知道它适用于 wkt,但如果我的功能有很多顶点,我会从 Oracle 收到关于字符串文字太大的错误(我猜它是 2000 个字符左右)。我也知道我可以将那个大字符串分块成一个 CLOB 并将这些块发送进去并让相交操作工作。

我想要的是使用二进制格式并避免所有这些问题。但我在语法上有问题。以下是适用于 wkt 的方法:

oracleCommand.CommandText = string.Format("SELECT OBJECTID FROM {0} WHERE sde.st_intersects(shape, sde.st_polyfromtext('{1}', 3071)) = 1", selectionLayerName, unionedBuffer.ToString());

这是现在不起作用的:

oracleCommand.CommandText = string.Format("SELECT OBJECTID FROM {0} WHERE sde.st_intersects(shape, sde.st_polyfromwkb('{1}', 3071)) = 1", selectionLayerName, unionedBuffer.STAsBinary());

Obstacle 的投诉是 ORA-29900: operator binding does not exist 我该怎么做才能让 Oracle 接受二进制格式的传入功能?

4

1 回答 1

0

我想到了。我必须创建一个 Oracle 参数作为 Blob,然后从 SqlGeometry 调用加载字节数组:

oracleCommand.CommandText = string.Format("SELECT OBJECTID FROM {0} WHERE sde.st_intersects(shape, sde.st_polyfromwkb(:THEBLOB, 3071)) = 1", selectionLayerName);
OracleParameter param = oracleCommand.Parameters.Add(new OracleParameter(":THEBLOB", OracleDbType.Blob));
param.Value = unionedBuffer.STAsBinary().Value;
于 2016-12-21T16:06:06.107 回答