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

ODAC下载地址参考:http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html
ODAC使用方法参考:http://blog.csdn.net/rrrrssss00/article/details/7178515
代码见附件
http://pan.baidu.com/s/1dDquLhv

http://www.kuaipan.cn/file/id_22823997376823621.htm

大致思路是:

先根据SDO_GEOMETRY对象的内容,在C#中构建一个对应的类,然后在读取和写入时使用OracleParameter来操作这个类的对象,达到读取和写入数据库SDO_GEOMETRY对象的目的
类名为SdoGeometry,主要代码如下(其中还用到了自定义的SdoPoint,OracleArrayTypeFactory和OracleCustomTypeBase类,其代码见附件的相应文件)
[csharp] view plain copy  
  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类型):
[csharp] view plain copy  
  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. }
插入的代码为:
[csharp] view plain copy  
  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    

转载于:https://www.cnblogs.com/telwanggs/p/5252888.html

使用C#操作Oracle Spatial的SDO_GEOMETRY对像(读取和写入)相关推荐

  1. Oracle Spatial中SDO_Geometry说明

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

  2. Oracle Spatial中SDO_Geometry详细说明

    转自:https://blog.csdn.net/u010865734/article/details/74526451 在ArcGIS中通过SDE存储空间数据到Oracle中有多种存储方式,分别有: ...

  3. OCCI读写Oracle Spatial的SDO_Geometry

    1.使用Oracle OTT工具生成对应的C++类. 1.1设置ORACLE_HOME:服务器端安装目录. 设置客户端安装目录,提示什么java错误. 暂时不管了. 1.2写一个intype文件tes ...

  4. java将clob类型文件写到磁盘_Java对Oracle中Clob类型数据的读取和写入

    Java对Oracle中Clob数据类型是不能够直接插入的,但是可以通过流的形式对clob类型数据写入或者读取,网上代码并不算特别多,讲的 Java对Oracle中Clob数据类型是不能够直接插入的, ...

  5. clob在java里的类型_Java对Oracle中Clob类型数据的读取和写入(转)

    Java对Oracle中Clob数据类型是不能够直接插入的,但是可以通过流的形式对clob类型数据写入或者读取,网上代码并不算特别多,讲的也不是很清楚,我对网上资料进行了整理和总结,具体看代码: 写入 ...

  6. Oracle Spatial的空间查询,代码操作

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

  7. oracle spatial java 类库,[ Oracle Spatial 系列 ] 之一 SDO_Geometry详细说明(ZZ)

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

  8. Oracle Spatial 空间分析之缓冲区分析

    缓冲区分析需要主要使用Oracle Spatial 空间分析操作函数,下面会对其各个参数进行详细讲解,资料有来源于网上与书上. 使用Oracle Spatial 空间分析操作函数--SDO_WITHI ...

  9. C语言(APL指令)对mysql数据库的操作-----连接、读取、写入、修改、删除(保姆级讲解)

    目录 前言: C语言操作mysql前的准备工作 1.C语言连接mysql数据库 函数介绍 (1)mysql_ini() 函数 (2)mysql_library_init()函数 (3)mysql_re ...

最新文章

  1. ZOJ 3820 Building Fire Stations
  2. Atitit.java c#这类编程语言的设计失败点attilax总结
  3. 一个 .git 目录,领悟 Git 的强大!
  4. DockerONE 干货 深入理解Docker容器和镜像
  5. 算法的时间复杂度和空间复杂度的原理
  6. 分析 tuning-primer.sh 源码
  7. java 笔记(3) —— 动态代理,静态代理,cglib代理
  8. github和git的简单使用
  9. python常用的十进制、16进制、字符串、字节串之间的转换
  10. cad用计算机怎么计算坐标,CAD如何快速计算出图纸中任意点的坐标值
  11. vue 使用代理(proxyTable)报错500
  12. Java进阶诀窍httpwww.china-pub.com44147
  13. linux不能打开流的函数为,详解 4 种电脑提示“无法访问函数不正确”的解决方法...
  14. 【论文整理1】On the Continuity of Rotation Representations in Neural Networks
  15. python 验证码字符分割
  16. 基于HarmonyOS的华为智能手表APP开发实战——Fitness
  17. English Words(For Computer Science)
  18. codeforce#420 E. Okabe and El Psy Kongroo(图论+矩阵快速幂)
  19. 三层网络靶场搭建MSF内网渗透
  20. 使用HTML制作课表

热门文章

  1. ibm软件工程师含金量_【上海IBM工资】软件开发工程师待遇-看准网
  2. (38)FPGA三种基本逻辑门(或门)
  3. (45)System Verilog 类中变量随机激励约束语法
  4. FPGA RAM时分复用减少逻辑资源
  5. python 字典处理_Python 6 个字典操作你必须知道
  6. centos安装apache_实战Linux部署Apache
  7. STM32F103串口收发
  8. 6阶群的非平凡子群_离散数学复习笔记
  9. 网络协议栈深入分析(一)--与sk_buff有关的几个重要的数据结构
  10. Linux netfilter源码分析(4)