首先,这个需要使用ODAC,也就是Oracle.DataAccess.dll,新出的托管Oracle.ManagedDataAccess.dll不支持Object Type,无法使用

 
先根据SDO_GEOMETRY对象的内容,在C#中构建一个对应的类,然后在读取和写入时使用OracleParameter来操作这个类的对象,达到读取和写入数据库SDO_GEOMETRY对象的目的
 
类名为SdoGeometry,主要代码如下(其中还用到了自定义的SdoPoint,OracleArrayTypeFactory和OracleCustomTypeBase类,其代码见附件的相应文件)
  1. [OracleCustomTypeMappingAttribute("MDSYS.SDO_GEOMETRY")]
  2. public class SdoGeometry : OracleCustomTypeBase<SdoGeometry>
  3. {
  4. private enum OracleObjectColumns { SDO_GTYPE, SDO_SRID, SDO_POINT, SDO_ELEM_INFO, SDO_ORDINATES }
  5. private decimal? sdo_Gtype;
  6. [OracleObjectMappingAttribute(0)]
  7. public decimal? Sdo_Gtype
  8. {
  9. get { return sdo_Gtype; }
  10. set { sdo_Gtype = value; }
  11. }
  12. private decimal? sdo_Srid;
  13. [OracleObjectMappingAttribute(1)]
  14. public decimal? Sdo_Srid
  15. {
  16. get { return sdo_Srid; }
  17. set { sdo_Srid = value; }
  18. }
  19. private SdoPoint point;
  20. [OracleObjectMappingAttribute(2)]
  21. public SdoPoint Point
  22. {
  23. get { return point; }
  24. set { point = value; }
  25. }
  26. private decimal[] elemArray;
  27. [OracleObjectMappingAttribute(3)]
  28. public decimal[] ElemArray
  29. {
  30. get { return elemArray; }
  31. set { elemArray = value; }
  32. }
  33. private decimal[] ordinatesArray;
  34. [OracleObjectMappingAttribute(4)]
  35. public decimal[] OrdinatesArray
  36. {
  37. get { return ordinatesArray; }
  38. set { ordinatesArray = value; }
  39. }
  40. [OracleCustomTypeMappingAttribute("MDSYS.SDO_ELEM_INFO_ARRAY")]
  41. public class ElemArrayFactory : OracleArrayTypeFactoryBase<decimal> {}
  42. [OracleCustomTypeMappingAttribute("MDSYS.SDO_ORDINATE_ARRAY")]
  43. public class OrdinatesArrayFactory : OracleArrayTypeFactoryBase<decimal> {}
  44. public override void MapFromCustomObject()
  45. {
  46. SetValue((int)OracleObjectColumns.SDO_GTYPE, Sdo_Gtype);
  47. SetValue((int)OracleObjectColumns.SDO_SRID, Sdo_Srid);
  48. SetValue((int)OracleObjectColumns.SDO_POINT, Point);
  49. SetValue((int)OracleObjectColumns.SDO_ELEM_INFO, ElemArray);
  50. SetValue((int)OracleObjectColumns.SDO_ORDINATES, OrdinatesArray);
  51. }
  52. public override void MapToCustomObject()
  53. {
  54. Sdo_Gtype = GetValue<decimal?>((int)OracleObjectColumns.SDO_GTYPE);
  55. Sdo_Srid = GetValue<decimal?>((int)OracleObjectColumns.SDO_SRID);
  56. Point = GetValue<SdoPoint>((int)OracleObjectColumns.SDO_POINT);
  57. ElemArray = GetValue<decimal[]>((int)OracleObjectColumns.SDO_ELEM_INFO);
  58. OrdinatesArray = GetValue<decimal[]>((int)OracleObjectColumns.SDO_ORDINATES);
  59. }
  60. }
 
