C# 调用oracle存储过程

本文展示了如何在C#中连接并调用Oracle存储过程,详细给出了存储过程的调用代码,以及参数传递的示例。

以下是一段C#中连接Oracle存储过程的代码:

        //调用存储过程
        private string CallProcdure(string data,DateTime time,string type)
        
{
            OracleConnection myconn;
            OracleCommand cmd;
            
//string strcon = "user id=cmes;data source=SHACIICQ;password=cmes";
            string strcon = ConfigurationSettings.AppSettings["DatabaseConnection"];
            myconn 
= new OracleConnection(strcon);

            cmd 
= new OracleCommand(); 
            
try
            
{
                myconn.Open();
                cmd 
= new OracleCommand(); 
                cmd.Connection 
= myconn; 
            }

            
catch(Exception e)
            
{
                
throw e;
            }

            OracleParameter[] parameters
={
                                             
new OracleParameter("DATA",OracleType.VarChar),
                                             
new OracleParameter("DATETIME",OracleType.DateTime),
                                             
new OracleParameter("I_TYPE",OracleType.VarChar),
                                             
new OracleParameter("RES",OracleType.VarChar,20)    
                                         }
;
            parameters[
0].Value = data;
            parameters[
1].Value = time;
            parameters[
2].Value = type;
            parameters[
3].Direction = ParameterDirection.Output;
            
try
            
{
                cmd.CommandText
="C_SAVE_INTER_DATA";//存储过程名称
                cmd.CommandType=CommandType.StoredProcedure;
                
foreach(OracleParameter parameter in parameters)
                
{
                    cmd.Parameters.Add(parameter);
                }

                cmd.ExecuteNonQuery();
                myconn.Close();
                
return parameters[3].Value.ToString();
            }

            
catch(Exception e)
            
{
                
throw e;
            }

        }

其中传入的参数data是下面的这种形式:

645576H6A180011
OK
1.011
20061214103502

以下是上面调用存储过程的代码: 

 

