2017-03-31 52 views
1

我需要在我的c#應用程序中映射Oracle對象類型。網上有大量的例子,包括這裏和其他網站/博客,但所有這些例子都包括使用存儲過程,我不應該這樣做。用存儲過程使用c#映射Oracle UDT

我一直在尋找過去兩天,最近我得到的是一篇關於docs.oracle.com的文章,但它沒有一個例子。

請問任何人都可以舉一個這樣的例子嗎?

我使用Oracle.DataAccess類和我的數據庫的通信和簡單的UDT如下:

create or replace 
TYPE "MYNUMBER_TYPE" AS OBJECT (
    MyNumber NUMBER(13) 
) 
INSTANTIABLE NOT FINAL; 

回答

2

如果要執行PL/SQL,你可以這樣做以下。這足以摧毀世界的統治本身。幾乎。

請注意,這沒有經過測試,因爲我在這裏沒有Oracle DB。不過,我在當前的一個項目中使用了這種方法。

cmd = New OracleCommand("declare " + 
      " lSomeVarchar2 varchar2(255); " + 
      " lSomeNumber number; " + 
      " lSomeLong long; " + 
      "begin " + 
      " loop " + 
      " --do something fancy here " + 
      " end loop; " + 
      " --you can pass variables from outside: " + 
      " :parameterNumber:= lSomeNumber ; " + 
      " :parameterVarChar := lSomeLong; " + 
      "end;", conn); 
      //make these of direction output and you can get values back 
cmd.Parameters.Add("parameterNumber", OracleDbType.Integer).Direction = ParameterDirection.Output; 
cmd.Parameters.Add("parameterVarChar", OracleDbType.VarChar).Direction = ParameterDirection.Output; 
cmd.ExecuteNonQuery(); 

//now you can get the values using something like 
int cNumber = (int)cmd.Parameters("parameterNumber").Value; 
String myString = (String) cmd.Parameters("parameterNumber").Value; 

編輯3又名回答您發表評論:

對於IOracleCustomType接口的用法: 同樣,我無法測試它,因爲我還沒有進入到Oracle數據庫。但是,讓我們來做一些魔術。

第1步:創建你的C#代碼自定義類型從IOracleCustomType繼承:

[OracleCustomTypeMapping("C##USER.MYNUMBER_TYPE")] 
public class MyCustomClass : IOracleCustomType 

然後爲每個類會員,您可以指定Oracle掛件。在下面,名稱「MyNumber」來自您的問題中的自定義類型規範。

[OracleObjectMappingAttribute("MyNumber")] 
public virtual int cNumber{get; set;} 

而且你必須覆蓋的方法FromCustomObjectToCustomObject

//this one is used to map the C# class-object to Oracle UDT 
public virtual void FromCustomObject(OracleConnection conn, IntPtr object){ 
    OracleUdt.SetValue(conn, object, "MyNumber", this.cNumber); 
} 

//and this one is used to convert Oracle UDT to C# class 
public virtual void ToCustomObject(OracleConnection conn, IntPtr object){ 
    this.cNumber = ((int)(OracleUdt.GetValue(conn, object, "MyNumber"))); 
} 

第2步:在數據庫中創建自定義類型,你已經做了。所以我不會在這裏重複。

第3步:現在我們成立了。讓我們試試吧:

//first create your SQL-Statement 
String statement = "SELECT MY_CUSTOM_TYPE_COLUMN FROM MY_SUPER_TABLE"; 

//then set up the database connection 
OracleConnection conn = new OracleConnection("connect string"); 
conn.Open(); 
OracleCommand cmd = new OracleCommand(statement, conn); 
cmd.CommandType = CommandType.Text; 

//execute the thing 
OracleDataReader reader = cmd.ExecuteReader(); 

//get the results 
while(reader.Read()){ 
    MyCustomClass customObject = new MyCustomClass(); 
    //get the Object, here the magic happens 
    customObject = (MyCustomClass)reader.GetValue(0); 

    //do something with your object 

} 
+0

謝謝你的答案,但我的意思是如何實現通過自定義類型在C#中的映射。我讀過的文章提到'IOracleCustomType'和其他接口......我不太明白,但是也許你知道這是怎麼回事...... – dzenesiz

+1

看我上面的編輯 – LSA

+0

閃亮:)非常感謝你! – dzenesiz