一、使用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. uva 1456

    这题说的是 给了 n 个 点 然后每个点 都有 相应的概率,你要将这n个点划分成w个集合使得 下面定义的这种算法 得到的 值最小 n1 是集合一的 个数  是 集合一内的每个点的概率和, 下面是分成两 ...

  2. 文件名含中文的JavaWeb文件下载

    在javaweb项目中实现文件下载,当文件名中包含中文文字时,需要进行如下的处理,才能在浏览器端正常显示中文文件名: response.setContentType("octets/stre ...

  3. pug 在线文档

    https://pugjs.org/zh-cn/api/getting-started.html

  4. unhandledException详细介绍

    http://www.cnblogs.com/eaglet/archive/2009/02/17/1392191.html 1. GC 产生的异常,这种异常通常因为Finalize函数中引发未捕获异常 ...

  5. Openldap基于digest-md5方式的SASL认证配置

    1. openldap编译 如果需要openldap支持SASL认证,需要在编译时加上–enable-spasswd选项安装完cyrus-sasl,openssl(可选),BDB包后执行: 1 2 $ ...

  6. POJ 3436 ACM Computer Factory(最大流+路径输出)

    http://poj.org/problem?id=3436 题意: 每台计算机包含P个部件,当所有这些部件都准备齐全后,计算机就组装完成了.计算机的生产过程通过N台不同的机器来完成,每台机器用它的性 ...

  7. Gym 101147A The game of Osho(SG找规律)

    https://vjudge.net/problem/Gym-101147A 题意:给出G组数,每组数包括两个数B,N,两玩家轮流取数,使得N-num,num<=N并且num是N的整次幂.判断谁 ...

  8. 使用git一张图就够了

    现在,版本控制工具中,git逐步成为主流.他的分散式的特性是它超越svn渐渐独霸江湖.如果你还不熟悉git,通过本文,你有个最基本最实用的理解:如果你熟悉git,温故而知新,为你加深对git的理解 g ...

  9. R语言数据去重

    R语言常用的去重命令有unique duplicated unique主要是返回一个把重复元素或行给删除的向量.数据框或数组 > x <- c(3:5, 11:8, 8 + 0:5)> ...

  10. install ros-indigo-ecl-build

    -- ==> add_subdirectory(bp_smart_charging/bp_dock_drive) CMake Warning at /opt/ros/indigo/share/c ...