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の場合は失敗します...
何か案は?