一、使用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雅思答案 tygj123.com
 
   二、使用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存储过程的简单登录验证程序 www.yz-lc.com
 
   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();
 
   }
 
   ……
 
   ///
 
   /// 应用程序的主入口点。
 
   ///
 
   [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();
 
   }
 
   }
 
   }
 
   }

使用C#连接ORACLE数据库的更多相关文章

  1. java连接Oracle数据库

    Oracle数据库先创建一个表和添加一些数据 1.先在Oracle数据库中创建一个student表: create table student ( id ) not null primary key, ...

  2. 记录排查解决Hubble.Net连接Oracle数据库建立镜像库数据丢失的问题

    起因 前几天在弄Hubble连接Oracle数据库,然后在mongodb中建立一个镜像数据库; 发现一个问题,原本数据是11W,但是镜像库中只有6w多条; 刚开始以为是没运行好,又rebuild了一下 ...

  3. NodeJs连接Oracle数据库

    nodejs连接oracle数据库,各个平台的官方详情文档:https://github.com/oracle/node-oracledb/blob/master/INSTALL.md 我的nodej ...

  4. jdbc连接oracle数据库

    /*** 通过改变配置文件来连接不同数据库*/package com.xykj.jdbc; import static org.junit.Assert.*; import java.io.Input ...

  5. 用VS连接oracle数据库时ORA-12504错误

    在用VS2008连接oracle数据库时,可能会出现: ORA-12504: TNS: 监听程序在 CONNECT_DATA 中未获得 SERVICE_NAME 只需在web.config文件Data ...

  6. ASP.NET连接Oracle数据库的步骤详解(转)

    ASP.NET连接Oracle数据库的步骤详解   本文我们主要介绍了ASP.NET连接Oracle数据库的步骤及每个步骤需要进行的设置,希望能够对您有所帮助.   在用ASP.NET开发应用程序时, ...

  7. 64 位win 7或windows 8下的visual studio不能连接Oracle数据库调试网站的问题

    在64 位win 7或windows 8系统下,visual studio直接F5运行网站调试,你会发现不能连接Oracle数据库,会报一个“ORA-06413: Connection not ope ...

  8. [原创]安装Oracle 11gR2,以及如何在win8下使用plsql develper连接Oracle数据库 ,在这里和大家分享下

    一,关于win8下安装Oracle 11gR2 1.我下载的是Oracle_11gR2_win64.其中有两个包: 注意:在解压了之后将:win64_11gR2_database_2of2\datab ...

  9. 用Navicat连接Oracle数据库时报错ORA-28547:connection to server failed,probable Oracle Net admin error

    用Navicat连接Oracle数据库时出现如下错误 上网一查原来是oci.dll版本不对.因为Navicat是通过Oracle客户端连接Oracle服务器的,Oracle的客户端分为两种,一种是标准 ...

  10. JDBC连接Oracle数据库的问题

    场景:最近做一个java web项目,使用jdbc连接Oracle数据库,遇到了两个问题. 问题1:jdbc连接不上Ubuntu Oracle服务器? 后来发现这个问题的原因是由于连接字符串写错了,修 ...

随机推荐

  1. POJ-3189-Steady Cow Assignment(最大流+枚举)

    题意 此题题意不太好懂.现有n头牛和b个牛棚,每个牛棚可以养的牛的数目都有一个限制c[i],表示该牛棚最多只能关c[i]头牛,每头牛对每一个牛棚都有一个喜爱值,用1到b来表示,现在要安排这些牛,使得牛 ...

  2. Delphi 弹出Windows风格的选择文件夹对话框, 还可以新建文件夹

    Delphi 弹出Windows风格的选择文件夹对话框, 还可以新建文件夹     unit Unit2; interface uses  Windows, Messages, SysUtils, V ...

  3. [Git] MAC上Git初探

    1.基本设置,包括用户名.邮箱.编辑工具.查看设置.帮助等 $ git config --global user.name "John Doe" $ git config --gl ...

  4. Web 测试笔记

    测试难点 主要是模块之间的同步问题. 测试容易忽略的地方 1. 各种标题.包括页面“标签页”的标题,弹出框的标题.由于开发经常直接用之前的页面,比如编辑可能直接用新增的页面,导致标题出错. 2. 最大 ...

  5. Linux 环境变量 $PATH

    我们知道查阅文件属性的指令 ls 完整文件名为:/bin/ls(这是绝对路径),那为什么可以在任何地方执行/bin/ls 这个指令呢?  为什么在任何目录下输入 ls 就一定可以显示出一些讯息而不会说 ...

  6. hdu 4424 & zoj 3659 Conquer a New Region (并查集 + 贪心)

    Conquer a New Region Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...

  7. Linux中date命令的各种实用方法--转载

    在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,自己也曾经为时间的各种表示方法和如何修改时间而困惑,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的 ...

  8. Java基础知识强化之集合框架笔记05:Collection集合的遍历

    1.Collection集合的遍历 Collection集合直接是不能遍历的,所以我们要间接方式才能遍历,我们知道数组Array方便实现变量,我们可以这样: 使用Object[]  toArray() ...

  9. Python之路,Day12 - 那就做个堡垒机吧

    Python之路,Day12 - 那就做个堡垒机吧   本节内容 项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多 ...

  10. 新版本ButterKnife的配置

    新版本的ButterKnife的添加方式发生了变化,然后摸索着记录了一下. 按照ButterKnife的官网描述,使用ButterKnife需要在Gradle中添加如下依赖: compile 'com ...