zoukankan      html  css  js  c++  java
  • Oracle自定义类型在C#中调用示例

    1.C#代码:

     public bool UserAmountChange(Dictionary<string, long> fee, Dictionary<string, long> recharge)
            {
                var f = GetRechargeTypeArray(fee);
                var r = GetRechargeTypeArray(recharge);
                using (OracleConnection conn = this.CreateConnection())
                using (OracleCommand cmd = conn.CreateCommand())
                {
                    conn.Open();
                    cmd.CommandText = "Proc_HotStandbyQuotaChange";
                    cmd.CommandType = CommandType.StoredProcedure;
                    var op = new OracleParameter { ParameterName = "result", OracleDbType = OracleDbType.Int32, Direction = ParameterDirection.Output,Value=null };
                    cmd.Parameters.AddRange(new OracleParameter[] {
                        new OracleParameter {ParameterName= "FeeDeduction", OracleDbType=OracleDbType.Array,Direction=ParameterDirection.Input,UdtTypeName= "HOTSTANDBY_RECHARGE_ARRAY", Value=f.ToArray() },
                        new OracleParameter {ParameterName= "Recharge", OracleDbType = OracleDbType.Array, Direction = ParameterDirection.Input, UdtTypeName = "HOTSTANDBY_RECHARGE_ARRAY", Value = r.ToArray() },
                        op });//HotStandby_Recharge_Array
                    cmd.ExecuteNonQuery();
                    int num = Convert.ToInt32(op.Value.ToString());
                    return num == 0;
                }
            }
    

    2.定义与数据库对应类型:

    public class HotStandby_RechargeType : IOracleCustomType
        {
            public void FromCustomObject(OracleConnection con, IntPtr pUdt)
            {
                OracleUdt.SetValue(con, pUdt, "USERNAME", this.UserName);
                OracleUdt.SetValue(con, pUdt, "MSGTYPE", this.MsgType);
                OracleUdt.SetValue(con, pUdt, "VAL", this.Val);
            }
    
            public void ToCustomObject(OracleConnection con, IntPtr pUdt)
            {
                this.UserName = (string)OracleUdt.GetValue(con, pUdt, "USERNAME");
                this.MsgType = (int)OracleUdt.GetValue(con, pUdt, "MSGTYPE");
                this.Val = (int)OracleUdt.GetValue(con, pUdt, "VAL");
            }
            [OracleObjectMapping("USERNAME")]
            public string UserName { get; set; }
            [OracleObjectMapping("MSGTYPE")]
            public int MsgType { get; set; }
            [OracleObjectMapping("VAL")]
            public int Val { get; set; }
        }
        [OracleCustomTypeMappingAttribute("HOTSTANDBY_RECHARGE")]
        public class HotStandby_RechargeFactory : IOracleCustomTypeFactory
        {
            public IOracleCustomType CreateObject()
            {
                return new HotStandby_RechargeType();
            }
        }
        [OracleCustomTypeMapping("HOTSTANDBY_RECHARGE_ARRAY")]
        public class HotStandby_RechargeArrayFactory : IOracleArrayTypeFactory
        {
            public Array CreateArray(int numElems)
            {
                return new HotStandby_RechargeFactory[numElems];
            }
    
            public Array CreateStatusArray(int numElems)
            {
                return null;
            }
        }

    3.数据库类型定义及表类型定义

    --创建表
    CREATE OR REPLACE TYPE HOTSTANDBY_RECHARGE_ARRAY as table of HotStandby_Recharge 
    --创建类型
    CREATE OR REPLACE TYPE HotStandby_Recharge
    is object(
       UserName varchar2(50),
       MsgType integer,
       Val     integer
    )

    4.C#调用的存储过程

    create or replace procedure Proc_HotStandbyQuotaChange
    (
              FeeDeduction in HotStandby_Recharge_Array,
              Recharge in HotStandby_Recharge_Array,
              result  out integer
    )as
    
     cursor f_cursor is select * from table(FeeDeduction) ;
     cursor r_cursor is select * from table(Recharge);
     v_userid integer:=0;
     f_row f_cursor%rowtype;
     r_row r_cursor%rowtype;
    begin
      open f_cursor;--打开游标
      --  fetch f_cursor into f_row ;
          loop
             fetch f_cursor into f_row ;
            --让游标指针往下移动 
            exit when f_cursor%notfound;
            update user_amountinfo t set t.amount=t.amount-(f_row.Val) where t.userid=(select c.userid from base_userinfo c where c.username=f_row.UserName) and t.msgtype=f_row.MsgType;
    --        fetch f_cursor into f_row ;
          end loop;
          close f_cursor;
       open r_cursor;
         loop
           fetch r_cursor into r_row;
           exit when r_cursor%notfound;
           select t.userid into v_userid from user_amountinfo t where t.userid = (select u.userid from base_userinfo u where u.username =r_row.UserName) and t.msgtype = r_row.MsgType;
          if (v_userid>0)
            then
              update user_amountinfo t set t.amount=t.amount-(r_row.Val),t.addtime=SYSDATE(),t.rechargeamount=t.rechargeamount-(r_row.Val) where t.userid=v_userid and t.msgtype=r_row.MsgType;
            elsif (v_userid<=0)
              then
              insert into user_amountinfo(userid,amount,msgtype,addtime,rechargeamount)  values(v_userid,r_row.Val,r_row.MsgType,Sysdate(),r_row.Val);
            end if;
         end loop;
         close r_cursor;
         commit;
         result:=sqlcode;
    end Proc_HotStandbyQuotaChange;
  • 相关阅读:
    提取数据用strpos函数比较,预期和实际不符问题解决
    thinkphp模板中foreach循环没数据的错误解决
    错误之thinkphp模型使用发生的错误
    ThinkPHP添加模板时,犯的三个错
    mysql中的comment用法
    在cmd下输入/g无效
    Windows下PHPUnit安装
    python中string.casefold和string.lower区别
    python3数据类型
    python终端颜色设置
  • 原文地址:https://www.cnblogs.com/rengke2002/p/7462491.html
Copyright © 2011-2022 走看看