3

私の開発マシンは、Windows 7 Enterprise、64 ビット バージョンを実行しています。Visual Studio 2010 Release Candidate を使用しています。Oracle 11g Enterprise サーバー バージョン 11.1.0.7.0 に接続しています。64 ビット Windows システム用に作成された Oracle クライアント ソフトウェアを見つけるのに苦労し、最終的にここにたどり着きました適切なクライアント接続ソフトウェアであると私が想定しているものをダウンロードします。バージョン 2.111.6.0 の「Oracle.DataAccess」への参照を追加しました (ランタイム バージョンは v2.0.50727)。私のVSソリューションのすべてのプロパティはデフォルトであり、これは2010 RCであるため、.NET CLRバージョン4.0をターゲットにしています。次に、接続を確立し、SELECT ステートメントを実行し、問題のテーブルに空間列が含まれていない場合に適切にデータを返すコンソール アプリケーションを C# で作成することができました。私の問題は、クエリしたテーブルに 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' );

アドバイスや洞察をいただければ幸いです。ありがとうございました。

4

1 に答える 1

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

于 2010-04-07T04:37:22.397 に答える