2010-04-05 20 views
2

我的開發機器正在運行Windows 7 Enterprise,64位版本。我正在使用Visual Studio 2010 Release Candidate。我連接到Oracle 11g企業版服務器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類型的列時,這不再起作用。如何使用C#和ADO.NET查詢類型爲SDO_GEOMETRY的空間列的Oracle表?

下面是我試圖運行的簡單的控制檯應用程序,重現了這個問題。當代碼到達「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'); 

任何意見或見解將不勝感激。謝謝。

+0

預言SDO對象本質上是陣列內的陣列。 Oracle JDBC庫作爲JGeometry類型處理這一點很好。如果您沒有該數據類型,那麼只需查詢sdo_util.to_wktgeometry,但您必須自己處理它們。 – FlyingGuy 2014-12-21 07:12:43

回答

相關問題