zoukankan      html  css  js  c++  java
  • 使用 ODP.NET 访问 Oracle(.net如何访问Oracle)详解

    1,什么是ODF .NE,?就是Oracle 为 .NET (ODP.NET) 专门编写了 Oracle Data Provider,一个用于 Microsoft .NET 环境下的 Oracle 数据访问 API 。

    详细解说 http://www.oracle.com/technetwork/cn/testcontent/o23odp-084525-zhs.html 对于官方的代码,已不存在了!

    ODP.NET你不需要安装Oracle,不需要配置oracle.key文件,不需要配置TnsNames.Ora文件 不需要配置环境变量;完全的傻瓜式的在没有安装oracle数据库或者

    客户端等任何oracle的产品的机器去访问Oracle数据库!

    下面详细解说ODP.NET如何对Oracle的数据操作【可以完成建表,CURD( 增删查改)】

    步骤一:获取支持数据库连接的类库文件:Oracle.DataAccess.dll 如何获取呢?

    到官网去相应的版本http://www.oracle.com/technetwork/cn/topics/dotnet/index-088718-zhs.html

    要跑64位的.Net程序,就必须用64位的odp.net,要跑32位的.Net程序,就必须用32位的odp.net,
    最后给出odp.net32位与64位的下载地址:
    64位下载地址
    32位下载地址

    下载后安装后会在你的安装目录\DP.NET\BIN\2.X(图1)下出现这个Oracle.DataAccess.dll,把它复制到你的解决方案下 引用一下

    图1

    顺便点击一下Oraprovcfg.exe 自动配置了环境变量(图2)

    图2

     成功获取所要的dll文件,有些人还要去一个文件的去解压,去配置,我看不需要,如需要的话这个是详细的配置步骤

    http://blog.csdn.net/Sunlihgt_love/article/details/5423926

    步骤二:在正式使用之前,需要在项目中添加引用:

    Oracle.DataAccess.Client 设置数据库的连接等等通用功能,

    Oracle.DataAccess.Types  设置 oracle自定义的一些数据类型

    步骤三:实例解说

    如提供以下数据库的信息

    数据库服务器地址:192.168.10.20
    库名:44410g242
    账号:44bikll
    密码:487gf,.q

    连接oracle的字符串就是这样的(提供我测试的2种方式)

    //string conString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.20)(PORT=1521))" +
               //"(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME = 44410g242)));User Id=44bikll;Password=487gf,.q;"; 

                string conString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.20)(PORT=1521))" +
                  "(CONNECT_DATA=(SID=44410g242)));User Id=44bikll;Password=487gf,.q;";  
                //写连接串以上2方法连接都可以,也可以放到Web.Config中。 

     以上的连接协议TCP和端口1521都是默认的 ,无需修改,如端口被占用了就需要改下。

    本案例中涉及2个表TBLOCKLOG和TBACCOUNT

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Oracle.DataAccess.Client;
    using Oracle.DataAccess.Types;
    
    namespace DHH_Bill_TBLockLog
    {
        class Program
        {
            
            static void Main(string[] args)
            {
                #region 测试数据库  
                Console.WriteLine("获取testid031用户在2013-4-11 15:53:40到2013-04-12 00:00:00的消费清单");
                Console.WriteLine();
                string conString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.20)(PORT=1521))" +
                  "(CONNECT_DATA=(SID=44410g242)));User Id=44bikll;Password=487gf,.q;"; //这个也可以放到Web.Config中。  
                
                //实例化OracleConnection对象 
                try
                {
                    using (OracleConnection conn = new OracleConnection(conString))
                    {
                        conn.Open();
                        string sql = "select TBACCOUNT.username,TBLOCKLOG.accountid,TBLOCKLOG.amount,TBLOCKLOG.locktime  FROM TBLOCKLOG,TBACCOUNT WHERE TBLOCKLOG.accountid=TBACCOUNT.accountid  ";
                        sql += " and TBLOCKLOG.serviceid=1 and TBACCOUNT.username='testid031' and TBLOCKLOG.status=1 and TBLOCKLOG.locktime >= to_date('2013-4-11 13:53:40','yyyy-mm-dd hh24:mi:ss') and TBLOCKLOG.locktime <= to_date('2013-04-12 00:00:00','yyyy-mm-dd hh24:mi:ss') order by TBLOCKLOG.locktime";
                        
                        using (OracleCommand comm = new OracleCommand(sql, conn))
                        {
                            
                            using (OracleDataReader rdr = comm.ExecuteReader())
                            {
                               
                                while (rdr.Read())
                                {
                                    Console.WriteLine("UserName:" + rdr.GetString(0) + ",UserId:" + rdr.GetInt32(1) + ",点数:" + rdr.GetInt32(2) + "," + rdr.GetDateTime(3));
    
                                }
                               
                            }
    
                        }
    
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                #endregion 
    
                Console.WriteLine(); Console.WriteLine();
                Console.WriteLine("计算2013-4-11 15:53:40到2013-04-12 00:00:00时间的testid031用户消费的amount的总和");            
                Console.WriteLine(GetBillByDateAndGameId(conString, "testid031", 1, Convert.ToDateTime("2013-4-11 13:53:40"), Convert.ToDateTime("2013-04-12 00:00:00")));
               
            }
    
    
    
            public static int GetBillByDateAndGameId(string conString,string accountId, int gameId, DateTime beginTime, DateTime endTime)
            {
                try
                {
                    using (OracleConnection conn = new OracleConnection(conString))
                    {
                        accountId = accountId.ToLower();//全部转换为小写
                        conn.Open(); string sql = "select sum(TBLOCKLOG.amount) sumamount FROM TBLOCKLOG,TBACCOUNT WHERE TBLOCKLOG.accountid=TBACCOUNT.accountid  ";
                        sql += " and TBLOCKLOG.serviceid=" + gameId + " and TBACCOUNT.username='" + accountId + "' and TBLOCKLOG.status=1 and TBLOCKLOG.locktime >= to_date('" + beginTime + "','yyyy-mm-dd hh24:mi:ss') and TBLOCKLOG.locktime <= to_date('" + endTime + "','yyyy-mm-dd hh24:mi:ss') order by TBLOCKLOG.locktime";
                     
                        using (OracleCommand comm = new OracleCommand(sql, conn))
                        {
    
                            using (OracleDataReader rdr = comm.ExecuteReader())//创建一个OracleDateReader对象
                            {
                                int sum = 0;
                                while (rdr.Read())//读取数据,如果odr.Read()返回为false的话,就说明到记录集的尾部了
                                {
                                    if (rdr.GetOracleValue(0).ToString() == "null")//防止为空 
                                    {
                                        sum = 0;
                                    }
                                    else
                                    {
                                        sum = int.Parse(rdr.GetOracleValue(0).ToString());
                                        //sum = int.Parse(rdr[0].ToString());
                                    }
                                   
                                }
                                return sum;
                            }
    
                        }
    
                    }
                }
                catch (Exception ex)
                {
                    return -1;
                }
            }
        }
       
    }
    View Code

    显示结果:

    以下是: 1. 建立数据库
               建立一个名为OracleTypesTable的表
               "create table OracleTypesTable (MyVarchar2 varchar2(3000),MyNumber number(28,4) Primary key ,MyDate           date,MyRaw RAW(255))";
               插入一行数据
              "insert into OracleTypesTable values ('test',4,to_date('2000-01-11
               12:54:01','yyyy-mm-dd hh24:mi:ss'),'0001020304')";

    其他操作的说明:(使用说明:http://www.oracle.com/technetwork/cn/testcontent/o23odp-084525-zhs.html

     注意

    1,案例中的sql语句还是和mssql有一点区别的;

    2,统计的话如果获取不到统计的数据的会报错,这就是我为什么加上if (rdr.GetOracleValue(0).ToString() == "null")//防止为空 

    3,WebSERVICE的时候不知道为什么他对用户名的大小写也有区分

    步骤四:部署说明

     在部署到真实服务器的时候,你也同样按照步骤一中的步骤安装客户端ODP.NET文件,点击执行EXE文件自动配置环境变量,查看一下是否安装成功。

    注意版本是否一致,这个是运行你的程序的关键,打开cmd,执行:C:\Documents and Settings\Administrator>sqlplus /nolog 就可以知道版本

    我的结果:

     

     以下找了很多与版本相关的文章---版本的问题  ODP.NET开发和部署的相关问题


    http://www.cnblogs.com/yjmyzz/archive/2011/04/19/2020793.html  

    http://www.cnblogs.com/codingsilence/archive/2011/07/14/2146497.html

    http://blog.chinaunix.net/uid-20049824-id-1980177.html

    补充 其中11.2.0.3.50 Beta的将更合适快速操作Oracle,但是需要win7和.NET Framework 4的支持,一般企业估计还没有把win7当服务器的吧! 

    http://www.oracle.com/technetwork/database/windows/downloads/odpmbetainstall-1696475.html  

    网上的这个http://www.bitscn.com/pdb/oracle/200904/160401.html Instant client批量安装Oracle客户端-

    安装配置还需要从安装过Oracle的机器上拷贝oracle.key文件还要配置环境变量。

    就这么多吧,希望对你有所帮助。,下面是ODP.NET的dll

    端午节快乐

  • 相关阅读:
    python入门19 异常及异常处理 异常捕获
    python入门18 继承和多态
    python入门17 类和对象
    python入门16 递归函数 高阶函数
    接口测试get请求url拼接函数(python)
    python入门15 函数
    ssh tunnel 三种模式
    k8s 容器的生命周期钩子
    对k8s service的一些理解
    windows下使用pyinstaller把python文件打包成exe可执行文件
  • 原文地址:https://www.cnblogs.com/mistor/p/3127346.html
Copyright © 2011-2022 走看看