一、使用OracleClient组件连接Oracle

.Net框架的System.Data.OracleClient.dll组件(ADO.Net组件),为连接和使用Oracle数据库提供了很大的方便。

1、使用客户端网络服务名连接Oracle

基于业务逻辑与数据库实体的分层需要,一般要求在不同于Oracle数据库主机的客户端机器连接和使用Oracle数据库。这种情况要么是通过C/S应用程序的客户端访问数据库的情况;要么是在B/S应用程序中,在WEB服务器端远程连接Oracle数据库服务器。

通过客户端网络服务名远程连接Oracle,要求在客户端机器中安装Oracle客户端工具(安装类型可以不必选择“管理员”模式,而只需要安装运行时支持即可,为应用程序提供基本的网络服务配置工具等)。

建立连接的语句比较简单,关键点为data source的设置。这里的data source不像SqlServer连接字串中指的是数据库名称,而是指客户端网络服务名(相关内容请参考前面有关客户端安装的文章)。对于本文的Oracle安装来说,data source对应着E:\Oracle_Client\oracle\ora92\network\admin\tnsnames.ora配置文件中的网络服务名(出于方便试验的原因,数据库与独立的客户端工具分别安装在了同一台机器的不同目录)。在具体实施连接时,将根据data source的值去该客户网络服务配置文件中查找对应项,以获取数据库服务器主机地址、端口、全局数据库名等连接信息。

建立连接的主要代码如下:

......

using System.Data.OracleClient;

......

//这里的“remotedb”对应于“Oracle客户端的安装与远程连接配置”一文中配置的客户端网络服务名

OracleConnection conn=

new OracleConnection("data source=remotedb;User Id=scott;Password=scott;");
    conn.Open();

......

2、本地连接和使用Oracle

本地使用Oracle是指在安装Oracle数据库的主机中连接和使用Oracle数据库。从安全性和负载均衡的角度考虑,这种方式是不可取的。这里仅作为实验使用。

本地连接的代码与远程连接实际上没有什么分别,只不过其data source指向服务器端的客户网络服务名。对于本文的数据库安装,它指向E:\Oracle_Server\oracle\ora92\network\admin\tnsnames.ora文件中所定义的网络服务名(有关内容请参考“Oracle客户端的安装与远程连接配置”一文)。

对于这种本地连接方式,在服务器端不能存在独立安装的客户端工具,否则data source只会去匹配独立客户端的tnsnames.ora文件,即使找不到对应的网络服务名,也不会再去匹配服务器端的服务名。这不知是.Net组件的设计错误,还是故意为之,以鼓励远程连接和使用Oracle。

二、使用OleDB组件连接和访问Oracle数据库

OleDB组件是通过Oracle OleDB驱动程序(OraOLEDB.dll)连接和访问Oracle数据库,使用OleDB驱动的前提也是要在客户端安装运行时环境。可以采用自定义的客户端安装方式,安装包括OraOLEDB.dll等在内的必须的文件,可以不必安装包括配置客户网络服务等的客户端工具。在这种情况下,OleDB的连接字串及简单访问数据库的代码如下所示:

......

using System.Data.OleDb;

......

//这里的Data Source直接被赋值为类似tnsnames.ora文件中网络服务名定义的内容,不再需要客户端

//的配置文件tnsnames.ora(OracleClient也可以这样处理)

OleDbConnection conn=
         new OleDbConnection("Provider=OraOLEDB.Oracle.1;Server=localhost;

Data  Source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)

(HOST = localhost)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = mydb.bawei)));

User ID=scott;Password=scott;");
    conn.Open();
    OleDbCommand comm=new OleDbCommand("select * from scott.emp",conn);
    OleDbDataReader dr=comm.ExecuteReader();

Console.WriteLine("姓名      职位");
    while(dr.Read())
    {
          Console.WriteLine(dr.GetString(1)+"   "+dr.GetString(2));

}
    Console.ReadLine();
    dr.Close();
    conn.Close();

......

使用OleDB组件可以获得比OracleClient更高的效率和性能,因为OleDB是比ADO.NET更底层的组件,ADO.NET也要通过OleDB获取数据。

三、一个使用Oracle存储过程的简单登录验证程序

1、创建用户表

作为实验用表,用户表admin仅包含用户名和密码两个字段。创建表的SQL语句如下:

