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

时间:2014-03-24 08:20:21

标签: c# oracle odp.net

我有一个SDO_GEOMETRY对象变量,它从map中获取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

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

3 个答案:

答案 0 :(得分:0)

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

做后者:

安装适用于Visual Studio的Oracle Developer Tools,使用ODP.NET连接到server explorer,然后导航到User Defined Types节点,然后找到所需的空间类型(包括SDO_GEOMETRY),然后运行Custom Class Wizard生成一个类您可以使用它将数据传递到存储过程。

这是一个可以帮助您理解一般概念的步骤:

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。

答案 1 :(得分:0)

这是另一个适合我的解决方案。

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

在你的情况下,参数看起来像是这样的 parameter.AddWithValue(“P_GEOMETRY”,wkbByteArray,OracleDbType.Raw,ParameterDirectionWrap.Input);

答案 2 :(得分:0)

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

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);   

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