Правильный формат для запроса 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;