数据库访问

原创 2006年06月01日 14:29:00
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 数据库的连接串是:
Provider=MSDAORA.1; User ID=用户名; Password=密码; Data Source=服务名
3Oracle 中的数据类型:
Oracle 的数据类型和 SQL Server 相比,要奇怪一些:SQL Server 的大多数据类型很容易找到 .NET 中比较接近的类型,Oracle 中的类型就离 .NET 类型远了许多,毕竟 Oracle 是和 Java 亲近的数据库。
number: 数字类型,一般是 Number(M,N)M是有效数字,N是小数点后的位数(默认0),这个是按十进制说的。
nvarchar2:
可变长字符型(Unicode),这个比较像 SQL Server nvarchar(但不知 Oracle 为什么加了个“2”)。(去掉“n”为非 Unicode 的,下同。)
nchar:
定长字符型(Unicode)
nclob: “
写作文的字段,存储大量字符(Unicode)时用。
date:
日期类型,比较接近 SQL Server datetime
Oracle
中字段不能是 bit 或者 bool 之类的类型,一般是 number(1) 代替的。
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 OracleNumber(1);
OracleConnection connection = new OracleConnection( ConnectionString );
OracleCommand command = new OracleCommand("
函数/程名", connection);
command.CommandType = CommandType.StoredProcedure;
foreach(OracleParameter 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 CategoryID=p_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;
foreach(OracleParameter parameter in parameters)
     command.Parameters.Add( parameter );
connection.Open();
OracleDataReader dr = command.ExecuteReader();
while(dr.Read())
{
    //
你的具体操作。这个就不需要我教吧?
}
connection.Close();
另外有一点需要指出的是,如果使用 DataReader 取得了一个记录集,那么在 DataReader 关闭之前,程序无法访问输出参数和返回值的数据。
 

还是用csdn吧

全校没课的周二下午,喝了咖啡没睡觉,十分无聊,也没什么地方好闲逛的。 想来可以有时间试试建设自己的网站了,是前段时间在godaddy注册的drakeet.me的域名,由于没有虚拟主机,所以至今都一直是...
  • drakeet
  • drakeet
  • 2013年10月22日 15:48
  • 665

关于我们CSDN

(一)        回想我们刚踏进北院的时候,好多社团都在招收新生。有些同学胡乱的报了几个社团进去玩玩,有些同学则是根据自己的兴趣爱好进行了选择。或许是喜欢,或许是好奇,冥冥之中我们共同聚集到了C...
  • u010600881
  • u010600881
  • 2013年07月28日 19:16
  • 394

CSDN工具-CSDN信息查看

CSDN信息查看,一款可以查看博客信息的小Tools。 打开博客,我们可以看到下面的信息: 打开源码,我们可以找到下面的信息: 图中黄色信息就是我们需要提取的信息...
  • mayuko2012
  • mayuko2012
  • 2015年03月01日 15:28
  • 836

CSDN工具-CSDN博客登陆

不知道这篇博文能不能发表出去,用第三方的软件登陆CSDN会不会被和谐。 好吧,这是一款本地端登陆CSDN博客的小软件。 软件有两个窗体,一个是登陆窗体,一个是浏览器窗体,使用了webbrowser...
  • mayuko2012
  • mayuko2012
  • 2015年03月01日 15:54
  • 594

我的CSDN博客

作为一名C++初学者加自学者,感觉到了学习上的艰辛,但是既然决定了要学,那么就不要放弃!自学也是一种学,花了时间,努力了,就会有收获的。开一个博客,记录自己的学习历程,把自己做过的东西,感悟的东西写下...
  • u011894560
  • u011894560
  • 2013年09月11日 15:32
  • 704

再见了,CSDN!

这个博客从大二的时候开始更新,陆陆续续也写了4年多了,毫不夸张的说,这四年来的很多东西,我都写在了这些博客里面,本来自己记录的这些东西,只是给自己留一个笔记而已,犯过那些错,走过了哪些弯路,当初狼狈的...
  • lishuhuakai
  • lishuhuakai
  • 2016年04月08日 21:31
  • 872

火影忍者CSDN

火影对于每个火迷来说不仅仅只是一部动漫,而是陪伴,是寄托,是牵挂,本篇为系列篇-各国各影系列,分别揭秘火,风,雷,土,水五大国历代影。让人没想到的是,历代影最多的竟然是火之国,足足有七代!而最少的土之...
  • DJY1992
  • DJY1992
  • 2017年03月25日 19:03
  • 2045

csdn如何转载

1、找到要转载的文章,用浏览器打开,右键选择审查元素 2、在chrome中下方的框里找到这一行,html脚本中找到对应的节点,选中节点,网页上被选中内容会被高亮显示,然后右键菜单选中 Copy  ...
  • Code_star_one
  • Code_star_one
  • 2017年07月13日 11:15
  • 153

我的csdn之旅

(背景:本人进入开发领域10个月,直接学的android,java随着android的学习而同步进行的,技术比较菜,各位看官勿喷) 以前看到各位大牛的博客,一直很羡慕,也很想参与,可终究是各种理由!...
  • tlc0211
  • tlc0211
  • 2013年03月01日 22:08
  • 299

我的第一篇CSDN

我的第一篇CSDN从08年进入大学,到2012毕业找工作,再到现如今已经工作了3年。不管是大学学习阶段,还是毕业后工作阶段,遇到的难题,往往先求助于互联网,而它(互联网)也常常给了我解决方法或者思路。...
  • axwzj
  • axwzj
  • 2015年05月24日 12:16
  • 103
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库访问
举报原因:
原因补充:

(最多只允许输入30个字)