Как прочитать значения ординат из Oracle Spatial, которые не помещаются в десятичный тип .NET? - PullRequest
1 голос
/ 17 июня 2011

Я пытаюсь читать данные Oracle Spatial с помощью C # с использованием ODP.NET.

В некоторых случаях мои данные Oracle Spatial имеют числовые значения в OrdinateArray SDO_GEOMETRY, которые слишком велики для обработки в .NET. Поэтому, когда я пытаюсь прочитать значения SDO_GEOMETRY, он выдает «System.OverflowException: арифметическая операция, приведшая к переполнению». В моем случае значения ординат имеют слишком много цифр после десятичной точки, и я не забочусь о потере этой информации.

Мой код основан на примере приложения здесь: http://www.orafaq.com/forum/mv/msg/27794/296419/0/#msg_296419

Я вижу, что существуют подходы SafeMapping с DataSets для чтения числовых типов, которые не вписываются в десятичные типы, но я не понимаю, как применить это к внутренней части типа SDO_GEOMETRY.

Есть ли способ обойти эту проблему?

Ответы [ 2 ]

0 голосов
/ 28 августа 2014

Возможно, вам уже поздно, но, возможно, кто-то может использовать мое решение проблемы.

Я столкнулся с этой проблемой при создании пользовательского шейп-файла для импортера Oracle Locator в C #.

Я изменил тип переменной ordinatesArray с decimal [] на double [] в классе SdoGeometry. Такое же изменение (десятичное или двойное) было необходимо для

открытый класс OrdinatesArrayFactory: OracleArrayTypeFactoryBase {}

и

OrdinatesArray = GetValue ((int) OracleObjectColumns.SDO_ORDINATES) в методе MapToCustomObject.

На самом деле код работал нормально с десятичным типом, когда я импортировал данные с помощью инструмента oracle.spatial.util.SampleShapefileToJGeomFeature. Проблемы начались, когда я импортировал данные с помощью своего инструмента (геометрия шейп-файла в WKB, а затем вставил в Oracle, используя INSERT INTO some_table (GEOM) VALUES (SDO_UTIL.FROM_WKBGEOMETRY ()) По какой-то причине ординаты слишком велики для десятичной дроби, хотя я занимался точностью.

0 голосов
/ 23 июня 2011

Что такое тип данных Oracle "OrdinateArray"? Если это определенный пользователем тип (например, VARRAY), вы можете создать собственный класс .NET для приема данных. Подробнее об этом читайте в разделе «Типы, определенные пользователем»

...