【问题标题】:How do I use C# and ADO.NET to query an Oracle table with a spatial column of type SDO_GEOMETRY?如何使用 C# 和 ADO.NET 查询具有 SDO_GEOMETRY 类型空间列的 Oracle 表?
【发布时间】:2010-04-07 12:37:22
【问题描述】:

我的开发机器运行的是 Windows 7 Enterprise,64 位版本。我正在使用 Visual Studio 2010 Release Candidate。我正在连接到 Oracle 11g Enterprise 服务器版本 11.1.0.7.0。我很难找到专为 64 位 Windows 系统设计的 Oracle 客户端软件,最终登陆here 下载我认为是正确的客户端连接软件。我添加了对版本 2.111.6.0(运行时版本为 v2.0.50727)的“Oracle.DataAccess”的引用。我的目标是 .NET CLR 4.0 版,因为我的 VS 解决方案的所有属性都是默认值,这是 2010 RC。然后,我能够在 C# 中编写一个控制台应用程序,该应用程序建立连接,执行 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 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' );

我们将不胜感激任何建议或见解。谢谢。

【问题讨论】:

  • oracle SDO 对象本质上是数组中的数组。 Oracle JDBC 库将其作为 JGeometry 类型处理得很好。如果您没有该数据类型,则只需查询为 sdo_util.to_wktgeometry 但您必须自己处理它们。

标签: c# oracle ado.net 64-bit spatial


【解决方案1】:

这是一个帖子的链接,其中包含使用 C# 和 ODP.net 访问空间类型的示例应用程序。

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

这里还有一个关于使用 XML 选择空间类型的示例:

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

【讨论】:

    猜你喜欢
    • 2018-08-25
    • 2017-09-02
    • 1970-01-01
    • 2017-11-16
    • 2019-01-09
    • 2010-10-10
    • 1970-01-01
    • 2023-03-09
    • 2021-11-22
    相关资源
    最近更新 更多