Правильный формат для запроса sde.st_intersects с хорошо известным двоичным входом из C#

Я использую ArcSDE и Oracle с пространственным типом ST_GEOMETRY. Я пишу код C# с использованием типов SqlGeoemtry. То, что я хочу, чтобы иметь возможность запросить пересечение, но использовать 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());

Жалоба препятствия - ORA-29900: привязка оператора не существует. Что я могу сделать, чтобы Oracle принял входящую функцию в двоичном формате?

1 ответ

Я понял. Мне пришлось создать параметр 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;
Другие вопросы по тегам