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

首先,这个需要使用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

时间: 2024-08-04 10:11:13

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

C#读取Oracle Spatial的sdo_geometry

oracle的sdo_geometry中内置get_wkt和get_wkb两个方法. 以数据库表geoms为例,此表中有id和geometry两列 try { OracleConnection con = new OracleConnection(conStr); OracleCommand cmd = new OracleCommand(@"SELECT sdo_geometry.get_wkt(geometry) FROM geoms WHERE id= 1902 ", con);

Oracle Spatial中SDO_Geometry详细说明[转]

在ArcGIS中通过SDE存储空间数据到Oracle中有多种存储方式,分别有:二进制Long Raw .ESRI的ST_Geometry以及基于Oracle Spatial的SDO_Geometry等等. <UpDooGIS原创> 关于这几种方式的各自的优缺点不是主要的探讨的方向,这些我们可以通过ArcGIS中的ArcGIS Server Help得到相关的帮助.这里主要是学习关于基于Oracle Spatial的存储方式,通过这种存储方式几何列Shape的字段类型为mdsys.sde_geo

后端JSP文件里Java语言如果操作Oracle Spatial提供的JGeometry对象

记个流水账,记录下这个困扰自己多时的问题最后怎么解决的.当时觉得该尝试的都尝试了,纳闷到底怎样能解决的,最后还是解决了~ 正确的代码如下: <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*,java.lang.*,oracle.spatial.geometry.*,oracle.spatial.util.*,oracle.sql.*&

后端JSP文件里Java语言如何操作Oracle Spatial提供的JGeometry对象2

之前写过一篇文章记录过遇到的一些问题,这次换新机子,又遇到一些问题搞不定,现在解决了,记录下.因为这些问题真的是,知道的人很快就可以搞定,不知道的人搞来搞去花费很多很多时间,搞的人都郁闷了,还是搞不定. 之前的文章,见此. 主要遇到的错误如下: 1.在点击一个按钮,调用一.jsp文件后,正常的应该是,State从1到2到3到4的过程中,相应的HTTP状态值为0到200到200到200:而我这里出现错误,State从1之后直接到4,HTTP状态值两个都是0. 审查网页元素后发现,错误截图如下: 虽

Oracle Spatial构建点、线、面

在ArcGIS中通过ArcSDE存储空间数据到Oracle中有多种存储方式,分别有:二进制Long Raw .ESRI的ST_Geometry以及基于Oracle Spatial的SDO_Geometry等等. 最近我主要是学习基于Oracle Spatial的存储方式,通过这种存储方式的几何列Shape的字段类型为mdsys.sdo_geometry类型. 关于Oracle Spatial定义的SDO_GEOMETRY类型,我将单独在一章里来说明,个人觉得关于操作空间数据的SQL语句来说,相交

Oracle spatial与arcsde 的关系

有一些同事问过我下面这些问题: 我们用了oracle spatial sdo_geometry,是不是没用arcsde? 我们到底是使用oracle spatial还是arcsde,有点懵! 执行了create enterprise geodatabase是不是就表示使用了arcsde?那这个动作到底是做什么呢? 我们没用arcsde的服务,为什么你还说我们用了arcsde呢? …… 因为问得人很多,我打算将我的理解写下来,与大家交流,以收抛砖引玉之效. 1.什么是ARCSDE SDE的全称是s

Java操作Oracle数据库以及调用存储过程

操作Oracle数据库 publicclass DBConnection {     //jdbc:oracle:thin:@localhost:1521:orcl     publicstaticfinal String url = "jdbc:oracle:thin:@localhost:1521:ORCL";     publicstatic Connection conn ;         static{         //获取数据库驱动         try {    

JFinal框架操作oracle数据库

JFinal框架操作oracle数据库,需要在configPlugin()方法中配置链接oracle数据库的相关配置 配置JFinal数据库操作插件,configPlugin方法 这里我加载jdbc.properties配置文件实在configConstant加载的 @Override public void configConstant(Constants me) { loadPropertyFile("jdbc.properties");//加载配置文件 me.setDevMode

python操作oracle数据库环境配置

1. 下载安装cx_oracle安装包 Python操作Oracle数据库,首先需要安装cx_Oracle包,下载地址如下:   http://cx-oracle.sourceforge.net/    http://sourceforge.net/projects/cx-oracle/files/5.1.2/ 本系统采用的是CentOS5.x系列的操作系统,python版本是2.4,于是下载支持python2.4版本的安装包. 2. 下载oracle客户端,是oracle官方网站下载. 下载对