.net程序员使用Oracle新手上路指南【转】

虽然oracle,sqlserver都是关系型数据库,sql语句大部分也差不多,但是从sqlserver换到oracle还是有很多不适应的地方,本文旨在帮助广大初次接触oracle的.net程序员快速上手。

一、安装oracle 11g 服务端(可选)
1.1 为什么要安装服务端?
理论上讲,本机只需要安装oracle客户端即可,但是很多时候本机有一个服务端学习起来会更方便。比如:数据库的导入/导出,数据库的创建等,均需要服务端。
注:oracle的server真的很占内存,如果您的爱姬内存在2G以下,建议直接跳过本步骤吧.
1.2 服务端的安装文件下载地址
因为我的笔记本是Win2008 R2系统,所以选择了特定的win2008 x64版本(安装文件约1.9G),下载地址如下
在win200 r2上安装时,会提示操作系统不满足安装要求,如下图:
不用理会,直接把问题项前面的复选框勾上,然后就能进入下一步继续安装了。
安装完成的最后一个界面上,在口令管理里,最好把scott帐号解除锁定(这是学习oracle的经典帐号,很多示例教程都是用这个帐号连接的,其默认密码是tiger)
1.3 如何测试服务端是否安装正确了
先打开Net Manager
展开服务命名
点击左侧“红色叉”按钮下的图标
如果提示测试成功,则表示server端运行正常了。

二、安装for .Net特定的客户端 ODAC with Oracle Developer Tools for Visual Studio
这是oracle官方推出的for .net的连接客户端,性能优于微软自带的System.Data.OracleClient下的东东,也是目前综合性能最好的.net客户端
一路Next即可,如果提示操作系统不满足要求,参考前面安装服务端时的处理

三、安装pl/sql developer
oracle安装完成后,自带了一个叫sql plus的查询工具,相当于sqlserver中的查询分析器,能用它练习sql,但是这个东东功能太弱,实在是难用。
所以推荐大家用第三方的pl/sql developer,百度一下就能找到下载地址和注册码。
这个软件第一次启动的界面如下:
但是如果输入 scott/tiger@orcl,并不能正确连接
因为我们还没有配置 tnsnames.ora文件(这个可以理解为web.config或machine.config,用于保存本机oracle client端的所有连接信息,只有正确配置以后,oracle client才能正确连接oracle db server)
进入 %oracle_home%\Network\Admin\Sample(注:%oracle_home%指oracle客户端安装后的根目录) 找到tnsnames.ora文件,把它复制到%oracle_home%\Network\Admin\下
用记事本打开,参照下面修改:
# Every line that begins with # is a comment line
#
# Create Oracle net service names, or aliases, for each database server 
# you need to connect to.
#
# TNSNames.ora sample entry
#
# alias =
#  (DESCRIPTION =
#    (ADDRESS = (PROTOCOL = TCP)(HOST = myserver.mycompany.com)(PORT = 1521))
#    (CONNECT_DATA =
#      (SERVER = DEDICATED)
#      (SERVICE_NAME = orcl)
#    )
#  )
#
# You can modify the entry below for your own database.
# <data source alias> = Name to use in the connection string Data Source
# <hostname or IP> = name or IP of the database server machine
# <port> = database server machine port to use
# <database service name> = name of the database service on the server
local =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST =  127.0.0.1)(PORT =  1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME =  orcl)
    )
  )
解释一下:local是自己定义的名称,可以随便改,只要不重复就行了,host后面的部分是服务器ip地址,port是端口号,SERVICE_NAME是oracle server安装时的实例命名,修改完成后,保存。
再次打开pl/sql,会发现database下拉框里多出了一个local,如下图:
用户名输入scott,密码输入tiger,选择local,登录,成功!

