2012-08-15 56 views
0

我正在使用ODP.NET編寫遠程Oracle DB和本地Oracle XE DB之間的某種同步機制。我正在同步的表有一個空間列(因此是一個用戶定義類型,sdo_geometry)。我在C#中的邏輯在遠程數據庫上進行選擇,循環遍歷OracleDataReader的結果並將結果插入本地數據庫。Oracle UDT(SdoGeometry)插入DBNull.Value失敗

這就像一個魅力,但在空間列的值是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]; 

正如我早些時候說。當存在空間值時,代碼工作得很好。但是,當閱讀器[i]的值爲DBNull.Value ...

任何想法?

回答

0

有趣的東西......我看着錯誤的方向。

問題不在於插入,而是在執行插入時出現。問題與參數方向有關。看來代碼無法處理參數的輸出方向。當我改變它時,一切都開始重新起作用。

所以問題現在解決了。