如何使用C#和ADO.NET查询具有SDO_GEOMETRY类型的空间列的Oracle表?

时间:2010-04-05 21:22:01

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

我的开发机器运行的是Windows 7 Enterprise,64位版本。我正在使用Visual Studio 2010 Release Candidate。我正在连接到Oracle 11g Enterprise服务器版本11.1.0.7.0。我很难找到为64位Windows系统制作的Oracle客户端软件,并最终登陆here下载我认为是正确的客户端连接软件。我添加了对“Oracle.DataAccess”的引用,它是版本2.111.6.0(运行时版本是v2.0.50727)。我的目标是.NET CLR 4.0版,因为我的VS解决方案的所有属性都是默认值,这是2010 RC。然后我能够在C#中编写一个控制台应用程序,它建立连接,执行SELECT语句,并在有问题的表不包含空间列时正确返回数据。我的问题是,当我查询的表中有一个类型为SDO_GEOMETRY的列时,这不再有效。

下面是我试图运行的简单控制台应用程序,它可以重现问题。当代码到达带有“ExecuteReader”命令的行时,会引发异常并且消息为“Unsupported column datatype”。

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' );

非常感谢任何建议或见解。谢谢。

1 个答案:

答案 0 :(得分:3)

以下是指向使用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