[英]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),然后运行“自定义类向导”以生成可以用于将数据传递到您的存储过程。
以下是应该帮助您理解一般概念的逐步指导:
如果您担心性能,并且涉及大量数据,请考虑改用关联数组,并在客户端放弃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.