2017-03-31 84 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