当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ADO.NET访问Oracle 9i存储过程(上)

ASP.NET
Asp.net利用JQuery弹出层加载数据代码
asp.net dataview做无限极分类的又一用法
asp.net ckeditor编辑器的使用方法
告别ADO.NET实现应用系统无缝切换的烦恼(总结篇)
asp.net 实现动态显示当前时间(不用javascript不考虑开销)
.net动态显示当前时间(客户端javascript)
asp.net 结合YUI 3.0小示例
asp.net 取消缓存相关问题说明
asp.net 计划任务管理程序实现,多线程任务加载
ASP.NET 跨页面传值方法
asp.net中url地址传送中文参数时的两种解决方案
Asp.net 菜单控件简洁版
asp.net jQuery Ajax用户登录功能的实现
asp.net SharpZipLib的压缩与解压问题
asp.net url重写后页面回传问题
asp.net与Discuz!NT整合集成实例教程
Discuz!NT 3与asp.net 整合的实例教程
测试控制台使用方法
.net 动态标题实现方法
asp.net *.ashx类型的文件使用说明

ASP.NET 中的 ADO.NET访问Oracle 9i存储过程(上)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 107 ::
收藏到网摘: n/a

本文讨论了如何使用 ADO.NET访问 Oracle存储过程(称为 SQL 编程块)和函数(返回单个值的编程块)。

您可以使用以下托管数据提供程序连接到 Oracle 数据库:Microsoft.NET Oracle 提供程序、OLE DB .NET 提供程序、ODBC .NET 数据提供程序以及 Oracle 的 ODP.NET 提供程序。本文使用用于 Oracle 的 Microsoft?.NET 框架数据提供程序。使用 Oracle ODP.NET 数据提供程序或用于 OLE DB 的 Microsoft .NET 框架数据提供程序时可使用不同的功能。

Oracle .NET 数据提供程序随 .NET 框架 1.1 一起提供。如果您使用的是 .NET 框架 1.0,您将需要下载.NET Managed Provider for Oracle。无论是哪个版本,数据提供程序类都位于 System.Data.OracleClient 命名空间中。

概述

PL/SQL 是 SQL 的 Oracle 实现。它与 Microsoft?SQL Server? 所使用的 T-SQL 类似,但也有一些不同之处,本文稍后对此进行了详细讨论。与 T-SQL 一样,PL/SQL 扩展了标准SQL。PL/SQL 用于定义命名编程块,如存储过程、函数和触发器。

可使用 System.Data.OracleClient 命名空间中类的子集来执行 Oracle 存储过程和函数。下表对这些类进行了说明:

类 说明

OracleCommand

针对 Oracle 数据库执行的存储过程的 SQL 语句。

OracleConnection

打开的数据库连接。 

执行存储过程

执行 Oracle 存储过程与执行 SQL Server 存储过程类似。下面的步骤说明了如何执行 Oracle 存储过程和检索它返回的结果。

1.

在 HR 架构中创建一个名为 COUNT_JOB_HISTORY 的存储过程,以计算 JOB_HISTORY 表中的记录数。

以下为引用的内容:

CREATE OR new PROCEDURE COUNT_JOB_HISTORY

  (

  reccount OUT NUMBER

  )

  IS

  BEGIN

  SELECT COUNT(*) INTO reccount

  FROM JOB_HISTORY;

  END COUNT_JOB_HISTORY;

HR 架构是默认 Oracle 安装中包含的一个示例。

2.

将 System.Data.OracleClient.dll(用于 Oracle 的 Microsoft .NET 框架数据提供程序)的引用添加到项目中。

3.

使用 using 指令导入 OracleClient 类中的类型。  

以下为引用的内容:

using System.Data.OracleClient;

4.

创建一个 OracleConnection 对象。

