Oracle UDT(SdoGeometry)插入DBNull.Value失败

时间:2012-08-15 13:01:44

标签: c# oracle odp.net user-defined-types dbnull

我正在使用ODP.NET在远程Oracle DB和本地Oracle XE DB之间编写某种同步机制。我正在同步的表有一个空间列(因此用户定义类型,sdo_geometry)。我在C#中的逻辑在远程数据库上执行select操作,循环遍历OracleDataReader的结果并将结果插入到本地数据库中。

这就像魅力一样,但当空间列的值为DBNull.Value时,插入失败并显示以下消息:

Object reference not set to an instance of an object.

   at Oracle.DataAccess.Client.OracleParameter.PostBind_OracleObject(OracleConnection conn)
   at Oracle.DataAccess.Client.OracleParameter.PostBind(OracleConnection conn, OpoSqlValCtx* pOpoSqlValCtx, Int32 arraySize)
   at Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()
   at Gwr.Bsb.Oli.Framework.Helpers.SynchronizationHelper.TryModifyData(OracleCommand cmd) 

代码类似于:

var parameter = new OracleParameter(parameterName, OracleDbType.Object);
parameter.OracleDbType = OracleDbType.Object;
parameter.UdtTypeName = "MDSYS.SDO_GEOMETRY";
parameter.Direction = ParameterDirection.InputOutput;
parameter.Value = reader[i];

正如我先前所说。当存在空间值时,代码工作得很好。但是当 reader [i] 的值为DBNull.Value时,它会失败...

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

有趣的东西......我正在寻找错误的方向。

问题不在插入处,而是在执行插入时出现。问题与参数方向有关。似乎代码无法处理参数的输出方向。当我改变它时,一切都开始起作用了。

现在问题解决了。