欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp.net中调用oracle存储过程的方法

程序员文章站 2023-12-06 12:14:34
存储过程(stored procedure)是在大型数据库系统中,一组为了完成特定功能的sql 语句集,存储在数据库中经过第一次编译后再次调用不需要再次编译,用户通过指定存...

存储过程(stored procedure)是在大型数据库系统中,一组为了完成特定功能的sql 语句集,存储在数据库中经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。

不多说了,本文通过两种方法介绍asp.net中调用oracle存储过程的方法,具体内容请看下面代码。

调用oracle存储过程方法一:

oracle代码

create or replace procedure gd_cursor(mycs1 out sys_refcursor,mycs2 out sys_refcursor,a out varchar)as
begin
 a:='test';
 open mycs1 for
 select 1 from dual;
 open mycs2 for
 select 2 from dual;

end;

c#代码

 

 /// <summary>
 /// 执行oracle存储过程返回多个结果集
 /// </summary>
 /// <param name="strprocname">存储过程名称</param>
 /// <param name="resultcount">返回个数</param>
 /// <param name="paras">参数</param>
 /// <returns>任意对象数组</returns>
 public object[] excuteproc_n_result(string strprocname, int resultcount, params oracleparameter[] paras)
 {
  using (oracleconnection conn = new oracleconnection("user id=用户名;password=密码;data source=数据库;"))
  {
  oraclecommand cmd = new oraclecommand(strprocname, conn);
  if (paras != null && paras.length > 0)
  {
   for (int j = 0; j < paras.length; j++)
   {
   if (paras[j].value == null)
   {
    paras[j].value = dbnull.value;
   }
   }
  }
  cmd.parameters.addrange(paras);
  cmd.commandtype = commandtype.storedprocedure;
  conn.open();
  cmd.executenonquery();
  int i = 0;
  //int noutputparameterscount = 0;
  object[] objresult = new object[resultcount];
  foreach (oracleparameter p in cmd.parameters)
  {
   if (p.direction == parameterdirection.output || p.direction == parameterdirection.inputoutput)
   {
   if (p.value is oracledatareader)
   {
    oracledatareader reader = p.value as oracledatareader;
    objresult[i++] = convertdatareadertodatatable(reader);
   }
   else
   {
    objresult[i++] = p.value;
   }
   }
  }
  return objresult;
  }
 }
 /// <summary> 
 /// 将datareader 转为 datatable 
 /// </summary> 
 /// <param name="datareader">oledbdatareader</param> 
 protected datatable convertdatareadertodatatable(oracledatareader reader)
 {
  datatable objdatatable = new datatable("tmpdatatable");
  try
  {
  int intfieldcount = reader.fieldcount;//获取当前行中的列数;
  for (int intcounter = 0; intcounter <= intfieldcount - 1; intcounter++)
  {
   objdatatable.columns.add(reader.getname(intcounter), reader.getfieldtype(intcounter));
  }
  //populate datatable 
  objdatatable.beginloaddata();
  //object[] objvalues = new object[intfieldcount -1]; 
  object[] objvalues = new object[intfieldcount];
  while (reader.read())
  {
   reader.getvalues(objvalues);
   objdatatable.loaddatarow(objvalues, true);
  }
  reader.close();
  objdatatable.endloaddata();
  return objdatatable;
  }
  catch (exception ex)
  {
  throw new exception("转换出错出错!", ex);
  }
 }

调用方法

oracleparameter[] oracleparameter = new oracleparameter[]{
new oracleparameter("mycs1",oracletype.cursor),
new oracleparameter("mycs2",oracletype.cursor),
new oracleparameter("a",oracletype.varchar,200),
};
oracleparameter[0].direction = parameterdirection.output;
oracleparameter[1].direction = parameterdirection.output;
oracleparameter[2].direction = parameterdirection.output;

object[] xxx = excuteproc_n_result("gd_cursor", 3, oracleparameter);

调用oracle存储过程方法二:

存储过程结构如下:

create or replace procedure xx_yy
(
 i_orderid in number,
 i_returnvalue out number
)
is
 v_realvalue number;
 v_totalvalue number;
 v_advendorid number;
begin
 自己写就行
end;

下面讲一下调用:

表结构

create table ordertable
(
 orderid number not null,
 text number not null
)

存储过程

(
 i_orderid in number,
 i_returnvalue out number
)
is
 spass ordertable.text%type;
begin
 select text into spass from ordertable where orderid=i_orderid; 
 i_returnvalue:=spass;
 exception
 when no_data_found
 then i_returnvalue:=-1; 
end;

源码:

using system.data .oracleclient ;//(别忘了添加)
oracleconnection oraclecon = new oracleconnection ("password=dloco;user id=dloco;data source=dloco;");
  oraclecommand mycmd = new oraclecommand();
  oracleparameter[] parameters = { new oracleparameter("i_orderid", oracletype.number, 10),new oracleparameter("i_returnvalue",oracletype.number,10 )};
  parameters[0].value = 1;
  parameters[1].direction = parameterdirection.output;

  mycmd.connection = oraclecon;
  mycmd.commandtype = commandtype.storedprocedure;
  mycmd.commandtext = "dloco.xx_yy";

  mycmd.parameters .add (parameters[0]);
  mycmd.parameters .add (parameters[1]);

  mycmd.connection.open();  

  mycmd.executenonquery();  
  
  string result=mycmd.parameters["i_returnvalue"].value.tostring();
  messagebox.show (result);

  oraclecon.close();

以上就是asp.net中调用oracle存储过程的全部内容,希望对大家有所帮助。