三、.net与oracle的连接
这是初学者最头痛的问题,oracle有4种方式可供.net连接
3.1 古老的 ODBC数据源连接
先打开"Microsoft ODBC管理员",如下图
会看到设置界面
在vs2010的server explorer面板中,创建一个connection
选择Change,再选择ODBC数据源
接下来的事情,大家照提示来就行了,不过我测试发现,ODBC方式在vs.net 2010/win2008 r2下,始终连接不上,
但是在控制面板的数据源里,test connection是成功的。
个中原因,也许只有微软知道,所以这种方式我是没实践成功,放弃!反正odbc这种老古董我也不喜欢。
3.2 微软自带的 System.Data.OracleClient
同样,server explorer面板中,add 一个connection,在出来的界面中,选择change,切换成
输入用户名和密码后,就能连接成功。
特别提醒:自从oracle官方推出for .net的客户端后,微软就宣告在未来的.net版本中,将移除System.Data.OracleClient命名空间,不再提供微软版的oracle client! 详情见: http://go.microsoft.com/fwlink/?LinkID=144260
除非你的项目将来不打算升级,否则不建议大家用这种方式。
为了引用System.Data.OracleClient,需要添加对System.Data.OracleClient.dll的引用,默认是在C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0目录下
添加引用成功后,就能用下面的代码进行查询了:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using  System;
using  System.Data.OracleClient;
 
namespace  Sample
{
     class  Program
     {
         static  void  Main( string [] args)
         {
             string  connString = "Data Source=local;Persist Security Info=True;User ID=scott;Password=tiger;Unicode=True" ;
             using  (OracleConnection conn = new  OracleConnection(connString))
             {
                 OracleCommand cmd = new  OracleCommand( "select * from emp" , conn);
                 conn.Open();
                 OracleDataReader dr =  cmd.ExecuteReader();
                 while  (dr.Read())
                 {
                     Console.WriteLine( "{0}\t{1}" , dr[0].ToString(), dr[1].ToString());
                 }
                 dr.Close();
             }
             Console.ReadLine();
         }
     }
}
3.3  oledb方式
连接字符串为
Provider=MSDAORA;Data Source=local;Persist Security Info=True;User ID=scott;Password=tiger

示例代码:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using  System;
using  System.Data.OleDb;
 
namespace  Sample
{
     class  Program
     {
         static  void  Main( string [] args)
         {
             string  connString = "Provider=MSDAORA;Data Source=local;Persist Security Info=True;User ID=scott;PassWord=tiger" ;
 
             using  (OleDbConnection conn = new  OleDbConnection(connString))
             {
 
                 OleDbCommand cmd = new  OleDbCommand( "select * from emp" , conn);
                 conn.Open();
                 OleDbDataReader dr = cmd.ExecuteReader();
                 while  (dr.Read())
                 {
                     Console.WriteLine( "{0}\t{1}" , dr[0], dr[1]);
                 }
                 dr.Close();
             }
             Console.ReadLine();
         }
     }
}
3.4 Oracle官方的 ODP.Net
连接字符串为 DATA SOURCE=local;PERSIST SECURITY INFO=True;USER ID=SCOTT;Password=tiger
要使用ODP.Net,必须先添加对Oracle.DataAccess.dll的引用,该文件位于%Oracle_Home%\11.2.0\odp.net\bin\4下
示例代码如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using  System;
using  Oracle.DataAccess.Client;
using  System.Data;
using  System.Data.Common;
 
namespace  Sample
{
     class  Program
     {
         static  void  Main( string [] args)
         {
             string  connString = "DATA SOURCE=local;PERSIST SECURITY INFO=True;USER ID=SCOTT;Password=tiger" ;
             string  ProviderName = "Oracle.DataAccess.Client" ;
 
             DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName);
 
             using  (DbConnection conn = factory.CreateConnection())
             {
                 conn.ConnectionString = connString;
                 conn.Open();
 
                 DbCommand cmd = conn.CreateCommand();
                 cmd.CommandText = "select * from emp" ;
                 cmd.CommandType = CommandType.Text;
 
                 DbDataReader dr = cmd.ExecuteReader();
                 while  (dr.Read())
                 {
                     Console.WriteLine( "{0}\t{1}" , dr[0], dr[1]);
                 }
                 dr.Close();
             }
             Console.ReadLine();
         }
     }
}
为了测试这三种方式(ODBC不考虑)的性能,简单写了一段代码测试了一下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using  System;
using  Oracle.DataAccess.Client;
using  System.Data;
using  System.Data.OleDb;
using  System.Data.Common;
using  System.Diagnostics;
using  MSOracle = System.Data.OracleClient;
 