从数据库里读取的代码为(示例表只有两列,id列为number类型,geo列为SDO_GEOMTRY类型):
  1. OracleCommand cmd = new OracleCommand()
  2. cmd.Connection = con;
  3. cmd.CommandType = CommandType.Text;
  4. cmd.CommandText = " select id,geo from geoinfo ";
  5. using (OracleDataReader readerGeoInfo = cmd.ExecuteReader())
  6. {
  7. while (readerGeoInfo.Read())
  8. {
  9. GeoInfo geoInfo = new GeoInfo();
  10. if (!readerGeoInfo.IsDBNull(0))
  11. {
  12. geoInfo.Id = readerGeoInfo.GetDecimal(0);
  13. }
  14. if (!readerGeoInfo.IsDBNull(1))
  15. {
  16. geoInfo.Geo = (SdoGeometry)readerGeoInfo.GetValue(1);
  17. }
  18. geoInfoList.Add(geoInfo);
  19. }
  20. readerGeoInfo.Close();
  21. }
 
插入的代码为:
  1. cmd.CommandText = " insert into geoinfo values (geoinfo_seq.nextval,:param) ";
  2. cmd.Parameters.Clear();
  3. OracleParameter oracleParameterGeo = new OracleParameter();
  4. oracleParameterGeo.OracleDbType = OracleDbType.Object;
  5. oracleParameterGeo.UdtTypeName = "MDSYS.SDO_GEOMETRY";
  6. cmd.Parameters.Add(oracleParameterGeo);
  7. //creating point
  8. SdoGeometry geoPoint = new SdoGeometry();
  9. geoPoint.Sdo_Gtype = 2001;
  10. geoPoint.Point = new SdoPoint();
  11. geoPoint.Point.X = 200;
  12. geoPoint.Point.Y = 400;
  13. oracleParameterGeo.Value = geoPoint;
  14. //insert point in table geoinfo
  15. cmd.ExecuteNonQuery();
  16. //creating polygon
  17. SdoGeometry geoPolygon = new SdoGeometry();
  18. geoPolygon.Sdo_Gtype = 2003;
  19. geoPolygon.ElemArray = new decimal[] { 1, 1003, 1 };
  20. geoPolygon.OrdinatesArray = new decimal[] { 3, 3, 3, 10, 10, 10, 10, 3, 3, 3 };
  21. oracleParameterGeo.Value = geoPolygon;
  22. //insert polygon into table geoinfo
  23. cmd.ExecuteNonQuery();
 
在实际使用中,使用DataAdapter的Fill方法将Select  *的查询结果放到DataTable中时,如果已经定义了SdoGeometry的类,查询结果会自动地将DataTable的那列认为是SdoGeometry,非常方便 ,例如 
 
 OracleDataAdapter mAdp = new OracleDataAdapter("select * from geoinfo", con);
 DataTable mDst = new DataTable();
 mAdp.Fill(mDst);
 
此时mDst的第二列数据类型即为SdoGeometry    