CREATE TABLE SCOTT.ADMIN ("NAME" VARCHAR2(20) NOT NULL,

"PASSWORD" VARCHAR2(20) NOT NULL) TABLESPACE "EXAMPLE"

2、创建验证用户登录的存储过程

CREATE OR REPLACE  PROCEDURE "SCOTT"."P_LOGIN" (v_Name varchar2,

v_Password varchar2,b_Passed out char) as
      n_Count number;
      begin
        select count(*) into n_Count from admin where name=v_Name and password=v_Password;
        if n_Count > 0 then
           b_Passed:='1';
        else
           b_Passed:='0';
        end if;
      end;
    3、在Sql Plus等sql工具中使用PL/SQL测试存储过程是否可用:

set serveroutput on;
    declare
      v_Name varchar2(20);
      v_password varchar(20);
      b_Passed char(1);
    begin
      v_Name:='mxh';
      v_Password:='mxh';
      p_Login(v_Name,v_Password,b_Passed);
      if b_Passed ='1' then
        DBMS_OUTPUT.PUT_LINE('SUCCESS');
      end if;
    end;

4、创建一个登录窗口,实验C#对存储过程的调用:

(1)编写数据访问类,用于访问和操作数据库:

//DataAccess.cs

using System;
    using System.Data;
    using System.Data.OracleClient;

namespace OraLoginProcedure
    {
       public class DataAccess
       {
          private string connStr="data source=yourdb;User Id=scott;Password=scott;";
          private OracleConnection conn=null;

public DataAccess()
          {
          }

public DataAccess(string strConnection)
          {
              this.connStr=strConnection;
          }

public OracleConnection getConnection()
          {
             try
             {

if(conn==null)
                   conn=new OracleConnection(connStr);
                if(conn.State==ConnectionState.Open)
                   conn.Open();
                return conn;
             }
             catch(OracleException e)
             {
                throw e;
             }
           }

public void closeConnection()
           {
              if(conn.State==ConnectionState.Open)
                 conn.Close();
           }

//执行存储过程

public void RunProcedure(string storedProcName,OracleParameter[] parameters)
           {
              OracleCommand cmd=new OracleCommand(storedProcName,getConnection());
              cmd.CommandType=CommandType.StoredProcedure;
              foreach(OracleParameter parameter in parameters)
              {
                 cmd.Parameters.Add(parameter);
              }
              cmd.ExecuteNonQuery();//执行存储过程
              closeConnection();
           }

//执行登录验证(在实际应用中应该把这种执行业务逻辑的代码与数据操作基础代码分离,以

//实现软件的清晰分层、增强代码的可复用性)

public bool Login(string username,string password)
           {
               OracleParameter[] parameters={
                     new OracleParameter("v_Name",OracleType.VarChar,20),
                     new OracleParameter("v_Password",OracleType.VarChar,20),
                     new OracleParameter("b_Passed",OracleType.Char,1)
               };
               parameters[0].Value=username;
               parameters[1].Value=password;
               parameters[0].Direction=ParameterDirection.Input;
               parameters[1].Direction=ParameterDirection.Input;
               parameters[2].Direction=ParameterDirection.Output;
               try
               {
                  RunProcedure("P_LOGIN",parameters);
                  if(parameters[2].Value.ToString() == "1")
                     return true;
                  else
                     return false;
               }
               catch(Exception e)
               {
                  throw e;
               }
            }
         }    
      }

(2)编写登录验证的界面程序:

//Form1.cs

......

using System.Data;

namespace OraLoginProcedure
    {
       public class Login : System.Windows.Forms.Form
       {
          private System.Windows.Forms.Button button1;//登录按钮

private System.Windows.Forms.TextBox textBox1;//用户名输入框

private System.Windows.Forms.TextBox textBox2;//密码输入框
          private System.Windows.Forms.Label label1;
          private System.Windows.Forms.Label label2;

......

public Login()
          {
              InitializeComponent();

}

......

/// <summary>
          /// 应用程序的主入口点。
          /// </summary>
          [STAThread]
          static void Main()
          {
             Application.Run(new Login());
          }

private void button1_Click(object sender, System.EventArgs e)
          {
             try
             {
                string username=textBox1.Text.Trim();
                string password=textBox2.Text.Trim();
                this.Close();//关闭界面后就读不到其中的控件输入了
                DataAccess da=new DataAccess();
                if(da.Login(username,password))
                   MessageBox.Show("Hello "+username);
                else
                   MessageBox.Show("Login failed");    
                Application.Exit();
              }
              catch(Exception ex)
              {
                 this.Close();
                 MessageBox.Show(ex.ToString());
                 Application.Exit();
              }
           }
        }
    }