namespace  Sample
{
     class  Program
     {
         static  void  Main( string [] args)
         {
             string  temp = "" ;
             string  connString = "DATA SOURCE=local;PERSIST SECURITY INFO=True;USER ID=SCOTT;Password=tiger" ;
             string  ProviderName = "Oracle.DataAccess.Client" ;
 
             DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName);
 
             int  max = 5000;
             Stopwatch sw = new  Stopwatch();
             sw.Start();
             for  ( int  i = 0; i < max; i++)
             {
                 using  (DbConnection conn = factory.CreateConnection())
                 {
                     conn.ConnectionString = connString;
                     conn.Open();
 
                     DbCommand cmd = conn.CreateCommand();
                     cmd.CommandText = "select * from emp" ;
                     cmd.CommandType = CommandType.Text;
 
                     DbDataReader dr = cmd.ExecuteReader();
                     while  (dr.Read())
                     {
                         //Console.WriteLine("{0}\t{1}", dr[0], dr[1]);
                         temp = dr[0].ToString();
                     }
                     dr.Close();
                     //Console.WriteLine("第{0}次\t----------------------------------------", i);
                 }
             }
             sw.Stop();
             Console.WriteLine( "Oracle.DataAccess.Client\t{0}次耗时:{1}毫秒" , max, sw.ElapsedMilliseconds);
 
 
             string  connString2 = "Provider=MSDAORA;Data Source=local;Persist Security Info=True;User ID=scott;PassWord=tiger" ;
             sw.Reset();           
             sw.Start();
             for  ( int  i = 0; i < max; i++)
             {
                 using  (OleDbConnection conn = new  OleDbConnection(connString2))
                 {
                     
                     conn.Open();
 
                     OleDbCommand cmd = new  OleDbCommand( "select * from emp" , conn);
                    
                     OleDbDataReader dr = cmd.ExecuteReader();
                     while  (dr.Read())
                     {
                         //Console.WriteLine("{0}\t{1}", dr[0], dr[1]);
                         temp = dr[0].ToString();
                     }
                     dr.Close();
                     //Console.WriteLine("第{0}次\t----------------------------------------", i);
                 }
             }
 
             sw.Stop();
             Console.WriteLine( "System.Data.OleDb\t{0}次耗时:{1}毫秒" , max, sw.ElapsedMilliseconds);
 
             string  connString3 = "Data Source=local;Persist Security Info=True;User ID=scott;Password=tiger;Unicode=True" ;
             sw.Reset();
             sw.Start();
             for  ( int  i = 0; i < max; i++)
             {
                 using  (MSOracle.OracleConnection conn = new  MSOracle.OracleConnection(connString3))
                 {
 
                     conn.Open();
                     MSOracle.OracleCommand cmd = new  MSOracle.OracleCommand( "select * from emp" , conn);
 
                     MSOracle.OracleDataReader dr = cmd.ExecuteReader();
                     while  (dr.Read())
                     {
                         //Console.WriteLine("{0}\t{1}", dr[0], dr[1]);
                         temp = dr[0].ToString();
                     }
                     dr.Close();
                     //Console.WriteLine("第{0}次\t----------------------------------------", i);
                 }
             }
             sw.Stop();
             Console.WriteLine( "System.Data.OracleClient\t{0}次耗时:{1}毫秒" , max, sw.ElapsedMilliseconds);
 
             Console.ReadLine();
         }
     }
}

运行结果:

Oracle.DataAccess.Client        5000次耗时:4711毫秒
System.Data.OleDb       5000次耗时:53684毫秒
System.Data.OracleClient        5000次耗时:8436毫秒

相信大家知道如何选择了吧,果然还是Oracle官方更熟悉自己的产品。

作者: 菩提树下的杨过
出处: http://yjmyzz.cnblogs.com 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值