使用C#操作Oracle Spatial的SDO_GEOMETRY对像(读取和写入)的更多相关文章

  1. C#读取Oracle Spatial的sdo_geometry

    oracle的sdo_geometry中内置get_wkt和get_wkb两个方法. 以数据库表geoms为例,此表中有id和geometry两列 try { OracleConnection con ...

  2. Oracle Spatial中SDO_Geometry详细说明[转]

    在ArcGIS中通过SDE存储空间数据到Oracle中有多种存储方式,分别有:二进制Long Raw .ESRI的ST_Geometry以及基于Oracle Spatial的SDO_Geometry等 ...

  3. Oracle Spatial中SDO_Geometry说明

    Oracle Spatial中SDO_Geometry说明 在ArcGIS中通过SDE存储空间数据到Oracle中有多种存储方式,分别有:二进制Long Raw .ESRI的ST_Geometry以及 ...

  4. 【转载】Oracle Spatial中SDO_Geometry详细说明

    转载只供个人学习参考,查看请前往原出处:http://www.cnblogs.com/upDOoGIS/archive/2009/05/20/1469871.html 相关微博:oracle 创建SD ...

  5. Oracle Spatial操作geometry方法

    Oracle Spatial中SDO_GEOMETRY类型: CREATE TYPE SDO_GEOMETRY AS OBJECT( SDO_GTYPE NUMBER,--几何类型,如点线面 SDO_ ...

  6. Oracle Spatial GIS相关研究

    1.Oracle Spatial 概念相关 Oracle Spatial 是Oracle 数据库强大的核心特性,包含了用于存储矢量数据类型.栅格数据类型和持续拓扑数据类型的原生数据类型.Oracle ...

  7. Oracle spatial与arcsde 的关系

    有一些同事问过我下面这些问题: 我们用了oracle spatial sdo_geometry,是不是没用arcsde? 我们到底是使用oracle spatial还是arcsde,有点懵! 执行了c ...

  8. shp转oracle spatial

    2010年12月1日  终于搞定了shp到oracle spatial,说下步骤和感受吧! 1 XP系统:转换工具的下载(shp2sdo.exe ):下载后把此文件复制到PATH变量包含的目录下(E: ...

  9. Oracle spatial抽稀函数(SDO_UTIL.SIMPLIFY)

    在使用Oracle spatial做空间查询和展示时,经常会遇到展示或者查询过慢,这时候我可以通过空间数据抽稀来优化查询展示效率. 在Oracle spatial中的抽稀函数为:SDO_UTIL.SI ...

随机推荐

  1. 能ping通外网dns但不能上网一例

    一个win7本本仅通过一个无线路由一个人上网,突然一天不能上网了,甚是奇怪,一看本地连接均是正常的.而且能ping通外网的dns,但无论如何就是打不开网页,表现为输入任何网址很迅速的显示该页无法显示, ...

  2. Oracle表闪回功能

    1.启用表闪回首先要在表上支持行移动(在数据字典中设置标识来标识该操作可能会改变行ID,即同一条数据闪回成功后主键都一样,但行ID其实已经发生变化了) SQL> alter table base ...

  3. SEDA架构程序实现

    一.SEDA SEDA全称是:stage event driver architecture,中文直译为“分阶段的事件驱动架构”,它旨在结合事件驱动和多线程模式两者的优点,从而做到易扩展,解耦合,高并 ...

  4. [js常用]百度将文字转化为语音实例

    嗷嗷方便的文字转语音,不过用的时候记得到百度语音上申请key,免费的.之前在网络上看到有人写了一部分,自己丰富下,以后用也方便 <!DOCTYPE html PUBLIC "-//W3 ...

  5. jQuery下拉框操作系列$("option:selected",this) &&(锋利的jQuery)

    jQuery下拉框操作系列$("option:selected",this)  &&(锋利的jQuery) <!DOCTYPE html> <ht ...

  6. charles 抓包 https 证书

    1. 概述 环境:这里是windows8 和 android (参考了ios环境的博客) 手机app点击发出http及https的请求,之前抓包都有请求的相关内容展示,这次没有,原来之前的一直抓的是h ...

  7. 5分钟搞定jQuery+zepto.js+面向对象插件

    今天分享一下快速使用jQuery+zepto.js的技巧,需要的记得收藏 1.jQuery的引入:本地下载jQuery(后面简称jq)的源文件,开发版本使用非min版,线上使用min版,zepto.j ...

  8. JavaSE (二)

    this关键字 当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this. 用法:对当前对象的默认引用 调用自己的的构造方法. 用在构造方法内部,区 ...

  9. Asp.net MVC 移除不用的视图引擎

    Asp.net MVC 默认提供两个视图引擎,分别为: WebFormViewEngine 和 RazorViewEngine.MVC在查找视图时,会按照指定的顺序进行查找.当我们的MVC程序未找到相 ...

  10. PowerDesigner 常用配置修改

    PowerDesigner中Name与Code同步的问题 转自:http://blog.sina.com.cn/u/48932504010005t9 PowerDesigner中,但修改了某个字段的n ...