[Oracle]ASP.NET中使用ODP.NET(ODAC)對含有自定義類型參數的存儲過程進行操作

先在schema下建立自定義類型(packages下的類型無效)

1.先建立一個object type

CREATE OR REPLACE TYPE PLANTINFO_TYPE AS  OBJECT
(
  PLANT    
VARCHAR2(6
),
  SUBPLANT 
VARCHAR2(6
)
)

 

2.再建立一個collections type

 

CREATE OR REPLACE TYPE PLANTINFO_TAB_TYPE AS TABLE OF PLANTINFO_TYPE;

 

 

3.建立一個procedure,其參數引用以上的type

 

代码
CREATE OR REPLACE PACKAGE MYPACK_TEST AS
  
PROCEDURE TEST2(PARAM1 IN  MF_SAVEINFO_TAB_TYPE, PARAM2 OUT SYS_REFCURSOR);
END
 MYPACK_TEST;

CREATE OR REPLACE PACKAGE BODY MYPACK_TEST AS

  
PROCEDURE TEST2(PARAM1 IN MF_SAVEINFO_TAB_TYPE, PARAM2 OUT SYS_REFCURSOR) IS
  
BEGIN
    
OPEN PARAM2 FOR
      
SELECT PLANT, SUBPLANT FROM TABLE (PARAM1);
  
END
 TEST2;
END
 MYPACK_TEST;

 

 

如果想要在ASP.NET中調用以上procedure,直接用microsoft的oracleclient是沒有辦法實現的,必須引用Oracle公司出品的

ODP.NET,它是ODAC套件中的一個組件,請去Oracle官方網站下載.

 

假設你的環境已經建立好,那麼我們看如何用odp.net來調用這個存儲過程

1.先寫好一個class for oracle customer types

 

代码
  [OracleCustomTypeMappingAttribute("PLANTINFO_TYPE" )]
    
public class
 PlantInfoFactory : IOracleCustomTypeFactory
    {
        
#region IOracleCustomTypeFactory Members


        
public  IOracleCustomType CreateObject()
        {
            
return new
 PlantInfo();
        }

        
#endregion

    }

    [OracleCustomTypeMappingAttribute(
"PLANTINFO_TAB_TYPE" )]
    
public class
 PlantInfo_TabFactory : IOracleArrayTypeFactory
    {
        
#region IOracleArrayTypeFactory Members


        
public Array CreateArray(int  numElems)
        {
            
return new
 PlantInfo[numElems];
        }

        
public Array CreateStatusArray(int
 numElems)
        {
            
return null
;
        }

        
#endregion

    }

    
public class  PlantInfo : IOracleCustomType
    {
        
private bool
 p_mIsNull;

        [OracleObjectMappingAttribute(
"PLANT"
)]
        
public String PLANT { getset
; }

        [OracleObjectMappingAttribute(
"SUBPLANT"
)]
        
public String SUBPLANT { getset
; }

        
        
public static
 PlantInfo Null
        {
            
get

            {
                PlantInfo info 
= new  PlantInfo();
                info.p_mIsNull 
= true
; ;
                
return
 info;
            }
        }


        
#region INullable Members


        
public bool  IsNull
        {
            
get { return
 p_mIsNull; }
        }

        
#endregion


        
#region IOracleCustomType Members

        
public void  FromCustomObject(OracleConnection con, IntPtr pUdt)
        {
            
if (PLANT != null
)
                OracleUdt.SetValue(con, pUdt, 
"PLANT"
, PLANT);
            
else

                
throw new NullReferenceException("SaveInfo.PLANT is null" );

            
if (SUBPLANT != null
)
                OracleUdt.SetValue(con, pUdt, 
"SUBPLANT"
, SUBPLANT);
            
else

                
throw new NullReferenceException("SaveInfo.SUBPLANT is null" );           

        }

        
public void
 ToCustomObject(OracleConnection con, IntPtr pUdt)
        {
            PLANT 
= (String)OracleUdt.GetValue(con, pUdt, "PLANT"
);
            SUBPLANT 
= (String)OracleUdt.GetValue(con, pUdt, "SUBPLANT"
);
                    }

        
#endregion


    }

 

2.寫方法直接調用procedure.如下:

 

代码
            string ConStr = @"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleServer)));User Id=root;Password=root;" ;
            PlantInfo[] records 
= new PlantInfo[1
];
            PlantInfo record 
= new
 PlantInfo();
            record.PLANT 
= "W000"
;
            record.SUBPLANT 
= "MP"
;
            records[
0=
 record;

            
//DataOP.Instance.ExecuteCommand("MYPACK_TEST.TEST2", new object[] { records, null });

            using (OracleConnection oc = new  OracleConnection(ConStr))
            {
                OracleCommand cmd 
=
 oc.CreateCommand();
                cmd.CommandText 
= "MYPACK_TEST.TEST2"
;
                cmd.CommandType 
=
 CommandType.StoredProcedure;

                OracleParameter p1 
= new
 OracleParameter();
                p1.OracleDbType 
=
 OracleDbType.Array;
                p1.Direction 
=
 ParameterDirection.Input;
                p1.UdtTypeName 
= "PLANTINFO_TAB_TYPE"
;
                p1.Value 
=
 records;
                cmd.Parameters.Add(p1);

                OracleParameter p2 
= new
 OracleParameter();
                p2.OracleDbType 
=
 OracleDbType.RefCursor;
                p2.Direction 
=
 ParameterDirection.Output;
                cmd.Parameters.Add(p2);

                oc.Open();
                
try

                {
                    OracleDataReader reader 
=  cmd.ExecuteReader();
                    
//cmd.ExecuteNonQuery();

                    DataTable dt = new  DataTable();
                    dt.Load(reader);
                }
                
catch
 (Exception ex)
                {
                    
throw
 ex;
                }
                
finally

                {
                    oc.Close();
                }
            }

 

3.上面的DataTable dt 就是調用procedure返回的結果.

至此,ASP.NET調用這种特殊的存儲過程的寫法就完成了.這种傳值的方法的好處是將值打包成一個對象傳遞給存儲過程,然後在存儲過程中再做存值等其它操作.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值