使用C#操作Oracle Spatial的SDO_GEOMETRY对像(读取和写入)
来源:互联网 发布:软件测试大纲模板 编辑:程序博客网 时间:2024/04/28 22:59
首先,这个需要使用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
ODAC使用方法参考:http://blog.csdn.net/rrrrssss00/article/details/7178515
代码见附件
http://pan.baidu.com/s/1dDquLhv
或
http://www.kuaipan.cn/file/id_22823997376823621.htm
大致思路是:
http://pan.baidu.com/s/1dDquLhv
或
http://www.kuaipan.cn/file/id_22823997376823621.htm
大致思路是:
先根据SDO_GEOMETRY对象的内容,在C#中构建一个对应的类,然后在读取和写入时使用OracleParameter来操作这个类的对象,达到读取和写入数据库SDO_GEOMETRY对象的目的
类名为SdoGeometry,主要代码如下(其中还用到了自定义的SdoPoint,OracleArrayTypeFactory和OracleCustomTypeBase类,其代码见附件的相应文件)
[OracleCustomTypeMappingAttribute("MDSYS.SDO_GEOMETRY")] public class SdoGeometry : OracleCustomTypeBase<SdoGeometry> { private enum OracleObjectColumns { SDO_GTYPE, SDO_SRID, SDO_POINT, SDO_ELEM_INFO, SDO_ORDINATES } private decimal? sdo_Gtype; [OracleObjectMappingAttribute(0)] public decimal? Sdo_Gtype { get { return sdo_Gtype; } set { sdo_Gtype = value; } } private decimal? sdo_Srid; [OracleObjectMappingAttribute(1)] public decimal? Sdo_Srid { get { return sdo_Srid; } set { sdo_Srid = value; } } private SdoPoint point; [OracleObjectMappingAttribute(2)] public SdoPoint Point { get { return point; } set { point = value; } } private decimal[] elemArray; [OracleObjectMappingAttribute(3)] public decimal[] ElemArray { get { return elemArray; } set { elemArray = value; } } private decimal[] ordinatesArray; [OracleObjectMappingAttribute(4)] public decimal[] OrdinatesArray { get { return ordinatesArray; } set { ordinatesArray = value; } } [OracleCustomTypeMappingAttribute("MDSYS.SDO_ELEM_INFO_ARRAY")] public class ElemArrayFactory : OracleArrayTypeFactoryBase<decimal> {} [OracleCustomTypeMappingAttribute("MDSYS.SDO_ORDINATE_ARRAY")] public class OrdinatesArrayFactory : OracleArrayTypeFactoryBase<decimal> {} public override void MapFromCustomObject() { SetValue((int)OracleObjectColumns.SDO_GTYPE, Sdo_Gtype); SetValue((int)OracleObjectColumns.SDO_SRID, Sdo_Srid); SetValue((int)OracleObjectColumns.SDO_POINT, Point); SetValue((int)OracleObjectColumns.SDO_ELEM_INFO, ElemArray); SetValue((int)OracleObjectColumns.SDO_ORDINATES, OrdinatesArray); } public override void MapToCustomObject() { Sdo_Gtype = GetValue<decimal?>((int)OracleObjectColumns.SDO_GTYPE); Sdo_Srid = GetValue<decimal?>((int)OracleObjectColumns.SDO_SRID); Point = GetValue<SdoPoint>((int)OracleObjectColumns.SDO_POINT); ElemArray = GetValue<decimal[]>((int)OracleObjectColumns.SDO_ELEM_INFO); OrdinatesArray = GetValue<decimal[]>((int)OracleObjectColumns.SDO_ORDINATES); } }
从数据库里读取的代码为(示例表只有两列,id列为number类型,geo列为SDO_GEOMTRY类型):
OracleCommand cmd = new OracleCommand() cmd.Connection = con; cmd.CommandType = CommandType.Text; cmd.CommandText = " select id,geo from geoinfo "; using (OracleDataReader readerGeoInfo = cmd.ExecuteReader()) { while (readerGeoInfo.Read()) { GeoInfo geoInfo = new GeoInfo(); if (!readerGeoInfo.IsDBNull(0)) { geoInfo.Id = readerGeoInfo.GetDecimal(0); } if (!readerGeoInfo.IsDBNull(1)) { geoInfo.Geo = (SdoGeometry)readerGeoInfo.GetValue(1); } geoInfoList.Add(geoInfo); } readerGeoInfo.Close(); }
插入的代码为:
cmd.CommandText = " insert into geoinfo values (geoinfo_seq.nextval,:param) "; cmd.Parameters.Clear(); OracleParameter oracleParameterGeo = new OracleParameter(); oracleParameterGeo.OracleDbType = OracleDbType.Object; oracleParameterGeo.UdtTypeName = "MDSYS.SDO_GEOMETRY"; cmd.Parameters.Add(oracleParameterGeo); //creating point SdoGeometry geoPoint = new SdoGeometry(); geoPoint.Sdo_Gtype = 2001; geoPoint.Point = new SdoPoint(); geoPoint.Point.X = 200; geoPoint.Point.Y = 400; oracleParameterGeo.Value = geoPoint; //insert point in table geoinfo cmd.ExecuteNonQuery(); //creating polygon SdoGeometry geoPolygon = new SdoGeometry(); geoPolygon.Sdo_Gtype = 2003; geoPolygon.ElemArray = new decimal[] { 1, 1003, 1 }; geoPolygon.OrdinatesArray = new decimal[] { 3, 3, 3, 10, 10, 10, 10, 3, 3, 3 }; oracleParameterGeo.Value = geoPolygon; //insert polygon into table geoinfo 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
2 0
- 使用C#操作Oracle Spatial的SDO_GEOMETRY对像(读取和写入)
- 使用C#操作Oracle Spatial的SDO_GEOMETRY对像(读取和写入)--方法2
- c# Oracle spatial sdo_geometry
- Oracle Spatial SDO_Geometry类型的详细说明
- 关于Oracle Spatial 的字段SDO_GEOMETRY
- 访问Oracle Spatial中的SDO_GEOMETRY字段的方法(windows下)
- 访问Oracle Spatial中的SDO_GEOMETRY字段的方法(windows下)
- 对oracle中的BLOB的操作(读取,写入)
- Oracle Spatial中SDO_Geometry详细说明
- Oracle Spatial-元数据及SDO_GEOMETRY
- Oracle Spatial中SDO_Geometry详细说明
- Oracle Spatial中SDO_Geometry详细说明
- Oracle Spatial-元数据及SDO_GEOMETRY
- Oracle Spatial中SDO_Geometry详细说明
- Oracle Spatial中SDO_Geometry详细说明
- Oracle Spatial中SDO_Geometry详细说明
- 使用xmltextreader对xml进行简单的读取和写入操作
- C#对Excel表的读取和写入
- 重新开始战斗22-程序员面试宝典-P66_7.2面试题3--局部数组和全局数组问题
- BaseDao
- EXTJS4.2 前台导出多表头grid(曲线救国版)
- 修改xcode编辑的的字体大小和修改背景颜色,显示行号
- 常用JS验证函数以及正则表达式
- 使用C#操作Oracle Spatial的SDO_GEOMETRY对像(读取和写入)
- 修改ip地址后,oracle 的listener无法启动
- 圆内三角形统计
- linux grep命令
- 去掉rhel的注册提示
- Gridster.js教程
- 贝叶斯学习--极大后验概率假设和极大似然假设
- SQLServer 排名函数
- UILabel自适应高度和自动换行