`
sangei
  • 浏览: 336338 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

c#向pl/sql传递数组参数

阅读更多

1.OracleParameterpout1=OracleDbType.Varchar2,50);3.数组的参数类型为OracleCollectionType.PLSQLAssociativeArray,且必须明确指定数据元素的个数。如:OracleParameterv_OIDS=newOracleParameter("v_OIDS",OracleDbType.Int64);v_OIDS.Direction=ParameterDirection.Output;v_OIDS.Size=10;v_OIDS.CollectionType=OracleCollectionType.PLSQLAssociativeArray;4.当参数类型是ParameterDirection.Output,调用存储过程后,判定输出参数值是否为null以及转化成c#数据类型的注重事项:OracleParameterpout1=newOracleParameter("v_reason",OracleDbType.varchar2,50);pout1.Direction=ParameterDirection.Output;DataBaseHelper.RunProcedure("PRC_CON_sysuserlogin",newIDataParameter[]{pin1,pin2},pout1);直接用pout1.Value==null是无效的,必须先将其转化为Oracle.DataAccess.Types中的数据类型,然后用Oracle.DataAccess.Types中的数据类型的IsNull属性来判定。如:boolbIsnull=((Oracle.DataAccess.Types.OracleString)pout1.Value).IsNull;转化成c#的数据类型时不能直接用Convert方法和Parase方法,必须转化成Oracle.DataAccess.Types中的数据类型,然后调用向对应的房发.Toxxxx()或者先ToString(),然后在转化。如OracleParameterpout3=newOracleParameter("age",OracleDbType.Int32,ParameterDirection.Output);...intage=((Oracle.DataAccess.Types.OracleDecimal)pout3.Value).ToInt32();或者intage=int.Parase(pout3.Value.ToString());5.输出数组的遍历方法:假如输出参数类型是数组类型,遍历数组中各个元素的方法:OracleParameterv_OIDS=newOracleParameter("v_OIDS",OracleDbType.Int64);v_OIDS.Direction=ParameterDirection.Output;v_OIDS.Size=10;v_OIDS.CollectionType=OracleCollectionType.PLSQLAssociativeArray;for(inti=0;i<10;i ){longa=((Oracle.DataAccess.Types.OracleDecimal[])v_OIDS.Value)[i].ToInt64();}或者for(inti=0;i<10;i ){longa=((Oracle.DataAccess.Types.OracleDecimal)(v_OIDS.ValueasArray).GetValue(i)).ToInt64();}6.在调用存储过程时,假如输入参数为数组,则长度不能为0,数组也不能为null

 

这里主要想归纳一下通过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();
}

 

 

分享到:
评论

相关推荐

    向DLL传递数组参数的实现方法

    当需要向DLL传递数组参数时,这涉及到数据结构的传递和内存管理。下面我们将详细讨论在易语言环境下如何实现这一功能。 易语言是一款中国本土开发的编程语言,其语法简洁明了,适合初学者入门。在易语言中,向DLL...

    2.1.1 C++和C#数据传递 -常用类型数组和List类型传递

    数组在C#中也是对象,所以传递数组参数实际上是在传递数组的引用。这与C++的行为相似,但在C#中,这种行为是默认的,无需特殊语法。例如: ```csharp void ChangeArray(int[] arr) { arr[0] = 5; } public static...

    dll向C#传递数组.rar

    本示例“dll向C#传递数组.rar”提供了如何在C#中调用C++编写的DLL,并传递数组作为参数的具体方法。这种跨语言互操作性依赖于CLI(Common Language Infrastructure)标准,特别是P/Invoke(Platform Invoke)机制。 ...

    C#将字符串数组传递给C++ DLL.rar

    本主题聚焦于如何在C#应用中有效地传递字符串数组给C++ DLL,特别是使用MFC(Microsoft Foundation Classes)库的情况。在Visual Studio 2010环境下,开发者经常需要解决这个问题,以便实现不同语言和库之间的无缝...

    C#调用C++ Dll关于结构体数组引用的传递及解析使用的展示代码

    ### C#调用C++ DLL:结构体数组引用的传递及解析使用详解 #### 引言 在跨语言编程环境中,经常会遇到不同编程语言之间进行交互的需求。C#与C++之间的互操作就是一个典型场景。当C#需要调用C++开发的动态链接库...

    C#调用C++的dll实例,回调函数,string和int数组参数传递

    本实例将详细介绍如何在C#中调用C++的DLL,并处理回调函数、字符串和整型数组参数的传递。 首先,C++的DLL需要定义导出函数,以便C#能够访问。这些函数通常使用`extern "C"`来避免C++的名称修饰,以确保C#能正确...

    C#调用C++DLL传递结构体数组的终极解决方案

    【C#调用C++DLL传递结构体数组的终极解决方案】 在C#和C++混合编程中,常常需要跨语言调用DLL中的函数,而结构体数组是常见的数据传输对象。由于C#和C++对内存管理的方式不同,直接传递结构体数组可能会遇到问题。...

    c#学习体会使用 ref 和 out 传递数组

    ### C#学习体会:使用`ref`和`out`传递数组 在C#语言中,`ref`和`out`是两个非常重要的关键字,它们主要用于处理函数参数的传递方式。通常情况下,在C#中调用方法时,参数是以值传递的方式进行的,也就是说,方法内...

    C# 将两个整型数组的元素相加

    根据给定的文件信息,我们将深入探讨如何在C#中实现两个整型数组元素的相加操作,并且会对相关的概念和技术细节进行详细说明。 ### C#中的数组与基本操作 在C#中,数组是一种非常基础的数据结构,用于存储固定大小...

    C#与MATLAB之间传递参数

    C#与MATLAB之间传递参数 C#和MATLAB是两个不同的编程语言,C#是微软公司开发的面向对象的高级编程语言,而MATLAB是MATLAB公司开发的高性能数值计算语言。两者之间的数据传递是非常重要的,因为在实际应用中,我们...

    c#调用c++DLL,dll有二维数组

    在C++中,二维数组通常以指针的形式传递,因为C++不支持引用参数。而在C#中,我们通常使用`unsafe`上下文来处理指针。 1. **C++ DLL的定义**: 在C++中,创建一个二维数组函数可能如下所示: ```cpp extern "C" ...

    asp.net中后台c#数组与前台js数组交互

    ASP.NET中后台C#数组与前台JS数组交互 在ASP.NET中,后台C#数组与前台JS数组的交互是一个常见的问题。前台JS数组需要从后台C#数组中获取数据,而后台C#数组则需要从数据库中获取数据。下面我们将详细介绍如何实现这...

    Oracle教程之pl/sql简介

    在PL/SQL Developer中,PL/SQL代码执行速度快,因为它直接在数据库服务器上运行,而使用C#等客户端语言通过OracleClient连接数据库时,会有网络延迟和连接池的影响,初次执行可能会较慢,但后续的执行速度会因连接池...

    c#中结构数组的定义

    ### C#中结构数组的深度解析 #### 一、数组概览 在C#中,数组作为基础数据结构,提供了一种存储同类型元素的连续内存区域的方式。数组的索引从0开始,这一特性与许多其他编程语言相似。值得注意的是,C#中的数组...

    C#向C++封送结构体数组[归类].pdf

    C++的DLL导出了一个名为`GetClass`的函数,接收一个`Class`结构体数组作为参数,而`Class`结构体内部包含了一个`Student`结构体数组。 首先,我们来看C++的结构体定义: ```cpp typedef struct Student { char ...

    C,C#webservice 返回数组,二进制

    本主题主要关注的是如何在C#和C# Web服务之间传递数组和二进制数据。这两种语言都广泛应用于开发Web服务,尤其是C#,它提供了强大的.NET Framework支持,使得构建Web服务变得更加便捷。 标题“C,C# webservice 返回...

    C#控制台程序之间参数传递

    本文将详细讲解如何从一个控制台应用程序(源程序)启动另一个控制台应用程序(目标程序),并传递参数字符串,以及如何在目标程序中使用正则表达式解析这些参数。 首先,让我们理解如何在C#中启动另一个EXE程序。...

    易语言源码向DLL传递数组参数的实现方法.7z

    本篇将详细讲解如何在易语言中向DLL传递数组参数,以及实现这一功能的具体步骤和关键知识点。 首先,了解DLL的基本概念。DLL是一种可执行文件,它包含可由多个程序同时使用的代码和数据。通过DLL,开发者可以共享...

    vue中get请求如何传递数组参数的方法示例

    然而,当尝试使用GET请求传递数组参数时,可能会遇到一些问题,因为默认的序列化方式并不符合后端期望的格式。本篇将详细介绍如何在Vue中配置axios,使其能够正确地将数组作为GET请求的参数传递给后端。 首先,问题...

Global site tag (gtag.js) - Google Analytics