以下是一段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 VARCHAR2) IS
--Ver 1.0 En.Li 2006-12-12 C-CAR项目 文本接口
P_DATA VARCHAR2(2000);
p_pos1 number;
p_pos2 number;
P_line1 VARCHAR2(32) default '1';
P_line2 VARCHAR2(32) default '2';
P_line3 VARCHAR2(32) default '3';
P_line4 VARCHAR2(32) default '4';
P_line5 VARCHAR2(32) default '5';
P_line6 VARCHAR2(32) default '6';
P_line7 VARCHAR2(32) default '7';
p_cnt int;
BEGIN
P_DATA := DATA;
p_pos1 := 0;
p_pos2 := instr(p_data, chr(10), 1, 1);
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 + 1, 1);
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 + 1, 1);
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 + 1, 1);
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 + 1, 1);
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 + 1, 1);
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;
本文展示了如何在C#中连接并调用Oracle存储过程,详细给出了存储过程的调用代码,以及参数传递的示例。

882

被折叠的 条评论
为什么被折叠?