以下为引用的内容:

  OracleConnection conn = new OracleConnection("Data Source=oracledb;

  User Id=UserID;Password=Password;");

用您的值替换 Oracle 数据库的名称、用户名和密码。

5.

创建一个 OracleCommand 对象。将其 Connection 属性设置为第 4 步中创建的连接。将其 CommandText 设置为存储过程的名称,并将其 CommandText 属性设置为 CommandType.StoredProcedure。当您调用第 8 步中介绍的一个 Execute() 方法时,该命令对象将执行指定的存储过程。

以下为引用的内容:

  OracleCommand cmd = new OracleCommand();

  cmd.Connection = conn;

  cmd.CommandText = "COUNT_JOB_HISTORY";

  cmd.CommandType = CommandType.StoredProcedure;

如果您的存储过程名称含有特殊字符,您就必须使用转义序列。您可以通过重置 CommandText 属性来重用现有的 OracleCommand 对象。

6.

创建输入、输出和返回值的 OracleParameter 对象,并将其添加到 OracleCommand 对象的参数集合中。

以下为引用的内容:

  cmd.Parameters.Add("reccount", OracleType.Number).Direction =

  ParameterDirection.Output;

该行代码是以下两行代码的简写形式:

以下为引用的内容:

  cmd.Parameters.Add("reccount", OracleType.Number);

  cmd.Parameters["reccount"].Direction = ParameterDirection.Output;

7.

如果您要检索结果集,请创建 DataSet、DataTable 或 DataReader。在本示例中,我们只是获取第 6 步中创建的输出参数中的计数。

8.

使用 OracleCommand 对象的一个 Execute 方法打开连接并执行存储过程,如下所示:

方法 说明

  ExecuteReader

通过执行能够返回结果集的存储过程生成 OracleDataReader。

  ExecuteNonQuery

执行不返回结果集的查询或过程,返回受影响的行数。

  ExecuteOracleNonQuery

执行查询,返回受影响的行数。

该方法还使用 OracleString 参数来返回 UPDATE、INSERT 或 DELETE 查询所修改的最后一行的行 ID。

  ExecuteScalar

执行一个查询或过程,并且返回查询或过程的返回值,或者将结果集第一行第一列的值作为 .NET 框架数据类型返回。

  ExecuteOracleScalar

执行一个查询或过程,并且返回查询或过程的返回值,或者将结果集第一行第一列的值作为 OracleType 数据类型返回。

使用完连接后,不要忘记将其关闭。

  conn.Open();

  cmd.ExecuteNonQuery();

  conn.Close();

如果您要使用 DataAdapter 来填充 DataTable 或 DataSet,可以依靠 DataAdapter 来打开和关闭连接。

9.

处理结果。在我们的示例中,可在显示到控制台的输出参数中得到记录数:

  

以下为引用的内容:

Console.WriteLine(cmd.Parameters["reccount"].Value);

下面是在本示例中开发的用于执行存储过程和检索结果的代码:  

以下为引用的内容:

       OracleConnection conn = new OracleConnection("Data Source=oracledb;

  User Id=UserID;Password=Password;");

  OracleCommand cmd = new OracleCommand();

  cmd.Connection = conn;

  cmd.CommandText = "COUNT_JOB_HISTORY";

  cmd.CommandType = CommandType.StoredProcedure;

  cmd.Parameters.Add("reccount", OracleType.Number).Direction =

  ParameterDirection.Output;

  conn.Open();

  cmd.ExecuteNonQuery();

  conn.Close();

  Console.WriteLine(cmd.Parameters["reccount"].Value);

不返回数据的存储过程

OracleCommand 类的 ExecuteOracleNonQuery() 方法用于执行不返回任何行的 SQL 语句或存储过程。该方法返回一个 int 值,表示受 UPDATE、INSERT 和 DELETE 命令影响的行数;如果没有任何行受到影响,则返回 -1。如果您所执行的 INSERT、DELETE 或 UPDATE 语句恰好影响一行,则该方法具有单个参数 OracleString out rowid,该参数唯一标识 Oracle 数据库中受影响的行。可以使用该值来优化后续相关查询。

还可以使用 OracleCommand 类的 ExecuteNonQuery() 方法来执行不返回数据的存储过程,但您将无法获得上面介绍的唯一行标识符。

尽管上述命令都不会返回任何数据,但映射到参数的输出参数和返回值仍然使用数据进行填充。这使您可以使用上述任一命令从存储过程返回一个或多个标量值。

以下 Oracle 存储过程删除了由单个输入参数指定的员工的所有工作经历,并且不返回任何数据。

以下为引用的内容:

   CREATE OR new PROCEDURE DELETE_JOB_HISTORY

  (

  p_employee_id NUMBER

  )

  IS

  BEGIN

  DELETE FROM job_history

  WHERE employee_id = p_employee_id;

  END DELETE_JOB_HISTORY;

以下代码运行了该存储过程。

以下为引用的内容:

    // create the connection

  OracleConnection conn = new OracleConnection("Data Source=oracledb;

  User Id=UserID;Password=Password;");

  // create the command for the stored procedure

  OracleCommand cmd = new OracleCommand();

  cmd.Connection = conn;

  cmd.CommandText = "COUNT_JOB_HISTORY";

  cmd.CommandType = CommandType.StoredProcedure;

  // add the parameter specifying the employee for whom to delete records

  cmd.Parameters.Add("p_employee_id", OracleType.Number).Value = 102;

  OracleString rowId;

  // execute the stored procedure

  conn.Open();

  int rowsAffected = cmd.ExecuteNonQuery();

  conn.Close();

  Console.WriteLine("Rows affected: " + rowsAffected);

如果您尚未修改默认的 HR 安装,则 JOB_HISTORY 表中员工 102 的记录被删除,并且向控制台输出以下内容:

Rows affected: 1

访问返回值

RETURN 语句立即将控制从存储过程返回到调用程序。Oracle 存储过程中的 RETURN 语句无法像在 T-SQL 中那样返回值。

Oracle 函数是计算并返回单个值的子程序。它们的结构类似于存储过程,不同之处在于它们总是具有必须返回值的 RETURN 子句。

下面是一个返回指定员工的电子邮件的函数:  

以下为引用的内容:

        CREATE OR new FUNCTION GET_EMPLOYEE_EMAIL (

  p_employee_id NUMBER

  )

  RETURN VARCHAR2

  IS p_email VARCHAR2(25);

  BEGIN

  SELECT EMAIL INTO p_email FROM EMPLOYEES

  WHERE EMPLOYEE_ID = p_employee_id;

  RETURN p_email;

  END GET_EMPLOYEE_EMAIL;

执行函数的方式与执行存储过程的方式相同。可使用 ParameterDirection.ReturnValue 参数获得由函数返回的结果。以下代码显示了使用方法: 

以下为引用的内容:

      // create the connection

  OracleConnection conn = new OracleConnection("Data Source=oracledb;

  User Id=UserID;Password=Password;");

  // create the command for the function

  OracleCommand cmd = new OracleCommand();

  cmd.Connection = conn;

  cmd.CommandText = "GET_EMPLOYEE_EMAIL";

  cmd.CommandType = CommandType.StoredProcedure;

  // add the parameters, including the return parameter to retrieve

  // the return value

  cmd.Parameters.Add("p_employee_id", OracleType.Number).Value = 101;

  cmd.Parameters.Add("p_email", OracleType.VarChar, 25).Direction =

  ParameterDirection.ReturnValue;

  // execute the function

  conn.Open();

  cmd.ExecuteNonQuery();

  conn.Close();

  // output the result

  Console.WriteLine("Email address is: " + cmd.Parameters["p_email"].Value);


控制台输出显示了员工 101 的电子邮件地址。

Email address is: NKOCHHAR

结果集与 REF CURSOR

可使用 REF CURSOR 数据类型来处理 Oracle 结果集。REF CURSOR 是一个指向 PL/SQL 查询所返回的结果集的指针。与普通的游标不同,REF CURSOR 是一个变量,它是对游标的引用,可以在执行时将其设置为指向不同的结果集。使用 REF CURSOR 输出参数可以将 Oracle 结构化程序的结果集传递回调用应用程序。通过在调用应用程序中定义 OracleType.Cursor 数据类型的输出参数,可以访问 REF CURSOR 所指向的结果集。在使用 REF CURSOR 的过程中,OracleConnection 必须保持打开状态。

PL/SQL 和 T-SQL 中的存储过程之间的一个重大差异是 PL/SQL 所使用的 Oracle 包 结构。在 T-SQL 中没有等效元素。包是在逻辑上相关的编程块(如存储过程和函数)的容器。它包含两个部分:

· 规范:定义包的名称,并为包中的每个存储过程或函数提供方法签名(原型)。规范头还定义所有全局声明。规范的样式类似于 C 或 C++头文件。

· 正文:包含包头中定义的存储过程和函数的代码。

每个存储过程或函数的参数都出现在括号内,并且用逗号分隔。每个参数还根据需要用以下三个标识符中的一个进行标记: