2010-11-12 69 views
1

我使用的功能的功能:調用用戶定義的類型的參數(甲骨文ODP.NET)

fu_has_permissions(udt_person('johny','superman'),'fly_away') 

udt_person是一個用戶定義的類型:

create or replace TYPE udt_person AS OBJECT 
(name VARCHAR2(3), 
id VARCHAR2(18)); 

我想使用綁定變量whan調用此函數,但我不知道我在做什麼錯誤...這裏是代碼:

...... 
OracleParameter udtPersParam = new OracleParameter(); 
udtPersParam.ParameterName = ":pUdtPers"; 
udtPersParam.UdtTypeName = "UDT_PERS"; 
string[] paramValues = { name, id }; 
udtPersParam.Value = paramValues; 
OracleParameter pAction = new OracleParameter(":pAction", OracleDbType.Varchar2, 255); 
pAction.Value = action; 

parameters.Add(udtPartParam); 
parameters.Add(pAction); 

try 
{ 
_loginOdr = DBFacade.ExecuteSelectQuery("select fu_has_permissions(:pUdtPart, :pAction) from dual", parameters); 
} 

謝謝!

+0

你會得到什麼錯誤?它是否是'UdtTypeName'與Oracle類型名稱不匹配的錯字? – 2010-11-12 08:09:14

+0

「值不在預期的範圍內。」,在行udtPersParam.Value = paramValues; – maephisto 2010-11-12 08:47:45

回答

4

UDT的類型必須是實現 IOracleCustomType 和/或IOracleCustomTypeFactory類,IOracleArrayTypeFactory

unfortuntately你不能只創建一個字符串數組,並傳遞它

的樣子odp.net樣品在附帶ODP安裝 %ORA_HOME%\ client_1與\ odp.net \樣本\ 4 \ UDT

還檢查了這些鏈接,示例和演練 http://developergeeks.com/article/35/working-with-user-defined-type-oracle-udt-and-custom-type-using-odp-net-11g http://www.codeproject.com/KB/database/ORACLE_UDT.aspx 和 http://st-curriculum.oracle.com/obe/db/hol08/dotnet/udt/udt_otn.htm

+0

樣品的路徑在我的情況下是11.2: %ora_home%\ product \ 11.2.0 \ client_1_x86 \ ODACsamples \ odp.net \ 4 \ UDT – 2013-09-10 17:06:58

+0

此外,此處的第二個鏈接不再適用於我。 – 2013-09-10 17:24:41

1

真的不知道ODP.Net的任何內容,但錯誤表明它不像您嘗試使用字符串數組作爲Oracle參數的值。這聽起來不合理。

'odp.net object varchar2'的快速谷歌給了this OTN forum post作爲第一個結果;它包含一個關於使用大約一半的對象的示例,包括從Oracle對象類型轉換和從中轉換。

1

如果我是你,我會看看在ODP加載到Visual Studio。有了這個,你可以連接到你的數據庫,在數據庫上選擇一個UDT,然後「生成自定義類」來獲得一個你可以使用的.net類。

看看課堂內部,你會看到哈里森的含義。請特別注意屬性頂部的OracleObjectMappingAttributes以及To/FromCustomObject的重寫。

當您構建您的OracleCommand時,OracleParameter.Value需要是這種類型的類。

這應該讓你開始在高層次。不過,一句警告。由ODP生成的代碼很難說至少 - 我們正在放棄所有ODP生成的類,在我們自己的場景中。但是您需要了解像IOracleCustomType,IOracleCustomTypeFactory,IOracleArrayTypeFactory,INullable之類的東西,然後才能執行此操作。

順便提一句,因爲你的具體問題圍繞着數組,你可能想在這裏看看Oracle NTYPE,而不是TYPE。