У меня есть объектная переменная SDO_GEOMETRY, которая извлекает данные типа sdo_geometry с карты. Мне нужно сохранить эти данные в таблице как поле SDO_Geometry. Мне удалось успешно получить поле SDO_GEOMETRY из таблицы и использовать его, теперь я заблокирован при сохранении полученного поля SDO_Geometry.

У меня есть хранимая процедура, которая может принимать в качестве входных данных переменную типа SDO_Geometry.

     P_GEOMETRY IN  MDSYS.SDO_GEOMETRY, -- this is the input parameter of Stored Procedure

Мой код, который предоставляет объект типа sdo_geometry:

    parameter.AddWithValue("P_GEOMETRY", geom, OracleDbType.Object, ParameterDirectionWrap.Input);

Где geom - это объект класса sdo_geometry, содержащий поле sdo_geometry. ошибка, которую я получаю в моем примере приложения .net,

     Invalid parameter binding 
     Parameter name: P_GEOMETRY

Это лучший способ избежать этой проблемы.

1
sreejith 24 Мар 2014 в 12:20

3 ответа

Лучший ответ

Привет, я нашел следующее решение полезным,

OracleParameter endGeometry = cmd.CreateParameter();
endGeometry.OracleDbType = OracleDbType.Object;
endGeometry.UdtTypeName = "MDSYS.SDO_GEOMETRY";
endGeometry.Value = routeSegment.endPointGeometry;
endGeometry.ParameterName = "P_END_GEOM";    

parameter.Add(endGeometry);   

Затем параметр передается хранимой процедуре в качестве входных данных вместе с другими переменными

0
sreejith 7 Ноя 2014 в 14:15

У вас есть два варианта: вы можете написать процедуру оболочки PL / SQL, которая принимает любые входные данные, которые вы решите, а затем устанавливает вызов с помощью SDO_GEOMETRY в PL / SQL. Или вы можете использовать Oracle Developer Tools for Visual Studio Custom Class wizard для создания кода C #, который сопоставляется с пользовательским типом SDO_GEOMETRY.

Чтобы сделать последнее:

Установите Oracle Developer Tools для Visual Studio, подключитесь к проводнику сервера с помощью ODP.NET и перейдите к узлу User Defined Types, затем найдите нужные пространственные типы (включая SDO_GEOMETRY), а затем запустите Custom Class Wizard, чтобы сгенерировать класс, который вы можете используйте для передачи данных в вашу хранимую процедуру.

Вот краткое описание, которое должно помочь вам с общими концепциями:

http://apex.oracle.com/pls/apex/f?p=44785:24:106658667466148:::24:P24_CONTENT_ID,P24_PROD_SECTION_GRP_ID,P24_PREV_PAGE:4258,,24

Если вас беспокоит производительность и задействуется много данных, подумайте об использовании вместо них ассоциативных массивов и откажитесь от UDT на стороне клиента.

0
Christian Shay 25 Мар 2014 в 11:25

Вот еще одно решение, которое мне подходит.

Преобразуйте полученный SDO_Geometry в массив байтов WKB, например, с помощью NetTopologySuite. Затем в вашей хранимой процедуре преобразуйте байтовый массив в SDO_GEOMETRY с помощью функции SDO_UTIL.FROM_WKBGEOMETRY (P_GEOMETRY)

В вашем случае параметр будет выглядеть примерно так, как этот параметр.AddWithValue ("P_GEOMETRY", wkbByteArray, OracleDbType.Raw, ParameterDirectionWrap.Input);

0
Zeljko Vujaklija 1 Сен 2014 в 15:04