首先,这个需要使用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. DEV控件ASPxTextBox设置ClientEnabled="false"之后出现的问题

    DEV控件ASPxTextBox设置ClientEnabled="false"之后,js中设置文本框的值后,按钮后台点击事件中获取文本框的值为空.

  2. SQL Server提取字段中的所有数字

    今天公司项目中遇到了一个需求,要求提取用户电话号码字段中的所有电话信息. 由于该字段在项目最初设计中没有严格控制数据质量,导致用户在输入时包含了很多非电话的信息,如用户名字等(136 **** *** ...

  3. Implementation:Binary Indexed Tree 树状数组

    #include <iostream> #include <cstdlib> using namespace std; class BinaryIndexedTree { pr ...

  4. mysqli 查询

    $mysqli = new mysqli('localhost', 'user', 'pwd', 'dbname'); $query = "select goods_id,goods_nam ...

  5. ASP.NET SignalR-B.S/C.S 相互打通DEMO

    ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.   什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知 ...

  6. iis配置asp.net常见问题解决方案

    很多朋友在用IIS6架网站的时候遇到不少问题,而这些问题有些在过去的IIS5里面就遇到过,有些是新出来的,俺忙活了一下午,做 了很多次试验,结合以前的排错经验,做出了这个总结,希望能给大家帮上忙:) ...

  7. intent调用代码总结

    进入联系人界面 Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(People.CO ...

  8. Attack Top Chunk之 bcloud

    前言 这是 bctf 2016 的题,链接 https://github.com/ctfs/write-ups-2016/tree/master/bctf-2016/exploit/bcloud-20 ...

  9. lodop 代码注释

    LODOP.SET_PRINT_PAGESIZE(1,1000,1500,"");  /*1,纵向输出;1000,宽度;1500,高度*:单位为0.1毫米/LODOP.ADD_PR ...

  10. ORACLE查询表最近更改的数据 VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE

    转自 http://blog.chinaunix.net/uid-8504518-id-3325718.html 今天开发人员问我如何快速并方便的查出一张表最近被更改的记录,这个需求很简单,由于是查最 ...