2015-12-01 39 views
0

我正在嘗試調用具有返回類型數字的Oracle函數。我使用OleDB從C#調用,並且我明白Oracle中的類型編號映射是小數。每當我打電話給我時,我都會回到0。Oracle c#編號函數始終返回0

using (OleDbCommand _cmdDueAtDock = new OleDbCommand()) { 

    _cmdDueAtDock.Connection = connection; 
    _cmdDueAtDock.CommandType = CommandType.StoredProcedure; 
    _cmdDueAtDock.CommandText = "IFSAPP.PURCHASE_ORDER_LINE_API.GET_DUE_AT_DOCK"; 

    _cmdDueAtDock.Parameters.Add(new OleDbParameter() { 
     ParameterName = "rv_", 
     OleDbType = OleDbType.Decimal, 
     Direction = ParameterDirection.ReturnValue 
    }); 
    _cmdDueAtDock.Parameters.Add(new OleDbParameter() { 
     ParameterName = "order_no_", 
     OleDbType = OleDbType.VarChar, 
     Size = 50, 
     Direction = ParameterDirection.Input, 
     Value = _order_line.ORDER_NO 
    }); 
    _cmdDueAtDock.Parameters.Add(new OleDbParameter() { 
     ParameterName = "line_no_", 
     OleDbType = OleDbType.VarChar, 
     Size = 50, 
     Direction = ParameterDirection.Input, 
     Value = _order_line.LINE_NO 
    }); 
    _cmdDueAtDock.Parameters.Add(new OleDbParameter() { 
     ParameterName = "release_no_", 
     OleDbType = OleDbType.VarChar, 
     Size = 50, 
     Direction = ParameterDirection.Input, 
     Value = _order_line.RELEASE_NO 
    }); 

    try { 
     _cmdDueAtDock.ExecuteNonQuery(); 
     dueAtDock = Convert.ToDecimal(_cmdDueAtDock.Parameters["rv_"].Value); 
    } catch (Exception ex) { 
     dueAtDock = 0; 
    } 
} 

我使用Oracle client 11.2.0和Oracle數據庫版本是10.2.0.4.0

我讀到過有問題11.1客戶端,我實際上是能夠通過select to_char(function) from dual到sumulate與11.1客戶端的行爲 - 我得到一個正確的結果,而不to_charto_char一個0。將我的客戶端升級到11.2可以在本地解決此問題。

+1

你能展示你的SP定義嗎? –

+0

我在想這個11.1的錯誤讓我覺得這是別人的錯 - 不是我的:/ –

回答

0

我的猜測是值始終爲0,因爲catch塊總是被觸發。我看到一個明顯的罪魁禍首,另一個可能。我預先假設你的存儲過程看起來是這樣的:

create or replace procedure GET_DUE_AT_DOCK(
    order_no_ in varchar2, 
    line_no_ in varchar2, 
    release_no_ in varchar2, 
    rv_ out number 
) as 
BEGIN 
    rv_ := 999; 
END; 

我相信你ParameterDirection物業必須Output而不是ReturnValue。我可能是錯的,但我認爲ReturnValue與普通SQL命令使用,你有一個RETURNING條款,例如:

insert into foo (name, birthday) 
values (:NAME, :BIRTHDAY) 
returning unique_id into :ID; 

我可能是錯的,但是這就是我覺得是。

其次,對於存儲過程,我認爲參數聲明很重要,需要與過程中的實際參數保持一致。如果我上面的例子在概念上是正確的,那麼您需要按照該順序放置參數(order_no,line_no,release_no,rv)。在沒有真正看到你的存儲過程的情況下,很難說 - 你實際上可能是對的。

因此,假設SP看起來像我的例子,這應該這樣做:

_cmdDueAtDock.Parameters.Add(new OleDbParameter() { 
    ParameterName = "order_no_", OleDbType = OleDbType.VarChar, 
    Direction = ParameterDirection.Input, Value = _order_line.ORDER_NO }); 
_cmdDueAtDock.Parameters.Add(new OleDbParameter() { 
    ParameterName = "line_no_", OleDbType = OleDbType.VarChar, 
    Direction = ParameterDirection.Input, Value = _order_line.LINE_NO }); 
_cmdDueAtDock.Parameters.Add(new OleDbParameter() { 
    ParameterName = "release_no_", OleDbType = OleDbType.VarChar, 
    Direction = ParameterDirection.Input, Value = _order_line.RELEASE_NO }); 
_cmdDueAtDock.Parameters.Add(new OleDbParameter() { 
    ParameterName = "rv_", OleDbType = OleDbType.Decimal, 
    Direction = ParameterDirection.Output }); /// <- change is here 

try 
{ 
    _cmdDueAtDock.ExecuteNonQuery(); 
    decimal dueAtDock = Convert.ToDecimal(_cmdDueAtDock.Parameters[3].Value); 
} 
catch (Exception ex) 
{ 
    decimal dueAtDock = 0; 
} 
1

非常感謝您的答覆,但它下降到一個數據庫事務,並執行代碼的順序 - 有一個在這之前的代碼塊正在執行一些影響函數結果的東西。

希望我錯過了這個幫助別人的人撓頭!

Dom