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

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

一、安装oracle 11g 服务端(可选)

1.1 为什么要安装服务端?

理论上讲,本机只需要安装oracle客户端即可,但是很多时候本机有一个服务端学习起来会更方便。比如:数据库的导入/导出,数据库的创建等,均需要服务端。

注:oracle的server真的很占内存,如果您的爱姬内存在2G以下,建议直接跳过本步骤吧.

1.2 服务端的安装文件下载地址

http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

因为我的笔记本是Win2008 R2系统,所以选择了特定的win2008 x64版本(安装文件约1.9G),下载地址如下

http://www.oracle.com/technetwork/database/enterprise-edition/downloads/111070-win64-2008soft-084715.html

在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客户端

下载地址
http://www.oracle.com/technetwork/database/windows/downloads/index-101290.html

一路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目录下

添加引用成功后,就能用下面的代码进行查询了:

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

示例代码:

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下

示例代码如下:

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不考虑)的性能,简单写了一段代码测试了一下:

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官方更熟悉自己的产品。

时间: 2024-10-15 18:52:31

.net程序员使用Oracle新手上路指南的相关文章

有哪些老鸟程序员知道而新手不知道的小技巧?自我感受

最近在朋友圈看到别人分享的一篇知乎回答:https://www.zhihu.com/question/36426051/answer/76031743 我觉得写得挺有道理的,作为一个写了10多年C#代码的老程序员来说,很多地方我能感同身受,所以也谈谈我的自我感受. 1.重构是程序员的主力技能. 是的,我之前经常也提到一点,就是好多设计模式不是提前就设计出来的,而是重构出来的.很多情况是我们在做设计的时候考虑不到的,是写代码时也考虑不到的,只有在项目上线后,客户使用过程中才会反应出来,这个时候就需

别转管理,十年程序员老鸟给新手的几条忠告

在2006年,我开始了编程工作.当意识到来到了十年这个重要的时间关口时,我觉得有必要回顾一下这十年间所犯下的错误,做一做经验总结,并且给正在这个职业上奋斗的人们提出我的一些忠告.开发行业变化得很快,我无法肯定在未来十年里这些建议一直有效,但我的话对你们是肯定有帮助的,不管是刚开始工作的新人还是老手. 要坚持使用一个开发平台,构架或语言 在过去十年间,我所犯的最大错误是:几乎每次我换工作时也转换了开发平台. 我的经历从Java企业开发开始,到嵌入式C编程,到用VB.C# 和 C++开发Window

Windows Mobile开发者新手上路指南

Part 1.开发环境的搭建 软件安装顺序: 1.安装Microsoft ActiveSync 4.0以上版本 2.安装VS2005 开发Pocket PC需安装Windows Mobile 5.0 Pocket PC SDK 开发Smartphone需安装Windows Mobile 5.0 Smartphone SDK Mobile 5.0环境配置: 1.模拟器与Microsoft ActiveSync同步: A.启动VS2005,在Tools->Device Emulator Manage

优秀程序员无他-善假于物也

运用一门程序设计语言对大多数程序员来说是小菜一碟,但是更上一层楼成为一名专家级的软件开发者,恐怕目前还是大多数人的梦想.<程序员的思维修炼>一书中将程序员分为5个层级:新手,高级新手,胜任者,精通者,专家.根据作者的调查研究结果,在这5个层级中,大多数的程序员属于高级新手.而且居于这个层级的程序员从入行1.2年的到工作10来年都大有人在. 身为一个程序员,如何才能尽快的突破自身的瓶颈,得到快速的提升那?这可真不是三言两语可以说清楚.本人09年毕业投身软件行业,2012年初离开工作了三年的公司A

让程序员愤怒的十种事

程序员是一个比较特殊的群体,他们因为长期和电脑打交道所养成的性格和脾气也是比较相近的.当然,既然是人,当然是会有性格的,也是会有脾气的.下面,让我来看看10种能把程序惹毛了的事情.一方面我们可以看看程序员的共性,另一方面我们也可以看看程序员的缺点.无论怎么样,我都希望他们对你的日常工作都是一种帮助. 第十位程序注释 程序注释本来是一些比较好的习惯,当程序员老手带新手的时候,总是会告诉新手,一定要写程序注释.于是,新手们当然会听从老手的吩咐.只不过,他们可能对程序注释有些误解,于是,我们经常在程序

101_《Delphi5程序员指南》

<Delphi5程序员指南> Delphi 教程 系列书籍 (101) <Delphi5程序员指南> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Part1 Part2 Part3 Part4 Part5 Part6 Part7 作者: 蒋方帅 出版社:人民邮电出版社 ISBN:9787115086761 上架时间:2007-12-14 出版日期:2000 年8月 页码:1046 版次:1版1次 内容简介 本书介绍了Delphi5的各方面内容.全书共分

整理类库-新手Net开发程序员想知道如何整理C#类库?

问题描述 新手Net开发程序员想知道如何整理C#类库? 刚工作不久带我的师父在做框架,让我帮忙整理类库,我不知道如何下手,求有经验的大神指导一下(最好能具体告知整理类库的步骤和注意事项)谢谢了

高级程序员装逼指南,是高级哦!

下面这个才是高级版本 ;; 这是注释 ;; 0.9版本 ;; 2011年8月22日   ** 前言 ** 最近网上出了一个<程序员装逼指南>,觉得这个东西其实图样图森破 然后在下跟微博上的一些程序大牛讨论了一下如何装逼,深有感触 程序员嘛,外行人看起来已经是不可理解的奇怪生物了,自然也没必要跟他们再装逼 所以呢,如何对其他程序员装逼就是一门很有学问的事了 于是乎在下手痒写了个<高级程序员装逼指南>,请大家指正   ** 编程语言 ** 千万千万千万千万不要说自己是Java/C#/C

C++程序员Protocol Buffers基础指南

这篇教程提供了一个面向 C++ 程序员关于 protocol buffers 的基础介绍.通过创建一个简单的示例应用程序,它将向我们展示: 在 .proto 文件中定义消息格式 使用 protocol buffer 编译器 使用 C++ protocol buffer API 读写消息 这不是一个关于在 C++ 中使用 protocol buffers 的全面指南.要获取更详细的信息,请参考Protocol Buffer Language Guide 和 Encoding Reference.