繁体   English   中英

如何将C#代码中的SDO_GEOMETRY对象变量插入包含sdo_geometry类型列的oracle表中?

[英]How to insert SDO_GEOMETRY object variable from C# code into oracle table containing coloumn of sdo_geometry type?

我有一个SDO_GEOMETRY对象变量,可从地图中获取sdo_geometry类型数据。 我需要将此数据另存为SDO_Geometry字段到表中。 我能够从Table成功获取SDO_GEOMETRY字段并使用它,现在我无法保存获取的SDO_Geometry字段。

我有一个存储过程,可以将SDO_Geometry类型变量作为输入。

     P_GEOMETRY IN  MDSYS.SDO_GEOMETRY, -- this is the input parameter of Stored Procedure

我提供sdo_geometry类型对象的代码是:

    parameter.AddWithValue("P_GEOMETRY", geom, OracleDbType.Object, ParameterDirectionWrap.Input);

其中geom是包含sdo_geometry字段的sdo_geometry类对象。 我在示例.net应用程序中遇到的错误是

     Invalid parameter binding 
     Parameter name: P_GEOMETRY

这是避免此问题的最佳方法。

您有两种选择:您可以编写一个包装PL / SQL过程,该过程接受您决定的任何输入,然后使用PL / SQL中的SDO_GEOMETRY设置调用。 或者,您可以使用Oracle Developer Tools for Visual Studio自定义类向导来生成C#代码,该代码映射到SDO_GEOMETRY用户定义的类型。

要执行后者:

安装用于Visual Studio的Oracle Developer Tools,使用ODP.NET连接到服务器资源管理器,并导航到“用户定义的类型”节点,然后找到所需的空间类型(包括SDO_GEOMETRY),然后运行“自定义类向导”以生成可以用于将数据传递到您的存储过程。

以下是应该帮助您理解一般概念的逐步指导:

http://apex.oracle.com/pls/apex/f?p=44785:24:106658667466148:::24:P24_CONTENT_ID,P24_PROD_SECTION_GRP_ID,P24_PREV_PAGE:4258,,24

如果您担心性能,并且涉及大量数据,请考虑改用关联数组,并在客户端放弃UDT。

这是另一个对我有用的解决方案。

例如,使用NetTopologySuite将获取的SDO_Geometry转换为WKB字节数组。 然后在您的存储过程中,使用函数SDO_UTIL.FROM_WKBGEOMETRY(P_GEOMETRY)将字节数组转换为SDO_GEOMETRY

在您的情况下,参数看起来类似于此参数。AddWithValue(“ P_GEOMETRY”,wkbByteArray,OracleDbType.Raw,ParameterDirectionWrap.Input);

嗨,我发现以下解决方案很有用,

OracleParameter endGeometry = cmd.CreateParameter();
endGeometry.OracleDbType = OracleDbType.Object;
endGeometry.UdtTypeName = "MDSYS.SDO_GEOMETRY";
endGeometry.Value = routeSegment.endPointGeometry;
endGeometry.ParameterName = "P_END_GEOM";    

parameter.Add(endGeometry);   

然后将参数与其他变量一起作为输入传递给存储过程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM