使用 ODP.NET 访问 Oracle

基于odp.net的oraclehelper 可以使用存储过程返回数据集 http://download.csdn.net/source/2247281 对于asp.net访问oracle数据库,微软已经再支持data.oraclecliet,意见使用odp.net来访问oracle了哦。比data.oraclecliet访问数据库效率更高的odp.net,使用微软的oraclehelper改写得到 ------------- 非常感谢 xifenfei 提供的文件,但在使用不法使用存储过程返回数据集,特做了修改 立即下载

使用 ODP.NET 访问 Oracle

作者: Robert P. Lipschutz 和 Gregg D. Harrington

现在 .NET 开发人员可利用 Oracle 的本地数据访问来改进应用程序的性能。

要想从 Oracle 所支持的企业应用程序获得预期的响应性能和高级数据库特性,应该选择 Oracle 专用的连接而不是一般的数据库连接。Java 开发人员长期以来一直可以选择使用 Oracle 提供的专用 API 连接到 Oracle 数据库,这些 API 扩展了 JDBC 并为开发人员利用如大型对象 (LOB) 和 Ref Cursor 这样的 Oracle 高级特性提供了一条途径。

2002 年 2 月,Microsoft 推出了 Visual Studio .NET 及其三种语言(C# .NET、Visual Basic .NET 和 C++ .NET)以及底层的 .NET 框架。Microsoft .NET 为建立企业级的桌面、Web 和 client/server 应用程序提供了一个面向对象的开发平台。不幸的是,使用这些 Microsoft 语言和 .NET 框架的开发人员并没有一个现成的、专用于 Oracle 的数据库连接选项。

针对这一问题,Oracle 为 .NET (ODP.NET) 专门编写了 Oracle Data Provider,一个用于 Microsoft .NET 环境下的 Oracle 数据库访问 API。在本文中,我们将讨论 ODP.NET 的用法、特性和对性能的改善。我们发现使用 ODP.NET 确实具有一些显著的优势。

ODP.NET 的基本知识

我们在 Microsoft Visual Studio .NET 中使用专用于 Oracle 数据库连接的 ODP.NET,建立了一个简单的 C# 应用程序(名为 dejavu);完整的源代码位于 列表 1 和列表 2 中。这一应用程序及其附带的数据库将作为本文所有示例的一个基础。

数据库中的每条记录都包括一个员工的相关信息。这一应用程序使用带有四个字段的基本表,表 1 对此进行了概述。

您会发现使用 ODP.NET 进行连接或使用基本的 INSERT 和 SELECT 语句相对要容易些;这些任务与 JDBC 或 OLE DB .NET 同类产品非常相似。在编写 dejavu 的时侯,我们首先执行了一些基本步骤以便可以使用 ODP.NET:

 

  1. 安装 ODP.NET 软件。
  2. 在 Visual Studio 的 Solution Explorer 中,添加一个对 Oracle.DataAccess DLL 的引用。
  3. 在 C# 类中,通过在源代码文件的最上面使用子句(using Oracle.DataAccess.Client; 和 using Oracle.DataAccess.Types; )添加了两个命名空间(如果您正在使用 Visual Basic .NET 或其他与 .NET 兼容的语言,则添加命名空间的语法可能会略有不同)。

 

一旦可以使用 ODP.NET,就可以执行下面的步骤来完成一个基本的插入操作:

 

  1. 创建和打开一个数据库连接。
  2. 创建一个命令。
  3. 执行命令。

 

首先,创建和打开一个数据库连接:

 

OracleConnection dbConn = new OracleConnection(
	"Data Source=" + txtDataSource.Text + ";" + 
	"User Id=" + txtUsername.Text + ";" + 
	"Password=" + txtPassword.Text + ";");
dbConn.Open();

 

然后使用 OracleConnection object 建立对数据库的一个连接。每当创建该对象的一个实例,就要提供一个连接字符串。OracleConnection 对象使用此字符串定位到相应的 Oracle 数据库服务器,并进行认证。

在这个例子中,连接字符串有三个连接参数:Data Source、User Id 和 Password。由于 Oracle Data Provider 使用了 Oracle 调用接口 (OCI),因此 Data Source 将是 Oracle 客户端软件所用 tnsnames.ora 文件中的一个有效 TNS 名。User Id 是指定的 Data Source 的有效用户名。最后,Password 是与所提供的 User Id 相匹配的密码值。

然后,打开连接,方法是对 OracleConnection 对象调用 Open() 方法, 并创建一个 OracleCommand 对象(该对象与已创建的 OracleConnection 对象相关联):

 

OracleCommand cmd = new OracleCommand(
	"insert into dejavu_employee values " + 
	"(1, 'Gregg D. Harrington', empty_blob())", dbConn);

 

在创建 OracleCommand 对象的时侯,需要提供带有两个参数的构造符。第一个是希望执行的 SQL 命令;这可以是用字符串所写的任意有效的 SQL 语句。在这个例子中,准备在 DEJAVU_EMPLOYEE 表中插入一个员工。第二个参数是连接到数据库的 OracleConnection 对象。

最后,执行 OracleCommand 对象:

 

int rows = cmd.ExecuteNonQuery();
ShowInfo(rows + " where added to the 
database");

 

在这个例子中,要在数据库中插入一行数据,因此我们将使用 ExecuteNonQuery() 方法。在不需要查询返回任何行时(比如 SQL 的 INSERT、UPDATE 或 DELETE 语句)就可以使用这个方法(使用 ExecuteReader() 用于 SELECT 语句)。ExecuteNonQuery() 方法接收所构造的 SQL 语句,将其送到数据库执行,并返回操作涉及到的行数。

现在,让我们来读取刚刚插入到数据库中的记录并向用户显示相应的列名。将使用现有的连接和命令目标,而不是建立新的数据库连接。

要更改 SQL 语句,可根据想要执行的新的 SQL 语句更改 OracleCommand 对象的 CommandText 属性:

 

cmd.CommandText = "select * from dejavu_employee where " + 
"id = 1";

 

如果想要使用单一的数据库连接在单一的 OracleCommand 对象中执行多个 SQL 语句,这一技术就特别有用。

下面,执行该命令并读取结果:

 

OracleDataReader reader = cmd.ExecuteReader();
reader.Read();
ShowInfo("The selected user's name was " + 
	reader["name"].ToString());
dbConn.Close();

 

我们在此看到一个新对象,OracleDataReader。该对象用于读取一条或多条记录。在给出的示例中,由于我们是在主关键字列中查找一个特定值,因此只返回一条记录。 ExecuteReader() 返回一个包含生成的一条或多条记录的 OracleDataReader 对象。

一旦有了 OracleDataReader 对象,就可以获得想要的数据了 — 在这个例子中,就是姓名这一列。在开始创建 OracleDataReader 的时侯,该对象不是放置在第一条记录的位置,因此有必要在读取第一条记录之前,调用 Read() 方法。 如果之后还有相应的记录,则 Read()方法会移动到下一条记录并返回一个为真的布尔值。

下面,我们要使用 OracleDataReader 对象缺省的字符串数组属性检索姓名列的值,传递所要列的名称 — 在这个例子中,就是姓名。最后,我们另外通过对 OracleConnection 对象调用 Close() 方法关闭这个连接。

比较基本的 ODP.NET 类和与之相当的类

用于 ODP.NET 中的基本类与用于其他连接选项中的基本类非常相似。虽然方法名称和执行有时也会不太一样,但基本的逻辑都是一样的。表 2 列出了一些典型的数据库操作,以及 ODP.NET、OLE DB .NET 和 Oracle 瘦 JDBC 驱动器处理这些操作时用到的对象。

ODP.NET 高级特性

至此我们已经了解了一些基本知识,下面让我们来仔细了解使得 ODP.NET 如此强大的一些特性:对 LOB 和 Ref Cursors 的处理。

Oracle LOB、BLOB 和 Bfile。 Oracle LOB 用于存储各种大型的字符或二进制数据,包括图片和文本文档。ODP.NET 提供本地方法检索和管理 LOB,这样就改进了处理 LOB 的代码性能,并使得编写这一代码的过程对于开发人员来说变得更为简单。

ODP.NET 包含了 OracleBlob 和 OracleClob 对象。这些对象扩展了 System.IO.Stream 对象的功能。这些数据类型使得开发人员用较少的性能开销,便可实现 LOB 到数据库的简单读写。

为了展示 ODP.NET 处理 BLOB (二进制大对象)和 CLOB (字符型大对象)的能力,我们将逐步演示一个简单的示例。在这个例子中,我们将打开一个照片文件并将其写入到数据库中。对于这一过程的前两步(创建和打开一个数据库连接,并创建一个命令)使用上面例子所示的相同方式来完成。

下面,我们必须创建一个事务:

 

OracleTransaction trans = dbConn.BeginTransaction();

 

在更新某个 BLOB 的时侯,需要执行完一个事务中的所有操作以便维护数据的完整性(如果正要准备检索一个 BLOB 数据库对象,则不需要创建一个事务)。要创建一个本地事务,调用 OracleConnection 对象的 BeginTransaction() 方法。这样就返回了一个 OracleTransaction 对象,我们将该对象指定给一个变量以备以后使用。

现在,我们打开该记录并获得 OracleBlob 对象:

 

cmd.CommandText = "select * from dejavu_employee where " + 
	"id = 1 for update";

OracleDataReader reader = cmd.ExecuteReader();
reader.Read();
OracleBlob lob = reader.GetOracleBlob(2); // ordinal position of blob

 

我们检索 OracleBlob 对象,并将其注入照片文件中。首先,我们选择想要的记录 — 在这个例子中,就是 ID 号为 1 的员工记录。由于我们将更新这个 BLOB,所以数据库的行必须是锁定的。我们通过在 SELECT 语句中使用更新子句来执行这一操作。

下面,我们打开一个 OracleDataReader 并调用 Read() 方法移动到第一条记录。最后,我们从 OracleDataReader 中获得 OracleBlob 对象。这一操作使用 OracleDataReader.GetOracleLob() 方法来完成。

现在,我们就可以将照片放到服务器上了,如列表 3 所示。应用程序会提示用户输入想要上载到数据库中的文件名。对于这个任务,我们在 Visual Studio 表单设计器中创建的一个 OpenFileDialog 对象 (在我们的例子中就是 ofdPicture)。下面,我们用 System.IO.FileStream 对象打开文件,然后继续从 FileStream 对象中将数据复制到 OracleBlob 对象。后者使用一个 WHILE 循环通过 Read() 和 Write()方法来实现。

使用 OracleClob 对象和使用 OracleBlob 对象是非常相似的。在读取 CLOB 数据库对象时,可以使用 OracleClob 对象从数据库读取字符型数据。OracleClob 对象覆盖 Read() 方法,并向开发人员提供使用 CLOB 置入一个字符数组或字符串的方法。

ODP.NET 还提供一个和 OracleBlob 类似的对象,用于从 Oracle 数据库中读取 BFile 数据库。Bfile 是存储在数据库之外文件系统中的 LOB,对于存储特别大的文件非常有用。

Ref Cursor 和存储过程。可以通过存储过程打开 Ref Cursor,并通过一个输出参数将其传送到应用程序。

要更好地理解 Ref Cursor 在 ODP.NET 中的用法,可以迅速浏览列表 4 中的 PL/SQL 代码。这段代码根据输入参数 n_empid 和 n_empid2,从DEJAVU_EMPLOYEE 表中检索到两条记录。然后通过输出参数 io_cursor 和 io_cursor2 返回 Ref Cursor。

开发人员会发现使用 ODP.NET 编写 Ref Cursor 非常容易,因为他们可以使用游标的输出参数(如 io_cursor 和 io_cursor2),如同 OracleDataReaders 一样。要检索某个 Ref Cursor,需要首先打开一个数据库连接,如同第一个示例中所示。下面,我们要创建一个命令调用存储过程并传递必要的参数,如列表 5 所示。在这个列表中,我们使用一个已熟悉的对象(即OracleCommand)来调用存储过程并获得结果 Ref Cursor。但是,我们使用存储过程的输出参数,而不是使用 SQL 语句从数据库中获得记录。

让我们逐步演示一下列表 5 中的过程。首先,在第 1 行,我们创建一个新的 OracleCommand 对象。但是,我们是通过提供存储过程的名称来调用该存储过程,而不是使用包含 SQL 语句的一个字符串 — 在我们的例子中,就是 curspkg.open_two_cursor。

下面,在第 2 行,我们将 OracleCommand 对象指定为存储过程调用,而不是 SQL 语句调用。要指定这个命令是调用存储过程,必须正确地指定 OracleCommand 对象的 CommandType 的属性。 CommandType 属性有很多可接受的值,可以通过 CommandType 枚举对象访问这些值。在这个例子中,我们使用 CommandType.StoredProcedure。

第 3 行和第 4 行创建了两个必需的参数变量以便访问返回的 Ref Cursor。我们将使用这些变量从数据库的存储过程获得对 Ref Cursor 结果的引用。

第 5 行到第 8 行向 OracleCommand 对象添加四个必需的参数。我们为 cmd.Parameters.Add() 方法同一行中的两个 n_empid 参数创建 OracleParameter 对象。

OracleParameter 构造符接收两个参数。第一个是 PL/SQL存储过程参数名;这就意味着可以灵活地添加参数,而不是按照声明存储过程参数的顺序添加。第二个参数是 PL/SQL 存储过程参数(即 Value 属性)应该被解释成的数据类型; Value 参数的可接受类型位于 OracleDbType 枚举对象中。这两个构造符参数同时告诉 OracleParameter 和 OracleCommand 对象如何调用存储过程,以及如何解释从该存储过程返回的值。

接下来的步骤

下载 ODP.NET
/global/cn/tech/windows/odpnet

ODP.NET 示例代码
/global/cn/sample_code/tech/windows/odpnet

参加 ODP.NET iSeminar
oracle.com/iseminars
使用 Oracle Data Provider for .NET

在我们的示例中,我们向 OracleCommand 对象添加了四个 OracleParameter 对象。其中的两个是 n_empid 和 n_empid2 输入参数,这两个参数是 OracleDbType.Int64 类型,用于 open_two_cursor 存储过程。我们还需要使用 OracleParameter 对象的 Value 属性,将参数的值分别设为 1 和 2。

第三个和第四个参数是 open_two_cursor 存储过程的输出参数。在这个例子中,就是 io_cursor 和 io_cursor2。对于 io_cursor 参数,我们并不向存储过程传递某个值,而是希望存储过程能返回一个 Ref Cursor。要处理这一步,我们添加一个 OracleParameter 对象作为OracleDbType.RefCursor 类型。要让 OracleCommand 对象知道这是一个输出参数,需要将 OracleParameter 对象的 Direction 属性设置为 ParameterDirection.Output。

下面,执行存储过程并检索结果,如列表 6 所示。在该列表的第 1 行,我们对 OracleCommand 对象调用 ExecuteNonQuery() 方法。该方法调用存储过程并将结果读回到正确的 OracleParameter 对象。

在第 2 行和第 3 行,我们将返回值抛入到 OracleRefCursor 对象。在 ODP.NET 执行回传某个值的存储过程时,会将那些值存储在与之相关联的 OracleParameter 对象的 Value 属性中。

从第 4 行到第 9 行,我们创建 OracleDataReader 对象,将它们设置为 Ref Cursor 结果,调用 Read() 方法移动到第一个记录,并从 OracleDataReader 对象中检索姓名列。

OracleDataReader 对象还包含了一个名为 NextResult() 的方法,该方法可以与方法 ExecuteReader() 联合使用,顺序地迭代来自存储过程的所有 Ref Cursor 结果。利用 NextResult() 方法,我们仅需要使用一个 OracleDataReader 对象来访问所有的 Ref Cursor。然而,这样做会限制我们顺序地访问 Ref Cursor。访问多个 Ref Cursor 结果所使用的方法将取决于应用程序的需要。

结论

Oracle Data Provider for .NET提供一个易于使用的、强大的 API,并且与 OLE DB .NET 相比,性能得到巨大的改善。如果希望在 .NET 框架中开发应用程序访问新的和现有的 Oracle 数据库,那么熟悉这一技术会使您的工作更轻松。

Robert P. Lipschutz (rob@thing7.com) 是 Thing 7 的总裁,该公司擅长编写技术白皮书和设计原型,而 Gregg D. Harrington (gregg@thing7.com) 是 Thing 7 的高级设计师。

Table 1:DEJAVU_EMPLOYEE table

 

字段类型目的
IDNUMBER(10)保留员工的 ID(这是该数据库的主关键字)
NAMEVARCHAR2(32)保留员工的姓名
PHOTOBLOB保留员工的照片
BIGNUMBERNUMBER(38,37)保留一个高精度数字

Table 2:比较几种常用 Oracle 连接的
基本选项命令

 

操作ODP.NETOLE DB .NETORACLE 瘦 JDBC 驱动器
连接到OracleConnectionOleDbConnectionOracleConnection database
创建 SQLOracleCommandOleDbCommand OracleStatement commands
读取数据OracleDataReaderOleDbDataReaderOracleResultSet

Microsoft's .NET Framework Data Provider for Oracle

Microsoft 也发布了一个 Oracle 专用的数据库驱动器,名为 .NET Framework Data Provider for Oracle。由于针对 .NET 的 Oracle 数据库的连接极其重要,因此 Oracle 和 Microsoft 都来处理这一问题就不足为奇了。正如 Oracle 的 ODP.NET 一样,Microsoft 的产品比 OLE DB .NET提供更多 Oracle 专用的功能和更好的性能。然而,Microsoft 的提供程序总得来说还是不如 ODP.NET 的功能多。

例如,ODP.NET API 可以支持事务保存点、本地 Ref Cursor 数据类型、代理服务器用户认证和全球化特性。Microsoft 的解决方案提供了一个 OracleLob 对象,该对象以相同的方式控制所有的 Oracle LOB 数据库。然而,ODP.NET 对 Oracle BLOB 和 CLOB 数据库对象都提供特定的对象。这就意味着 ODP.NET 对这些 Oracle 数据类型提供更好的支持。例如,OracleClob 对象可覆盖 read 方法置入一组字符数组。这一特性在处理 Unicode 和其他多字节字符时特别有用。

Microsoft 的解决方案和 ODP.NET 都比 OLE DB .NET 提供更好的数据库访问性能,最显著的是写操作和 LOB 操作。Microsoft 计划将其新版本的 .NET Framework Data Provider for Oracle 包含在 Visual Studio .NET 的下一个发布版中。

探索Vortex开源GPGPU:RISC-V SIMT架构(4-1),Execute SFU(1) 本文详细分析了Vortex RISC-V内核6级流水线中Execute阶段的SFU(特殊功能单元)模块。重点介绍了SFU的数据流结构,包含dispatch_unit、pe_switch、csr_unit、wctl_unit和gather_unit五个子模块。文章深入解析了warp控制指令wspawn和tmc的实现机制:wspawn用于激活指定数量的warp并设置新PC值,tmc则用于控制线程掩码和warp状态。通过C代码和汇编指令的对照分析,阐明了这些指令在并行计算中的关键作用,包括线程激活、状态切换和执行 阅读详情

相关推荐

Qt C++实现HTTP/HTTPS服务器与客户端:从Socket到协议解析全流程

HTTP协议作为Web通信的基础,定义了客户端与服务器之间基于文本的请求-响应模型。其工作原理是通过TCP连接传输结构化的报文,实现资源获取与数据交换。在C++开发中,掌握HTTP协议底层实现具有重要技术价值,能够帮助开发者构建高性能、可深度定制的网络应用,尤其适用于嵌入式设备管理、桌面应用后端等场景。本文聚焦于使用Qt框架的QTcpSocket和QSslSocket组件,从Socket层面手动实现完整的HTTP/HTTPS通信栈,涵盖协议解析、流式处理、路由分发等核心环节,并深入探讨了HTTPS证书验证、

weixin_31292729的博客 330

(原) ODP.NET 演示通过存储过程的参数获取OracleClob数据

usingSystem; usingSystem.Data; usingSystem.Text; usingOracle.DataAccess.Client; usingOracle.DataAccess.Types; namespaceSample33 { //演示通过存储过程的参数获取OracleClob数据 classProgram ...

weixin_30294021的博客 172

UART全功能测试指南:环路/DMA/RS485/硬件流控实战

UART(通用异步收发器)是嵌入式系统中最基础的串行通信接口,其核心原理基于起始位、数据位、校验位与停止位的异步帧结构,依赖精确的波特率时钟同步与采样重建机制。在工业与物联网场景中,UART不仅需保障基本通信可靠性,更需支持DMA卸载、RS485半双工自动方向控制、RTS/CTS硬件流控等进阶能力,以提升实时性、抗干扰性与系统资源效率。典型应用涵盖调试日志输出、传感器数据采集、Modbus RTU总线通信及固件空中升级。本指南聚焦UART外设测试实践,覆盖环路自检、DMA吞吐验证、RS485时序对齐、硬件流

weixin_42599908的博客 133

使用ODP.Net 可以实现.Net 程序以SYSDBA 身份访问数据库

Oracle ODP.NET数据库访问连接字符串 Connection String Attribute 默认值 描述 Connection Lifetime 0 Maximum life time (in seconds) of the connection 当数据库连接被返回到连接池中时,它的创建时间将与当前时间比较,如果超过了 Conn...

weixin_33895657的博客 198

从IR Drop到EM分析:数字IC电源规划中那些没人明说的细节(以MTCMOS配置为例)

本文深入探讨数字IC后端设计中电源规划的关键细节,特别关注MTCMOS配置、电源网络电阻最小化和level shifter供电等实战技巧。通过分析IR Drop和EM问题,提供优化floorplan和powerplan的具体策略,帮助工程师避免常见陷阱,提升芯片设计的稳定性和可靠性。

q9w8e7r6t5的博客 511

pytorch中的wheel文件

whl 文件是 Python 的一个软件包分发格式,用于在 Python 中安装软件包。它是 Python Wheel 的缩写,也被称为 wheel 文件。这种文件格式旨在简化 Python 软件包的安装和分发。对于 PyTorch 而言,它提供了预编译的 .whl 文件,您可以通过 pip 安装这些文件来快速方便地安装 PyTorch。这些 .whl 文件是已经编译好的二进制分发文件,可以直接安装在您的 Python 环境中,而无需再进行编译。

bj_zhb的博客 3126

ODP.NET调用存储需要使用事务

今天发生在用ODP.NET调整一个存储过程时发生了两个奇怪的错误。 ORA-08103: object no longer exists ora-01410: invalid rowid 网上都说是索引块有错误什么的,我索引也重建,表也重建了,但还是不行。 奇怪的是我直接测试存储过程是有结果的。 后来发现是存储过程中使用了临时表,而我在代码中又没有使用事务,当我加上事...

weixin_30245867的博客 313

与rkipc通信

函数名称功能系统模块初始化系统模块反初始化重启恢复出厂设置导出日志导出配置文件导入配置文件系统升级获取用户数设置用户数获取用户权限设置用户权限获取用户名设置用户名获取密码(已加密)设置密码(已加密)新增用户删除用户。

qq_44643189的博客 1612

使用 ODP.NET 访问 Oracle(.net如何访问Oracle)详解

1,什么是ODF .NE,?就是Oracle 为 .NET (ODP.NET) 专门编写了 Oracle Data Provider,一个用于 Microsoft .NET 环境下的 Oracle 数据访问 API 。 详细解说 http://www.oracle.com/technetwork/cn/testcontent/o23odp-084525-zhs.html 对于官方的代码,已不存在...

weixin_34111790的博客 435

基于STM32F407与AD9910/AD9959的高频可调DDS信号源设计与实战

本文详细介绍了基于STM32F407微控制器与AD9910/AD9959高性能DDS芯片的高频可调信号源设计与实现。文章从DDS原理入手,阐述了双芯片方案的优势,并重点分享了高频电路设计中的电源、PCB布局布线等关键硬件设计技巧与避坑指南。同时,提供了通过SPI配置DDS芯片及利用Matlab生成任意波形的软件驱动方法,旨在帮助开发者打造一个覆盖10Hz至4200MHz的实用信号发生器。

weixin_36184718的博客 121

【系统架构设计师-2023年真题】综合知识-答案及详解

要实现多任务间的协同工作,操作系统必须提供任务间的通信手段。嵌入式操作系统一般都会提供多任务间通信的方法,其中()是任务间最直接、最明显的通信方法,也是访问共享的数据结构,即不同的任务都可以访问同一地址空间。()作为一种更高级的通信方式,能够在同一处理器的各个任务间传递任意长度(理论上只受物理内存和机器字长限制)的信息。(1)A. 共享内存 B. Socket C. 消息传递 D. 信号量(2)A. 共享内存 B. Socket C. 消息传递 D. 信号量【答案】A、C关于星型拓扑结构,下列说法正确的是(

数据知道的博客 1万+

.net中使用ODP.net访问Oracle数据库(无客户端部署方法)

ODP.net是Oracle提供的数据库访问类库,其功能和效率上都有所保证,它还有一个非常方便特性:在客户端上,可以不用安装Oracle客户端,直接拷贝即可使用。 以下内容转载自:http://blog.ywxyn.com/index.php/archives/326 由于微软在.net framework4中会将System.Data.OracleClient.dll depreca

rrrrssss00的专栏 4万+

手把手教你学Simulink--基于新能源并网与协调控制的场景实例:双馈异步风力发电机并网运行仿真

随着“双碳”目标的推进,风力发电已成为新能源并网的核心组成部分。其中,双馈异步风力发电机(Doubly-Fed Induction Generator, DFIG)因其变频器容量小(仅处理转差功率)、可实现有功/无功独立调节、运行效率高等优势,广泛应用于现代兆瓦级风电机组。DFIG系统通过转子侧变流器(Rotor-Side Converter, RSC)和网侧变流器(Grid-Side Converter, GSC)实现对发电机转矩与电网无功的精确控制,支持最大功率点跟踪(MPPT)和。

MHD0815的博客 280

使用OracleClient,OLEDB,ODBC,Visual Studio,ODP.NET 来连接 Oracle访问数据库

---下面是OracleClient 下面也要介绍的是通过 System.Data.OracleClient 来完成 ASP.NET 页面访问 Oracle 数据库, 其实呢,还是比较简单的, 首先介绍一下环境吧, 我机器装的是 Oracle 10g R2 的版本, 要完成 ASP.NET 访问 Oracle 事实上,对 Oracle 还是有一些设置的, 看下面的一个截图里面的两...

weixin_30639719的博客 216

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

在开发框架中扩展微软企业库,支持使用ODP.NET(Oracle.ManagedDataAccess.dll)访问Oracle数据库

在前面随笔《在代码生成工具Database2Sharp中使用ODP.NET(Oracle.ManagedDataAccess.dll)访问Oracle数据库,实现免安装Oracle客户端,兼容32位64位Oracle驱动》中介绍了在代码生成工具中使用ODP.NET(Oracle.ManagedDataAccess.dll)访问Oracle数据库,如果我们在框架应用中需要使用这个如何处理了...

爱无止 397

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

使用OracleClient,OLEDB,ODBC,Visual Studio,ODP.NET 来连接 Oracle访问数据库

下面也要介绍的是通过 System.Data.OracleClient 来完成 ASP.NET 页面访问 Oracle 数据库, 其实呢,还是比较简单的, 首先介绍一下环境吧, 我机器装的是 Oracle 10g R2 的版本, 要完成 ASP.NET 访问 Oracle 事实上,对 Oracle 还是有一些设置的, 看下面的一个截图里面的两个文件吧

xwnxwn的专栏 1539

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

使用 ODP.NET 访问 Oracle 数据库

要相使用 Oracle Data Provider For .NET(ODP.NET), 必须先安装 ODP.NET 或者是 ODAC(Oracle Data Access Components) (ODAC 中包含 ODP.NET 这个组件) 最好是把 ODT.NET 也安装上,这样,以后在 Visual Studio 中开发 Oracle 应用程序会方便很多的, 还是提

Prostones的专栏 1030
上一篇: Oracle Data Provider for .NET
下一篇: odp使用笔记
leaf829
博客等级 码龄21年 7粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值