Как использовать C # и ADO.NET для запроса таблицы Oracle с пространственным столбцом типа SDO_GEOMETRY?

2

Моя машина разработки работает под управлением Windows 7 Enterprise, 64-разрядной версии. Я использую Visual Studio 2010 Release Candidate. Я подключаюсь к серверу Oracle 11g Enterprise версии 11.1.0.7.0. Мне было сложно найти клиентское ПО Oracle, которое было создано для 64-разрядных систем Windows, и в конечном итоге приземлилось здесь, чтобы загрузить то, что я считаю правильным клиентское программное обеспечение для подключения. Я добавил ссылку на "Oracle.DataAccess", которая является версией 2.111.6.0 (Runtime Version v2.0.50727). Я нацелен на .NET CLR версии 4.0, поскольку все свойства моего VS Solution являются значениями по умолчанию, и это RC 2010 года. Затем я смог написать консольное приложение на С#, которое установило соединение, выполнило оператор SELECT и правильно вернуло данные, когда соответствующая таблица НЕ содержит пространственный столбец. Моя проблема в том, что это больше не работает, когда в запросе таблицы есть столбец типа SDO_GEOMETRY.

Ниже приведено простое консольное приложение, которое я пытаюсь запустить, что воспроизводит проблему. Когда код попадает в строку с помощью команды "ExecuteReader", возникает исключение, а сообщение "Неподдерживаемый тип данных столбца".

using System;
using System.Data;
using Oracle.DataAccess.Client;

namespace ConsoleTestOracle
{
    class Program
    {
        static void Main(string[] args)
        {
            string oradb = string.Format("Data Source={0};User Id={1};Password={2};",
                "hostname/servicename", "login", "password");

            try
            {
                using (OracleConnection conn = new OracleConnection(oradb))
                {
                    conn.Open();

                    OracleCommand cmd = new OracleCommand();
                    cmd.Connection = conn;
                    cmd.CommandText = "select * from SDO_8307_2D_POINTS";
                    cmd.CommandType = CommandType.Text;

                    OracleDataReader dr = cmd.ExecuteReader();
                }
            }
            catch (Exception e)
            {
                string error = e.Message;
            }
        }
    }
}

Тот факт, что этот код работает при использовании против таблицы, которая не содержит пространственный столбец типа SDO_GEOMETRY, заставляет меня думать, что я правильно настроил машину Windows 7, поэтому я удивлен, что получаю это исключение, когда таблица содержит разные виды столбцов. Я не знаю, есть ли какая-то конфигурация на моем компьютере или машине Oracle, которая должна быть выполнена, или если программное обеспечение клиента Oracle, которое я установил, является неправильным или старым и нуждается в обновлении.

Вот SQL, который я использовал для создания таблицы, заполнил ее несколькими строками, содержащими точки в пространственном столбце и т.д., если вы хотите попытаться воспроизвести это точно.

SQL Create Commands:

create table SDO_8307_2D_Points (ObjectID number(38) not null unique, TestID number, shape SDO_GEOMETRY);
Insert into SDO_8307_2D_Points values (1, 1, SDO_GEOMETRY(2001, 8307, null, SDO_ELEM_INFO_ARRAY(1, 1, 1),  SDO_ORDINATE_ARRAY(10.0, 10.0)));
Insert into SDO_8307_2D_Points values (2, 2, SDO_GEOMETRY(2001, 8307, null, SDO_ELEM_INFO_ARRAY(1, 1, 1),  SDO_ORDINATE_ARRAY(10.0, 20.0)));
insert into user_sdo_geom_metadata values ('SDO_8307_2D_Points', 'SHAPE', SDO_DIM_ARRAY(SDO_DIM_ELEMENT('Lat', -180, 180, 0.05), SDO_DIM_ELEMENT('Long', -90, 90, 0.05)), 8307);
create index SDO_8307_2D_Point_indx on SDO_8307_2D_Points(shape) indextype is mdsys.spatial_index PARAMETERS ('sdo_indx_dims=2' );

Приветствуются любые советы или идеи. Спасибо.

  • 0
    Объекты oracle SDO по сути являются массивами внутри массивов. Библиотеки Oracle JDBC прекрасно справляются с этим как тип JGeometry. Если у вас нет такого типа данных, просто запросите как sdo_util.to_wktgeometry, но вам придется разбираться с ними самостоятельно.
Теги:
ado.net
64bit
spatial

1 ответ

3

Вот ссылка на сообщение с образцовым приложением с использованием С# и ODP.net для доступа к пространственным типам.

http://www.orafaq.com/forum/mv/msg/27794/296419/0/#msg_296419

Здесь также приведен пример использования XML для выбора пространственных типов:

http://forums.oracle.com/forums/thread.jspa?threadID=241076

Ещё вопросы

Сообщество Overcoder
Наверх
Меню