我正在使用 ODP.NET 在远程Oracle DB和本地Oracle XE DB之间编写某种同步机制。我正在同步的表有一个空间列(因此是用户定义的类型,sdo_geometry)。我在 C# 中的逻辑对远程数据库执行选择,循环遍历 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 时,它就会失败。
有什么想法吗?
有趣的东西...我看错了方向。
问题不在于插入,而是在执行插入时出现。该问题与参数方向有关。代码似乎无法处理参数的输出方向。当我改变它时,一切都开始重新开始工作。
所以问题暂时解决了。