首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > Oracle Data Provider for .NET 的使用经验(3)
【标  题】:Oracle Data Provider for .NET 的使用经验(3)
【关键字】:Oracle,Data,Provider,for,.NET
【来  源】:http://blog.csdn.net/xinsir/archive/2006/08/04/1018831.aspx

Oracle Data Provider for .NET 的使用经验(3)

 2.前面用OracleDataAdapter访问DB,需要DataSet参数做对应操作。
但是在实行固定sql文或者存储过程的时候,我们可以采用OracleCommand 的ExecuteNonQuery()方法。

2.1 执行sql文的时候,很简单,只要设置OracleCommand 的CommandText。执行即可。
C#例
cmd.CommandText = "update emp set sal = sal + .01 where empno=7934";
int rowsUpdated = cmd.ExecuteNonQuery();

2.2 这里主要想归纳一下通过OracleCommand调用存储过程的方法。
首先设置CommandText属性为存储过程的名称。注意带package名
其次将CommandType 属性设为System.Data.CommandType.StoredProcedure
然后填入相应的参数。参数可以为oracle的各种类型。

通过下面例子说明如何调用oracle的数组参数和cursor参数。

//PL/SQL
//--------------------------------------------------------
//Oracle服务器上 存储过程
//包含三个参数。
//I_ID 输入参数  VARCHAR2 类型
//I_TBL 输入参数 VARCHAR(10) 型的数组
//O_CUR 输出参数 cursor 类型
CREATE OR REPLACE PACKAGE JK_WAIN_0203.PKG_TEST IS
 TYPE TYPE_TAB_111 IS TABLE OF VARCHAR(10) INDEX BY BINARY_INTEGER;
 PROCEDURE PROC_GET_DATA(
  I_ID IN VARCHAR2, //
  I_TBL IN TYPE_TAB_111,
  O_CUR  OUT SYS_REFCURSOR);
END PKG_TEST;
/

CREATE OR REPLACE PACKAGE BODY JK_WAIN_0203.PKG_TEST IS
 PROCEDURE PROC_GET_DATA(
  I_ID IN VARCHAR2,
  I_TBL IN TYPE_TAB_111,
  O_CUR  OUT SYS_REFCURSOR)
 IS
  V_INDEX NUMBER := 0;
  V_INDEX_MAX NUMBER := 0;
  V_DATA  VARCHAR(10);
 BEGIN
  V_INDEX := I_TBL.FIRST;
  V_INDEX_MAX := I_TBL.LAST;

  WHILE V_INDEX <= V_INDEX_MAX LOOP 
   V_DATA := I_TBL(V_INDEX); 
   V_INDEX := V_INDEX + 1;
  END LOOP;

  OPEN O_CUR FOR SELECT * FROM TAB WHERE ROWNUM < 10;
 END PROC_GET_DATA;
END PKG_TEST;
/
---------------------------------------------------------------------------
//C#例
public void Get_PrecedureData()
{
 OracleConnection connection = null;//Connection
 OracleCommand oraCommand = new OracleCommand();
 OracleParameter paramId = null; 
 OracleParameter paramTbl = null;
 OracleParameter paramCur = null;
 OracleRefCursor pInfoCur = null;
 DataSet dtRtn = new DataSet();
 
 //数据库连接
 connection = new OracleConnection("User Id=scott;Password=tiger;Data Source=oracle");
 connection.Open();
 oraCommand.Connection = connection;
 oraCommand.Parameters.Clear();

 // 存储过程 设定
 oraCommand.CommandText = "PKG_TEST.PROC_GET_DATA";
 oraCommand.CommandType = System.Data.CommandType.StoredProcedure;

 // 输入输出参数设定
 // Varchar2型
 paramId = oraCommand.Parameters.Add( "I_ID", OracleDbType.Varchar2, ParameterDirection.Input );

 // 数组类型参数设定
 paramTbl = oraCommand.Parameters.Add( "I_TBL", OracleDbType.Varchar2, ParameterDirection.Input );
      // 将CollectionType 设为 PLSQLAssociativeArray
 paramTbl.CollectionType = OracleCollectionType.PLSQLAssociativeArray;

 //cursor 类型参数设定
 paramCur = oraCommand.Parameters.Add("O_CUR", OracleDbType.RefCursor, ParameterDirection.Output );

 //设置参数数组的大小
 //注意:参数的Value 属性和ArrayBindSize 属性必须为元素个数相同的数组,且个数等于参数的Size 属性
 int[] bindSize = new int[10];
 string[] tblData = new string[10]; 
 for(int ii = 0; ii < 10; ii++)
 {
  tblData[ii] = ii.ToString();//数值
  bindSize[ii] = 10;//数值的大小
 }
 //数组参数设定
 paramTbl.Value = tblData; 
 paramTbl.Size = 10;   
 paramTbl.ArrayBindSize = bindSize;

 //存储过程执行
 oraCommand.ExecuteNonQuery();

 //out的cursor值的读取
 using(OracleDataAdapter da = new OracleDataAdapter())
 {
  if(paramCur.Value != System.DBNull.Value)
  {
   pInfoCur = (OracleRefCursor)paramCur.Value;
   da.Fill(dtRtn, pInfoCur);
  }
  //取得记录数
  Console.WriteLine("the number of record count is {0}", dtRtn.Tables[0].Rows.Count);
 }

 oraCommand.Dispose();
 connection.Close();
 connection.Dispose();
}

在 ASP.NET 中实现会话状态的基础:【上一篇】
ASP.Net文件上传:【下一篇】
【相关文章】
  • 在 ASP.NET 中实现会话状态的基础
  • ASP.NET2.0应用中定制安全凭证之实践篇(一)
  • ASP.NET2.0应用中定制安全凭证之实践篇(二)
  • ASP.NET2.0应用中定制安全凭证之实践篇(三)
  • [水晶報表]VS.net2003下匯出時Excel的有效設定8/5
  • Asp.net 1.0 升级至 ASP.NET 2.0十个问题总结
  • 基于asp.net实现的一个客户反馈系统
  • DataGrid的修改、删除
  • ASP.NET中上传并读取Excel文件数据
  • 关于C#(ASP.net)存取MySQL LongText字段的心得
  • 【随机文章】
  • 距离rhce考试还有17天
  • 初识JAVA-面面观!
  • PHOTOSHOP的极品滤镜KPT6.0(二)
  • 创建一个基于模板的数据库记录集操作类(一)
  • You mean like this
  • Speech API In WPF
  • pkg*命令查询功能在Solaris 10中的改进
  • Java中使用MySQL从安装、配置到实际程序测试详解
  • JAVA经验谈:尽可能使用堆栈变量
  • 轻轻松松的穿透网络防火墙
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.