我有一个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
这是避免此问题的最佳方法。
答案 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生成一个类您可以使用它将数据传递到存储过程。
这是一个可以帮助您理解一般概念的步骤:
如果您担心性能并且涉及大量数据,请考虑使用关联数组,并在客户端放弃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);
参数随后作为输入与其他变量一起传递给存储过程