您当前位置: 圣才学习网首页 >> IT类 >> Oracle专题

.NET访问Oracle的几点思考

扫码手机阅读
用圣才电子书APP或微信扫一扫,在手机上阅读本文,也可分享给你的朋友。
评论(0
   
来源:网络 作者:未知
 
  长期以来,我一直用的是 MS SQL Server / Access 数据库,通过 .NET 访问 MS 自家的东西几乎没碰到过什么麻烦。最近项目中要用 Oracle 作为数据库,学习研究了一些 .NET 访问 Oracle 的东西,发现问题倒真的不少。
 
  1System.Data.OracleClient System.Data.OleDb 命名空间
 
  虽然通过这两个命名空间的类都可以访问 Oracle 数据库,但和 SQL Server 类似的(System.Data.SqlClient 命名空间的类效率要比 System.Data.OleDb 命名空间中的类高一些),System.Data.OracleClient 命名空间中的类要比 System.Data.OleDb 命名空间的类效率高一些(这一点我没有亲自验证,但大多数地方都会这么说,而且既然专门为 Oracle 作的东西理论上也应该专门作过针对性的优化)。
 
  当然还有另一点就是从针对性上说,System.Data.OracleClient 要更好一些:
 
  比如数据类型,System.Data.OleDb.OleDbType 枚举中所列的就没有System.Data.OracleClient.OracleType 枚举中的那些有针对性;另外,Oracle Number 类型如果数字巨大,超出 .NET 数据类型范围的情况中,就必须使用 System.Data.OracleClient 中的专门类 -- OracleNumber 类型。
 
  好了,不再赘述这两个的比较,下面主要讨论 System.Data.OracleClient 命名空间中的类型,即 ADO.NET for Oracle Data Provider (数据提供程序)。
 
  2。数据库连接:
 
  无论是 System.Data.OleDb 还是 System.Data.OracleClient 访问 Oracle 都需要在 .NET 运行的机器(ASP.NET 中就是 Web 服务器)安装 Oracle 客户端组件。(这一点是和 MS 的两种数据库不同的,MS 的东西安装 MDAC: Microsoft Data Access Component 2.6 以上版本后,就无须再安装 SQL Server 客户端或者 Office 软件,就能访问。)
 
  System Requirements:
 
  (1)如用 System.Data.OracleClient 访问 Oracle,客户端组件版本应在 Oracle 8i Client Release 3 8.1.7)以上版本。MS 只确保访问 Oracle 8.1.6Oracle 8.1.7Oracle 9i 服务器时的情况。MDAC 2.6 以上。
 
  (2)如用 System.Data.OleDb 访问 Oracle,客户端组件版本 7.3.3.4.0 以上或 8.1.7.4.1 以上。MDAC 2.6 以上。
 
  如服务器为 Oracle8i 以上,客户端组件版本应为 8.0.4.1.1c
 
  在 .NET 运行的机器中,安装 Oracle 客户端,然后打开 Net Manager Oracle 9i / Easy Config Oracle 8i按你以前的经验设置本地服务的映射(这里的服务名将用于数据库连接串)。
 
  System.Data.OracleClient 中访问 Oracle 数据库的连接串是:
 
  User ID=用户名; Password=密码; Data Source=服务名
 
  (上述为一般的连接串,详细的连接串项目可以在 System.Data.OracleClient.OracleConnection.ConnectionString 属性的文档中找到。)
 
  System.Data.OleDb 中的访问 Oracle 数据库的连接串是:
 
  ProviderMSDAORA.1 User ID=用户名; Password=密码; Data Source=服务名
 
  3Oracle 中的数据类型:
 
  Oracle 的数据类型和 SQL Server 相比,要奇怪一些:SQL Server 的大多数据类型很容易找到 .NET 中比较接近的类型,Oracle 中的类型就离 .NET 类型远了许多,毕竟 Oracle 是和 Java 亲近的数据库。
 
  number: 数字类型,一般是 NumberMN),M是有效数字,N是小数点后的位数(默认0),这个是按十进制说的。
 
  nvarchar2: 可变长字符型(Unicode),这个比较像 SQL Server nvarchar(但不知 Oracle 为什么加了个“2”)。(去掉“n”为非 Unicode 的,下同。)
 
  nchar: 定长字符型(Unicode)。
 
  nclob: “写作文的字段,存储大量字符(Unicode)时用。
 
  date: 日期类型,比较接近 SQL Server datetime
 
  Oracle 中字段不能是 bit 或者 bool 之类的类型,一般是 number1代替的。
 
  和 SQL Server 一样在 SQL 命令中,字符类型需要用单引号()隔开,两个单引号(’’)是单引号的字符转义(比如: I’m fat. 写入一个 SQL 命令是: UPDATE ... SET ...’I’’m fat.’ ...)。
 
  比较特殊的是日期类型:比如要写入 2004-7-20 15:20:07 这个时刻需要如下写:
 
  UPDATE ... SET ... TIMESTAMP ’2004-7-20 15:20:07’ ...
 
  注意这里使用了 TIMESTAMP 关键字,并使用单引号隔开;另外请注意日期格式,上面的格式是可识别的,Oracle 识别的格式没有 SQL Server 那般多。这是和 SQL Server 不同的地方。
 
  顺便提一句:Access 中的日期类型是用井号(#)隔开的,UPDATE ... SET ... #2004-7-20 15:20:07# ...
 
  4。访问 Oracle 过程/函数(1
 
  SQL Server 作程序时经常使用存储过程,Oracle 里也可以使用过程,还可以使用函数。Oracle 的过程似乎是不能有返回值的,有返回值的就是函数了(这点有些像 BASIC,函数/过程区分的很细致。SQL Server 存储过程是可以有返回值的)。
 
  .NET 访问 Oracle 过程/函数的方法很类似于 SQL Server,例如:
 
  OracleParameter[] parameters {
 
  new OracleParameter"ReturnValue" OracleType.Int32 0 ParameterDirection.ReturnValue true 0 0 ""
 
  DataRowVersion.Default Convert.DBNull
 
  new OracleParameter"参数1" OracleType.NVarChar 10),
 
  new OracleParameter"参数2", OracleType.DateTime),
 
  new OracleParameter"参数3", OracleType.Number 1
 
  }
 
  parameters[1].Value "test"
 
  parameters[2].Value DateTime.Now
 
  parameters[3].Value 1;            // 也可以是 new OracleNumber1);
 
  OracleConnection connection new OracleConnection ConnectionString );
 
  OracleCommand command new OracleCommand"函数/程名" connection);
 
  command.CommandType CommandType.StoredProcedure
 
  foreachOracleParameter parameter in parameters
 
  command.Parameters.Add parameter );
 
  connection.Open();
 
  command.ExecuteNonQuery();
 
  int returnValue parameters[0].Value //接收函数返回值
 
  connection.Close();
 
  Parameter DbType 设定请参见 System.Data.OracleClient.OracleType 枚举的文档,比如:Oracle 数据库中 Number 类型的参数的值可以用 .NET decimal System.Data.OracleClient.OracleNumber 类型指定; Integer 类型的参数的值可以用 .NET int OracleNumber 类型指定。等等。
 
  上面例子中已经看到函数返回值是用名为“ReturnValue”的参数指定的,该参数为 ParameterDirection.ReturnValue 的参数。
 
  5。访问 Oracle 过程/函数2
 
  不返回记录集(没有 SELECT 输出)的过程/函数,调用起来和 SQL Server 较为类似。但如果想通过过程/函数返回记录集,在 Oracle 中就比较麻烦一些了。
 
  在 SQL Server 中,如下的存储过程:
 
  CREATE PROCEDURE GetCategoryBooks
 
  @CategoryID int
 
  )
 
  AS
 
  SELECT * FROM Books
 
  WHERE CategoryID @CategoryID
 
  GO
 
  在 Oracle 中,请按以下步骤操作:
 
  (1)创建一个包,含有一个游标类型:(一个数据库中只需作一次)
 
  CREATE OR REPLACE PACKAGE Test
 
  AS
 
  TYPE Test_CURSOR IS REF CURSOR
 
  END Test
 
  (2)过程:
 
  CREATE OR REPLACE PROCEDURE GetCategoryBooks
 
  p_CURSOR out Test.Test_CURSOR,  -- 这里是上面包中的类型,输出参数
 
  p_CatogoryID INTEGER
 
  )
 
  AS
 
  BEGIN
 
  OPEN p_CURSOR FOR
 
  SELECT * FROM Books
 
  WHERE CategoryIDp_CatogoryID
 
  END GetCategoryBooks
 
  (3.NET 程序中:
 
  OracleParameters parameters {
 
  new OracleParameter"p_CURSOR" OracleType.CURSOR 2000 ParameterDirection.Output true 0 0 ""
 
  DataRowVersion.Default Convert.DBNull),
 
  new OracleParameter"p_CatogoryID" OracleType.Int32
 
  }
 
  parameters[1].Value 22
 
  OracleConnection connection new OracleConnection ConnectionString );
 
  OracleCommand command new OracleCommand"GetCategoryBooks" connection);
 
  command.CommandType CommandType.StoredProcedure
 
  foreachOracleParameter parameter in parameters
 
  command.Parameters.Add parameter );
 
  connection.Open();
 
  OracleDataReader dr command.ExecuteReader();
 
  whiledr.Read())
 
  {
 
  // 你的具体操作。这个就不需要我教吧?
 
  }
 
  connection.Close();
 
另外有一点需要指出的是,如果使用 DataReader 取得了一个记录集,那么在 DataReader 关闭之前,程序无法访问输出参数和返回值的数据。
 

小编工资已与此挂钩!一一分钱!求打赏↓ ↓ ↓

如果你喜欢本文章,请赐赏:

已赐赏的人
最新评论(共0条)评论一句