工作心得网

工作心得精彩分享
代码积累持续学习

C#获取存储过程Long的返回值



代码如下:

            try
            {
                //1.1 执行存储过程
                List<OracleParameter> list = new List<OracleParameter>();
                list.Add(new OracleParameter() { ParameterName = "VAR_OP_XXXX_", Direction = ParameterDirection.Input, Value = dept_code, OracleDbType = OracleDbType.Varchar2 });
                list.Add(new OracleParameter() { ParameterName = "VAR_OP_XXXX_", Direction = ParameterDirection.Input, Value = user_code, OracleDbType = OracleDbType.Varchar2 });
                list.Add(new OracleParameter() { ParameterName = "RETURNData_", Direction = ParameterDirection.Output, OracleDbType = OracleDbType.Varchar2,Size=50 });

                OracleHelper.ExecuteNonQuery("USP_WAITING_XXXX", list.ToArray());

                object t = list.Where(x => x.ParameterName == "RETURNData_").FirstOrDefault().Value;
                string queryValue = (((OracleString)t).Value).ToString();  }
            catch (Exception ex)
            {
                LogHelper.Error("SetTaskWaitingByUserDAL执行异常" + ex.ToString());
                return -1;
            }

原本 RETURNData_ 的输出值想设计为oracle的long类型,但是怎么都获取不到,如果使用varchar2类型,则需要设置size为很大的值,相当于设置一个很大的缓冲区,会占用内存,所以此方法不可取
最后采用在存储过程中将数据插入到临时表的方法,RETURNData_输出值返回的是一个随机生成的索引主键的方法。

--1.22 获取一个sys_guid
select sys_guid() into strRandom  from dual;


--1.23.1 由于oracle的long类型 在C#中接收可能会出问题 需要转换为varchar类型 转换过程中数据可能丢失 所以直接写入到数据表中
tmpArry:=FN_SPLIT(strtmpLong,',');
v_tmpArryLen := tmpArry.COUNT;
--1.23.2 循环 开始
FOR i IN 1 .. v_tmpArryLen LOOP
    dbms_output.put_line('1.23.2 数组中 '||i||' 数据='||tmpArry(i));   
  tmpArry2:=FN_SPLIT(tmpArry(i),'|');
  strtmp1:=tmpArry2(1);   
  strtmp2:=tmpArry2(2);
   SQL_:='insert into  c_inwaiting_XXXX(tmp_id,tmp_business_type,tmp_business_id,tmp_keyword)   values(SEQ_C_INWAITING_XXXX_ID.Nextval,
   '''||strtmp1||''','''||strtmp2||''','''||strRandom||''') ';
     execute immediate SQL_ ;
     COMMIT;
END LOOP;   


--1.24 返回一个 sys_guid
RETURNData_:=strRandom;


我们的缺点麻烦您能提出,谢谢支持!

关于站长