- 浏览: 335682 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
hufangxian:
估计面试官都被你的回答搞晕了。
抽象类和接口的理解 -
alvin198761:
需要了解多态和设计模式,了解一些框架的原理,你就知道这东东真正 ...
抽象类和接口的理解 -
sangei:
谢谢楼上提醒,希望慢慢能有所进步。
抽象类和接口的理解 -
jackra:
书背的不错可以看看设计模式如何使用抽象类
抽象类和接口的理解 -
ptsd:
lag(column_x,number1,XX)用来返回当前数 ...
【转】oracle的LAG和LEAD分析函数
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();
}
发表评论
-
SQL中on条件与where条件的区别
2016-02-17 10:26 731/* 标题:SQL中 -
mysql update注意
2016-01-18 16:16 601drop table a; CREATE TABLE IF ... -
Oracle中JOB的创建方法以及一个细节的探究(转)
2012-10-15 16:35 1264在Oracle中可以使用JOB来实现一些任务的自动化执行,类似 ... -
oracle里的job和schedule有什么区别(转)
2012-10-15 16:31 1300610g 中新推出的SCHEDULER可能确实会让很多初接触的朋 ... -
procedure的加密
2012-08-06 14:34 773wrap iname=eptapi.pac oname=ept ... -
sql plus中执行pl/sql
2012-03-23 00:18 0declare v_string varc ... -
(转)oracle 带输出参数存储过程
2012-03-23 00:13 0执行带输出参数的存储过程 SQL> var c v ... -
(转)Oracle:Authid Current_User的使用
2012-03-22 23:53 0我们知道,用户拥有的role权限在存储过程是不可用的。遇 ... -
在pl/sql里select dba_jobs为什么不成功
2012-03-22 23:52 0PROCEDURE TEST1 ( PROCEDR ... -
(转)Oracle 中的exception——(Raise)
2012-03-22 23:30 15551.GOTO,主要用于跳转,但会打乱我们的程序逻辑,一般不使用 ... -
(转)批量绑定—BULK COLLECT
2012-03-22 23:26 2895在 PL/SQL 编码中,经常会从表中获取结果集,然后进行一些 ... -
(转)PL/SQL --> 动态SQL的常见错误
2012-03-22 18:31 1443--============================ ... -
Oracle SELECT with an array using an IN
2012-01-18 17:03 1329Oracle SELECT with an ... -
pl/sql 实现类似于split 的分割字符串的功能
2012-01-12 23:55 61541、先建立一个包,定义数组类型:CREATE OR REP ... -
execute immediate
2012-01-12 21:41 1235EXECUTE IMMEDIATE Statement ... -
【实验】【PROCEDURE】一个最简单的oracle存储过程"proc_helloworld"
2011-08-08 09:51 1249本文通过一个最简单的oracle存储过程"proc_ ... -
创建oracle job
2011-07-27 17:20 887oracle job简介 主要的使用情景 定时在后台执行 ...
相关推荐
当需要向DLL传递数组参数时,这涉及到数据结构的传递和内存管理。下面我们将详细讨论在易语言环境下如何实现这一功能。 易语言是一款中国本土开发的编程语言,其语法简洁明了,适合初学者入门。在易语言中,向DLL...
10. **存储过程与存储函数的调用**:从应用程序(如Java、C#等)中调用PL/SQL编写的存储过程和函数,以及如何处理返回值和参数。 11. **事务管理**:理解事务的概念,掌握COMMIT、ROLLBACK和SAVEPOINT操作,以确保...
本示例“dll向C#传递数组.rar”提供了如何在C#中调用C++编写的DLL,并传递数组作为参数的具体方法。这种跨语言互操作性依赖于CLI(Common Language Infrastructure)标准,特别是P/Invoke(Platform Invoke)机制。 ...
### C#调用C++ DLL:结构体数组引用的传递及解析使用详解 #### 引言 在跨语言编程环境中,经常会遇到不同编程语言之间进行交互的需求。C#与C++之间的互操作就是一个典型场景。当C#需要调用C++开发的动态链接库...
本主题聚焦于如何在C#应用中有效地传递字符串数组给C++ DLL,特别是使用MFC(Microsoft Foundation Classes)库的情况。在Visual Studio 2010环境下,开发者经常需要解决这个问题,以便实现不同语言和库之间的无缝...
本实例将详细介绍如何在C#中调用C++的DLL,并处理回调函数、字符串和整型数组参数的传递。 首先,C++的DLL需要定义导出函数,以便C#能够访问。这些函数通常使用`extern "C"`来避免C++的名称修饰,以确保C#能正确...
【C#调用C++DLL传递结构体数组的终极解决方案】 在C#和C++混合编程中,常常需要跨语言调用DLL中的函数,而结构体数组是常见的数据传输对象。由于C#和C++对内存管理的方式不同,直接传递结构体数组可能会遇到问题。...
### C#学习体会:使用`ref`和`out`传递数组 在C#语言中,`ref`和`out`是两个非常重要的关键字,它们主要用于处理函数参数的传递方式。通常情况下,在C#中调用方法时,参数是以值传递的方式进行的,也就是说,方法内...
根据给定的文件信息,我们将深入探讨如何在C#中实现两个整型数组元素的相加操作,并且会对相关的概念和技术细节进行详细说明。 ### C#中的数组与基本操作 在C#中,数组是一种非常基础的数据结构,用于存储固定大小...
C#与MATLAB之间传递参数 C#和MATLAB是两个不同的编程语言,C#是微软公司开发的面向对象的高级编程语言,而MATLAB是MATLAB公司开发的高性能数值计算语言。两者之间的数据传递是非常重要的,因为在实际应用中,我们...
在C++中,二维数组通常以指针的形式传递,因为C++不支持引用参数。而在C#中,我们通常使用`unsafe`上下文来处理指针。 1. **C++ DLL的定义**: 在C++中,创建一个二维数组函数可能如下所示: ```cpp extern "C" ...
ASP.NET中后台C#数组与前台JS数组交互 在ASP.NET中,后台C#数组与前台JS数组的交互是一个常见的问题。前台JS数组需要从后台C#数组中获取数据,而后台C#数组则需要从数据库中获取数据。下面我们将详细介绍如何实现这...
在PL/SQL Developer中,PL/SQL代码执行速度快,因为它直接在数据库服务器上运行,而使用C#等客户端语言通过OracleClient连接数据库时,会有网络延迟和连接池的影响,初次执行可能会较慢,但后续的执行速度会因连接池...
### C#中结构数组的深度解析 #### 一、数组概览 在C#中,数组作为基础数据结构,提供了一种存储同类型元素的连续内存区域的方式。数组的索引从0开始,这一特性与许多其他编程语言相似。值得注意的是,C#中的数组...
C++的DLL导出了一个名为`GetClass`的函数,接收一个`Class`结构体数组作为参数,而`Class`结构体内部包含了一个`Student`结构体数组。 首先,我们来看C++的结构体定义: ```cpp typedef struct Student { char ...
数组在C#中也是对象,所以传递数组参数实际上是在传递数组的引用。这与C++的行为相似,但在C#中,这种行为是默认的,无需特殊语法。例如: ```csharp void ChangeArray(int[] arr) { arr[0] = 5; } public static...
本主题主要关注的是如何在C#和C# Web服务之间传递数组和二进制数据。这两种语言都广泛应用于开发Web服务,尤其是C#,它提供了强大的.NET Framework支持,使得构建Web服务变得更加便捷。 标题“C,C# webservice 返回...
本文将详细讲解如何从一个控制台应用程序(源程序)启动另一个控制台应用程序(目标程序),并传递参数字符串,以及如何在目标程序中使用正则表达式解析这些参数。 首先,让我们理解如何在C#中启动另一个EXE程序。...
本篇将详细讲解如何在易语言中向DLL传递数组参数,以及实现这一功能的具体步骤和关键知识点。 首先,了解DLL的基本概念。DLL是一种可执行文件,它包含可由多个程序同时使用的代码和数据。通过DLL,开发者可以共享...