`
shirlly
  • 浏览: 1652208 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

net 2.0 访问Oracle --与Sql Server的差异,注意事项,常见异常

    博客分类:
  • .NET
阅读更多
在.net平台下访问数据库有以下几种方式: 
    1、OleDB数据库访问程序,
    2、ODBC数据库访问程序,
    3、专有的数据库访问程序。如:访问Sql Server 2000 时,我们一般喜欢使用专有的SQL Server .NET Framework  数据库访问程序。命名空间为: System.Data.SqlClient 。

    在这里我使用第三种,也就是“专有的数据库访问程序”(Oracle .NET Framework 数据库访问程序)访问Oracle数据库
   
     在1.1版本之前 Oracle .NET Framework需要另外下载,.net Framework本身并没有这个组件。 下载地址:

     在2.0版本的Framework中已经自带了 Oracle .NET Framework  数据库访问程序。但并不是说有了Oracle .NET Framework 就可以顺利访问Oracle了。 要访问Oracle数据库,除了专有的数据库访问程序,还必须具备以下条件:

必须安装 Oracle 8i Release 3 (8.1.7) 客户端或更高版本。

     以下分几点谈谈Oracle数据库访问的细节

      经常使用的一些组件
     
              Oracle.NET Framework 数据库访问程序命名空间为: System.Data.OracleClient.  文件名为:System.Data.OracleClient.dll , 位于全局程序集缓存中。默认情况下vs 2005没有引用该组件,需要使用时,只需要添加引用即可。
        与SqlClient 类似,OracleClient命名空间下由 OracleConnection  ,OracleCommand,OracleDataReader, OracleParameter ,OracleType等组成。以上列出的只是最常用的几个类。更详细的类视图请参考MSDN. 

       字段类型,参数类型

             字段类型一般在使用Parameter是会涉及到。 在Sql Server中我们一般使用SqlDbType 枚举表示数据库中的各种字段类型, 而在Oracle中,使用OracleType。 在Oracle中,字符型的字段经常使用Varchar2 或 Nvarchar2, 而数值型用Number。 Varchar后面多了个2, 没有深入学习Oracle,不知多加的这个“2" 的有什么意义。 在使用参数(Parameter)时.
        OracleType.Varchar    表示数据库中的  varchar2,
        OracleType.Nvarchar  表示数据库中的 Nvarchar2, 
        OracleType.Number  表示  Number
        OracleType.DateTime 表示 Date
        至于其他的如:OracleType.Int32 由于在Oracle中没有对应的字段类型,一般使用较小,如果数据库中的Number型字段的值没有小数位,也可以使用OracleType.Int32对应Number.

      数据库连接

            与SqlConnection类似, 只是连接字符串一般为:User ID=用户名;Data Source=数据库服源名称(Oracel数据库服务名称);Password=密码

         下面是我使用的连接字符串:   User ID=search_user;Data Source=etbank_192.168.0.250;Password=12345       

        存储过程的使用
      
        Oracle中的存储过程叫作包(Packages), 一个包分为 包头和包体,类似于C++中的 类声明。 包头定义了存储过程的名称和参数 ,包体除了名称和参数,还包存储过程的所有语句。与SqlServer不同,Oracle中存储过程一般写成 Function , 而不是PROCEDURE。Oracle存储过程并不直接返回记录集,记录集以游标的形式通过参数返回。一个包(Packages可以包含多个存储过程,使用存储过程时采用“包名.存储过程名”的方式,下面是一个典型的Oracle存储过程,它位于 命称为"Test"的包(Packages)中,它的使用方式应为:Test.GetList 
Function GetList(keywords In varchar2
                           ,p_info_list_Cursor out get_data_cur_type)
   Return Number 
As 

  Begin
       
       open p_info_list_Cursor For 
       Select * from Test where Key=keywords
;
       Return 0;
  End;


存储过程只返回一个Number ,记录集以 out 参数方式返回。 在.net中调用方式如下:
OracleConnection OracleConn = new OracleConnection(连接字符串);
OracleCommand cmd = new OracleCommand("Test.GetList", OracleConn);
cmd.Parameters.AddRange(
new OracleParameter[]
{
   new OracleParameter("keyWords", OracleType.VarChar),
   new OracleParameter("ReturnValue", OracleType.Number, 0, ParameterDirection.ReturnValue, true, 0, 0, "",DataRowVersion.Default, Convert.DBNull),
    new OracleParameter("p_info_list_Cursor", OracleType.Cursor, 2000, ParameterDirection.Output, true, 0, 0, "",DataRowVersion.Default, Convert.DBNull)
        });
        cmd.Parameters[0].Value = '美女';
        cmd.Parameters[0].Direction = ParameterDirection.Input;
        cmd.CommandType = CommandType.StoredProcedure;
       OracleConn.Open()
        OracleDataReader rdr=cmd.ExecuteReader();
      //其他代码
       OracleConn.Close();


OracleParameter中的 参数名一定要与存储过程中的名称一致,可以忽略大小写。存储过程定义了2个参数,一个KeyWords, 一个是out 类型的游标:p_info_list_Cursor。 因为  Function有返回值,所以我们还需要增加一个名为“ReturnValue"的参数, 这个名称是固定的。 记录集通过 p_info_list_Cursor 返回。 参数配置完成以后,直接使用cmd的众多Exec方法即可,虽然我们使用了一个Out 参数接受记录集游标,但这个参数不需要我们处理,OracleCommand 会自动处理它,我们只需要像以往使用SqlCommand一样,得到DataReader,然后读数据即可。

       直接执行SQL语句

             Sql 语句中使用":" 表示参数。
     在Sql Server 中我们可以按以下方式使用SQL 语句: "Insert into Table (Field1,field2) values(@Value1,@Value2) ", 然后我们再New 几个Paramter: new SqlParameter("@Value1",value)...
  在查询字符串中使用@+字符 来描述参数,在SqlParameter中的参数名也要使用"@"符号。
而在Oracle中Sql 语句不能使用@符号, 以冒号":"代替. 如:
string Sql = "Insert into SEARCH_HISTORY(KEYWORDS,PHONE,RESULT_ID,SEARCH_TIME) values(:KEYWORDS,:PHONE,:RESULT_ID,:SEARCH_TIME)";
        OracleCommand cmd = new OracleCommand(Sql, OracleConn);
        cmd.Parameters.AddRange(new OracleParameter[]{
            new OracleParameter("KEYWORDS",OracleType.VarChar),
            new OracleParameter("PHONE",OracleType.VarChar),
            new OracleParameter("RESULT_ID",OracleType.Number),
            new OracleParameter("SEARCH_TIME",OracleType.DateTime)
        });
        cmd.Parameters[0].Value = Keywords;
        cmd.Parameters[1].Value = Phone;
        cmd.Parameters[2].Value=2;
        cmd.Parameters[3].Value = DateTime.Now;

常见错误:

         1、“调用 '存储过程名称' 时参数个数或类型错误”
 
          出现错误的原因是因为你的 创建OracleParameter 是使用的参数名称与存储过程或Sql语句中定义的参数名称不一致。 另外,也要注意,虽然在Sql 语句中使用 冒号“:”代表参数,但在创建OracleParameter时,指定的参数名称不能使用冒号,在new OracleParameter时,ParameterName只能使用参数的字符部分。

         2、“存储过程名称' 不是过程或尚未定义”

        OracleCommand的Parameters集合中的参数个数与存储过程中定义的数量不一致,你可能漏了某个Parameter没有创建

         3、"ORA-01036: 非法的变量名/编号“

       出现此错误的原因很可能是存储过程的包体的参数定义与包头的定义不一样,很多时候修改了包体,却忘了修改包头。 另外,创建OracleParameter时,由于构造函数的版本众多,使用了某些版本时,可能会出现这个错误,建议创建OracleParameter时,一定要指定OracleType。
        直接使用Sql 语句时,在Sql 语句中的 参数部分没有使用冒号作为前缀,或者错误使用了Sql Server 的"@"符号都会导致此错误。

       总之此错误出现在Parameter指定的ParameterName,与实际参数名称不匹配时。

      要注意:在 new OracleParameter() 中,指定的ParameterName 只需要包含参数的字符部分,无需保含前缀,如:冒号。


      4、System.Data.OracleClient requires Oracle client software version 8.1.7 or greater.

      出现这个错误表示你需要安装Oracle客户端。假如你已经安装了Oracle客户端,还出现这个错误,那肯定由于权限的问题,博客园的朋友Jeet 给出了答案:http://www.cnblogs.com/jeet/archive/2005/06/24/115150.html,具体方法如下:
   
         1、以管理员的用户登录;
         2、找到ORACLE_HOME文件夹(比如C:\oracle\ora92),点右键,选属性--安全,在组或用户栏中选“Authenticated Users”,在下面权限列表中把“读取和运行”的权限去掉,再按应用;重新选上“读取和运行”权限,点击应用;选权限框下面的“高级”按钮,确认“Authenticated Users”后面的应用于是“该文件夹、子文件夹及文件”,按确定把权限的更改应用于该文件夹;
  
     我在第一次使用Oracle是,碰到这个问题,使用jeet的方案解决了,Jeet说一定要重新启动系统,但我没有重启也可以。或许是操作系统版本的问题,我的是windows 2003

      总结:
     Oracle与Sql Server的访问上有很大不同:

         1、字段类型不同
         2、存储过程有很大差异,Oracle不能直接返回记录集,需要通过一个 out 参数达到目的。在OracleType中有一个OracleType.Cursor 类型与之对应。 Oracle中的存储过程大部分都定义成Funcion,  有返回值。   在定义Command的参数集合时,需要增加一个"ReturnValue"的参数。
        3、Oracle中的参数无需"@"符号
        4、Oracle的Sql 语句中 在参数前面加冒号":", 而Sql Server 的Sql 在前面加"@"  
--Sql Server的Sql 语句
insert into Table (Column1,Column2) values (@Value1,@Value2) 


--Oracel中的Sql 语句
 Insert Into Table (Column1,Column2) values
(:Value1,:Value2)


转自:http://cwbboy.cnblogs.com/archive/2006/03/22/356017.html
分享到:
评论

相关推荐

    Oracle与SQLServer的SQL语法差异

    Oracle与SQLServer的SQL语法差异,用简单易懂的语言和实例对Oracle和Sql Server语法之间的差异进行了对比分析,更加适用于入门的人

    ojdbc14+sqljdbc4-2.0+mysql-connector-java-5.1.41

    总之,ojdbc14、sqljdbc4-2.0和mysql-connector-java-5.1.41是Java应用程序(如Kettle)与Oracle、SQL Server和MySQL数据库进行交互的基础,它们在数据集成、数据分析等场景中扮演着关键角色。在使用过程中,务必...

    ORACLE和SQL Server的语法区别

    本文主要介绍Oracle与SQL Server在SQL语言层面的异同之处,重点在于Transact-SQL(T-SQL)与PL/SQL之间的区别,并提供了一些迁移策略。对于希望将现有的Oracle数据库系统迁移至SQL Server平台的用户来说,这些知识尤...

    ORACLE与SQLSERVER语法差异分析

    在数据库管理领域,ORACLE和SQL SERVER是两个广泛使用的数据库管理系统,它们在语法上有许多相似之处,但也存在一些显著的差异。以下是对标题和描述中所述知识点的详细说明: 1. **递归查询**: - 在SQL SERVER中...

    oracle与SQL server的语法差异总结

    Oracle 和 SQL Server 是两种广泛应用的关系型数据库管理系统,它们在语法和功能上存在一定的差异。以下是对两者主要区别的一些详细说明: 1. **伪列 ROWNUM**: 在Oracle中,ROWNUM是一个伪列,用于获取结果集中...

    oracle-database-server-12cR2-preinstall

    Oracle Database Server 12cR2 Preinstall 是一个专为在x86_64架构的Linux系统上安装Oracle数据库12c Release 2 (12.2)而设计的预配置软件包。这个预安装包的主要目的是简化Oracle数据库服务器的安装流程,预先配置...

    oracle通过odbc建立dblink访问sqlserver数据库

    ### Oracle通过ODBC建立DBLink访问SQLServer数据库 在企业级应用环境中,不同数据库系统间的交互变得越来越频繁。为了实现Oracle数据库与SQLServer数据库之间的数据交换,可以通过多种方式实现连接,其中一种较为...

    Flink1.14.4自定义flink-connector-jdbc连接SQLServer和SAP数据库

    Flink1.14.4自定义flink-connector-jdbc连接SQLServer和SAP数据库

    oracle到sqlserver存储过程语法转换

    在数据库迁移项目中,从Oracle迁移到SQL Server是一种常见的场景。本文旨在提供一份详细的指南,帮助开发者更好地理解这两种数据库系统在存储过程方面的语法差异,并指导如何进行有效的转换。 #### 一、基本语法...

    oracle-rdbms-server-11gR2-preinstall-1.0-4.el7.x86_64.rpm

    oracle-rdbms-server-11gR2-preinstall-1.0-4.el7.x86_64.rpm

    通过ORACLE通用连接访问SQLServer数据库的方法

    通过Oracle通用连接访问SQL Server数据库的方法为IT领域提供了一种跨数据库系统进行数据交互的有效途径。这种方法主要依赖于Oracle数据库的异构服务功能,允许用户从Oracle环境中直接查询或操作其他类型数据库(如...

    sqlserver自动生成sql语句工具sqlserver转oracle

    1. 数据类型映射:SQL Server和Oracle的数据类型可能存在差异,如SQL Server的`datetime`对应Oracle的`timestamp`,`varchar2`对应`nvarchar2`等,工具会自动进行转换,但也可能需要手动调整。 2. 函数和过程转换:...

    SQLServer2008R2与Oracle11gR2互连

    ### SQLServer2008R2与Oracle11gR2互连 #### 1. 简介 SQLServer2008 R2与Oracle11g R2分别是Microsoft和Oracle公司推出的重量级数据库系统,在不同的应用场景下各自拥有优势。在实际的企业环境中,往往需要在两种...

    Oracle19C RAC通过gateways连接SQL server数据库

    Oracle 19C RAC(Real ...在实际操作中,确保所有配置步骤都正确无误,且遵循最佳实践,以确保Oracle 19C RAC与SQL Server之间的稳定通信。此外,定期检查和更新安全策略,如数据库用户的密码,以维护系统的安全性。

    SQL-SERVER-64位配置ORACLE连接-中文乱码问题

    - 在连接配置中确保SQL Server与Oracle数据库使用的字符集一致非常重要。 3. **ODBC/JDBC驱动**: - ODBC(Open Database Connectivity)和JDBC(Java Database Connectivity)是两种常用的数据访问接口。 - ...

    Oracle.ManagedDataAccess.dll net 2.0

    Oracle.ManagedDataAccess.dll net 2.0

    oracle10g或11g通过dblink访问sql server数据库

    ### Oracle 10g 或 11g 通过 DBLink 访问 SQL Server 数据库 #### 概述 本文档详细介绍了如何在Oracle 10g或11g环境中使用DBLink来访问SQL Server数据库的方法。这种方法对于那些习惯于使用Oracle进行数据库操作的...

    sqlserver-oracle 数据类型对照

    本文将详细比较SQL Server和Oracle数据库之间的数据类型对应以及常用函数的转换。 首先,我们来看SQL Server和Oracle的数据类型对照: 1. **数值类型**: - `bigint`在SQL Server中对应Oracle的`NUMBER(19)`,...

    Oracle数据库导入到SqlServer步骤(图文篇)

    Oracle 数据库到 SqlServer 数据迁移步骤详解 Oracle 数据库到 SqlServer 的数据迁移是一项复杂的任务,需要经过多个步骤来完成。本文将详细介绍如何将 Oracle 数据库导入到 SqlServer 中。 Step 1-6: 数据源设置...

    oracle-database-server-12cR2-preinstall-1.0-3.el7.x86_64.rpm

    oracle-database-server-12cR2-preinstall-1.0-3.el7.x86_64.rpm

Global site tag (gtag.js) - Google Analytics