CREATE OR REPLACE PROCEDURE C_SAVE_INTER_DATA(DATA     IN VARCHAR2,
                                              
DATETIME IN DATE,
                                              I_TYPE   
IN VARCHAR2,
                                              RES      OUT 
VARCHAR2IS
  
--Ver 1.0  En.Li 2006-12-12 C-CAR项目 文本接口
  P_DATA  VARCHAR2(2000);
  p_pos1  
number;
  p_pos2  
number;
  P_line1 
VARCHAR2(32default '1';
  P_line2 
VARCHAR2(32default '2';
  P_line3 
VARCHAR2(32default '3';
  P_line4 
VARCHAR2(32default '4';
  P_line5 
VARCHAR2(32default '5';
  P_line6 
VARCHAR2(32default '6';
  P_line7 
VARCHAR2(32default '7';
  p_cnt   
int;
BEGIN
  P_DATA :
= DATA;
  p_pos1 :
= 0;
  p_pos2 :
= instr(p_data, chr(10), 11);
  
if p_pos2 > 0 then
    P_line1 :
= substr(p_data, 1, p_pos2 - 1);
    p_pos1  :
= p_pos2;
    p_pos2  :
= instr(p_data, chr(10), p_pos1 + 11);
    
if p_pos2 > 0 then
      P_line2 :
= substr(p_data, p_pos1 + 1, p_pos2 - p_pos1 - 1);
      p_pos1  :
= p_pos2;
      p_pos2  :
= instr(p_data, chr(10), p_pos1 + 11);
      
if p_pos2 > 0 then
        P_line3 :
= substr(p_data, p_pos1 + 1, p_pos2 - p_pos1 - 1);
        p_pos1  :
= p_pos2;
        p_pos2  :
= instr(p_data, chr(10), p_pos1 + 11);
        
if p_pos2 > 0 then
          P_line4 :
= substr(p_data, p_pos1 + 1, p_pos2 - p_pos1 - 1);
          p_pos1  :
= p_pos2;
          p_pos2  :
= instr(p_data, chr(10), p_pos1 + 11);
          
if p_pos2 > 0 then
            P_line5 :
= substr(p_data, p_pos1 + 1, p_pos2 - p_pos1 - 1);
            p_pos1  :
= p_pos2;
            p_pos2  :
= instr(p_data, chr(10), p_pos1 + 11);
            
if p_pos2 > 0 then
              P_line6 :
= substr(p_data, p_pos1 + 1, p_pos2 - p_pos1 - 1);
            
ELSE
              P_line6 :
= substr(p_data, p_pos1 + 1, LENGTH(P_DATA) - p_pos1);
            
end if;
          
ELSE
            P_line5 :
= substr(p_data, p_pos1 + 1, LENGTH(P_DATA) - p_pos1);
          
end if;
        
ELSE
          P_line4 :
= substr(p_data, p_pos1 + 1, LENGTH(P_DATA) - p_pos1);
        
end if;
      
ELSE
        P_line3 :
= substr(p_data, p_pos1 + 1, LENGTH(P_DATA) - p_pos1);
      
end if;
    
ELSE
      P_line2 :
= substr(p_data, p_pos1 + 1, LENGTH(P_DATA) - p_pos1);
    
end if;
  
ELSE
    P_line1 :
= substr(p_data, p_pos1 + 1, LENGTH(P_DATA) - p_pos1);
  
end if;

  
if i_type = '0' then
    
--钢印机接口
    --SN(发动机装车单编号)
    --Result(打钢印结果,OK或者NG)
    --Engine Barcode(发动机条形码)
    --Stamping Code(钢印号)
    --Stamping Time(打钢印时间,格式4位年-2位月-2位日 2位时:2位分:2位秒)
    select count(*)
      
into p_cnt
      
from rmes.r_wip_tracking_t w
     
where w.sn = p_line1;
    
if p_cnt < 0 then
      RES :
= 'ERROR SN';
    
else
      
delete from RMES.R_INTERFACE_T
       
where INTER_COLUMN1 = p_line1
         
and interface_type = i_type;
      
INSERT INTO RMES.R_INTERFACE_T
        (INTERFACE_ID,
         interface_type,
         INPUT_TIME,
         INTER_COLUMN1,
         INTER_COLUMN2,
         INTER_COLUMN3,
         INTER_COLUMN4,
         INTER_COLUMN5)
      
VALUES
        (rmes.tempseq.nextval,
         i_type,
         
datetime,
         p_line1,
         p_line2,
         p_line3,
         p_line4,
         p_line5);
      RES :
= 'OK';
    
end if;
  
  elsif i_type 
= '1' then
    
--注油机接口
    --SN(后桥总成条码)
    --Result(加注结果:OK或者NG)
    --Oiling Qty(实际加注量,要求精确到3位小数)
    --Oiling Time(加注时间,格式4位年-2位月-2位日 2位时:2位分:2位秒)
  
    
select count(*)
      
into p_cnt
      
from rmes.r_wip_tracking_t w
     
where w.sn = p_line1;
    
if p_cnt < 0 then
      RES :
= 'ERROR SN';
    
else
      
delete from RMES.R_INTERFACE_T
       
where INTER_COLUMN1 = p_line1
         
and interface_type = i_type;
      
INSERT INTO RMES.R_INTERFACE_T
        (INTERFACE_ID,
         interface_type,
         INPUT_TIME,
         INTER_COLUMN1,
         INTER_COLUMN2,
         INTER_COLUMN3,
         INTER_COLUMN4)
      
VALUES
        (rmes.tempseq.nextval,
         i_type,
         
datetime,
         p_line1,
         p_line2,
         p_line3,
         p_line4);
      RES :
= 'OK';
    
end if;
  elsif i_type 
= '2' then
    
--四轮定位接口
    --SN(后桥总成条码)
    --Result(测试结果:OK或者NG)
    --ToeL(左前束值)
    --ToeR(右前束值)
    --CamberL(左外倾)
    --CamberR(右外倾)
    --TestTime(测试时间,格式4位年-2位月-2位日 2位时:2位分:2位秒)
    select count(*)
      
into p_cnt
      
from rmes.r_wip_tracking_t w
     
where w.sn = p_line1;
    
if p_cnt < 0 then
      RES :
= 'ERROR SN';
    
else
      
delete from RMES.R_INTERFACE_T
       
where INTER_COLUMN1 = p_line1
         
and interface_type = i_type;
      
INSERT INTO RMES.R_INTERFACE_T
        (INTERFACE_ID,
         interface_type,
         INPUT_TIME,
         INTER_COLUMN1,
         INTER_COLUMN2,
         INTER_COLUMN3,
         INTER_COLUMN4,
         INTER_COLUMN5,
         INTER_COLUMN6,
         INTER_COLUMN7)
      
VALUES
        (rmes.tempseq.nextval,
         i_type,
         
datetime,
         p_line1,
         p_line2,
         p_line3,
         p_line4,
         p_line5,
         p_line6,
         p_line7);
      RES :
= 'OK';
    
end if;
    RES :
= 'OK';
  
else
    res :
= '未知的接口类型';
  
end if;

exception
  
when others then
    RES :
= '未知的错误';
END;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值