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存储过程的全部内容,希望对大家有所帮助。