出处:http://blog.csdn.net/chuyuqing/article/details/20371745

使用C#的两种方式OracleClient组件和OleDB组件连接ORACLE数据库的更多相关文章

  1. 读取数据库配置信息的两种方式(以后开发项目用java链接数据库)-------java基础知识

    第一步:先建立jdbc.properties user=root password url/yanlong driver=com.mysql.jdbc.Driver 第一种方式:直接文件读取 pack ...

  2. 服务容错保护断路器Hystrix之一:入门示例介绍(springcloud引入Hystrix的两种方式)

    限流知识<高可用服务设计之二:Rate limiting 限流与降级> 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的 ...

  3. ADB连接手机的两种方式(usb数据线连接和wifi连接)

    ADB(Android Debug Bridge)安卓测试桥,它是连接电脑开发端和安卓设备的桥梁,这个安卓设备可以是真实的安卓手机或者平板,也可以是虚拟的安卓模拟器,   这里介绍ADB连接手机的两种 ...

  4. react学习笔记1之声明组件的两种方式

    //定义组件有两种方式,函数和类 function Welcome(props) { return <h1>Hello, {props.name}</h1>; } class ...

  5. React组件导入的两种方式(动态导入组件的实现)

    一. react组件两种导入方式 React组件可以通过两种方式导入另一个组件 import(常用) import component from './component' require const ...

  6. 使用react定义组件的两种方式

    react组件的两种方式:函数定义,类定义 在定义一个组件之前,首先要明白一点:react元素(jsx)是react组件的最基本的组成单位 组件要求: 1,为了和react元素进行区分,组件名字首必须 ...

  7. DRF 序列化组件 序列化的两种方式 反序列化 反序列化的校验

    序列化组件 django自带的有序列化组件不过不可控不建议使用(了解) from django.core import serializers class Books(APIView): def ge ...

  8. .Net 中读写Oracle数据库常用两种方式

    .net中连接Oracle 的两种方式:OracleClient,OleDb转载 2015年04月24日 00:00:24 10820.Net 中读写Oracle数据库常用两种方式:OracleCli ...

  9. 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

    在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...

随机推荐

  1. hdu5057 分块处理,当数值大于数据范围时树状数组 真是巧 将大数据分为小数据来处理

    这题说的给了100000个数有100000次操作 询问 L和R 区间内 在D位上为P的个数,用树状数组存 要开[10][10][100000]的int 开不了但是能开 这么大的unsign short ...

  2. Linux查看网卡UUID另一方法

    转自:http://liaoronghui.com/linux-view-network-adapter-uuid-other-law.html 有时我们不小心将/etc/sysconfig/netw ...

  3. HttpClient-RestTemplate-Feign

    如何通过Java发送HTTP请求,通俗点讲,如何通过Java(模拟浏览器)发送HTTP请求. Java有原生的API可用于发送HTTP请求,即java.net.URL.java.net.URLConn ...

  4. 前端学习笔记之JavaScript

    JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中),后将其改名ScriptEase(客 ...

  5. @Tranactional事务没有回滚

    一.特性 先来了解一下@Transactional注解事务的特性吧,可以更好排查问题 1.service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务 ...

  6. linux内核分析第四周-使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call.系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变量 ...

  7. HeyWeGo第五周项目总结

    HeyWeGo第五周项目总结 项目内容 使用java程序开发一款扫雷游戏 游戏项目规划: 确定游戏中方块格子的个数 确定游戏中地雷的个数(初始10个),完成布雷 计算每个方块周围的雷数,在方块周围本身 ...

  8. HDU 2222 Keywords Search(AC自动机)题解

    题意:给你几个keywords,再给你一段文章,问你keywords出现了几次. 思路:这里就要用到多模匹配算法AC自动机了,AC自动机需要KMP和字典树的知识,匹配时是在字典树上,失配我们就要用到类 ...

  9. Asynchronous Programming Patterns

    Asynchronous Programming Patterns The .NET Framework provides three patterns for performing asynchro ...

  10. CGI, FCGI, SCGI, WSGI 释异

    IKI Links: CGI - http://en.wikipedia.org/wiki/Common_Gateway_Interface FCGI - http://en.wikipedia.or ...