2016-12-21 1 views
0

J'utilise ArcSDE et Oracle avec le type spatial ST_GEOMETRY. J'écris du code C# en utilisant les types SqlGeoemtry. Ce que je veux, c'est pouvoir demander une intersection mais utiliser wkb au lieu de wkt. Je sais que cela fonctionne avec wkt mais si ma fonction a plusieurs sommets, j'obtiens une erreur d'Oracle à propos de la chaîne littérale étant trop grande (je suppose que c'est 2000 caractères ou plus). Je sais aussi que je peux couper cette grande chaîne dans un CLOB et envoyer les morceaux et faire fonctionner l'opération d'intersection.Format correct pour demander sde.st_intersects avec une entrée binaire bien connue du C#

Ce que je voudrais serait d'utiliser le format binaire et éviter tous ces problèmes. Mais j'ai des problèmes avec la syntaxe. Voici ce qui fonctionne pour wkt:

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

Voici ce qui ne fonctionne pas en ce moment:

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

la plainte Obstacle est ORA-29900: liant l'opérateur n'existe pas Que puis-je faire pour obtenir Oracle Accepter la fonctionnalité entrante dans un format binaire?

+0

de référence est ici le esri doc - http://desktop.arcgis.com/en/arcmap/10.3 /manage-data/using-sql-with-gdbs/st-polyfromwkb.htm – VBAHole

Répondre

0

Je l'ai compris. Je devais créer un paramètre Oracle comme Blob chargez dans le tableau d'octets de l'appel 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;