首先,这个需要使用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. SpringBoot+Mybatis整合入门(一)

    SpringBoot+Mybatis 四步整合 第一步 添加依赖 springBoot+Mybatis相关依赖 <!--springBoot相关--> <parent> < ...

  2. 装饰器模式(Decorator Pattern)

    装饰器模式 一.什么是装饰器模式   装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装 ...

  3. c语言中函数的形参test(int *&a)?

    今天在看一段c代码的时候看到一个函数的形参是(int *&a)居然是这个东西,这让我好生疑惑啊,不知道用这么多的地址符号用意何在呢?传址么? 那也不必这样,只需要用指针完全能够达到这样的效果啊 ...

  4. html-图像标签

    图像标签 <img src="图片的路径"/> -src:图片的路径 -width:图片的宽度 -height:图片的高度 -alt:图片上显示的文字,把鼠标移动到图片 ...

  5. CSS响应式:根据分辨率加载不同CSS的几个方法,亲测可用

    有时候你需要把同一个页面在手机和pc同时打开,其中有一个办法就是判断不同分辨路加载不同的css 小编总结了几种分别加载css的方法: 1.比较复杂的使用js判断加载不同css (亲测可用) 但是这种方 ...

  6. Fatal error: Call to undefined function curl_init()解决办法

    问题描述: 在Windows SERVER 2012RC 64 bit OS, php 5.6.3的环境下,搭建好了php运行环境.但是在调用 curl_init() 方法时却报错了. 检查了一下,p ...

  7. jQuery筛选结果等于true的筛选

    一般来说,使用jQuery筛选器的筛选结果都是数组,可以用length>0来判断是否筛选到:但是有一些筛选结果是布尔值,需要注意: 1.hasClass 2.is

  8. Android Studio cannot resolve symbols

    引入了第三方类库,不管怎么编译  clean 都找多到类库 关闭重新打开android studio就好了.....  

  9. java获取当月天数,指定年月的天数,指定日期获取对应星期 .

    package huolongluo.family.util; import java.text.SimpleDateFormat; import java.util.Calendar; import ...

  10. 【转】Twitter Storm: 在生产集群上运行topology

    Twitter Storm: 在生产集群上运行topology 发表于 2011 年 10 月 07 日 由 xumingming 作者: xumingming | 可以转载, 但必须以超链接形式标明 ...