问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

各位大哥,.NET用ORACLE数据库复杂不复杂啊?

发布网友 发布时间:2022-04-08 22:03

我来回答

5个回答

懂视网 时间:2022-04-09 02:24

其实这个不是一个什么新的话题。但是之前在多次项目中,总是遇到大家针对Oracle数据库的访问时,会有各种各样的问题,最基本的就是要在客户端安装各种client,版本不一样的话还有各种问题。

静下心来看看,其实也没有那么难。我这里总结一下,如何在.NET应用程序中,简单优雅地使用Oracle数据库。

第一个原则:不要依赖

最好的情况就是,程序自己就可以完成数据访问,不需要额外地安装所谓的Oracle Client,那是一个很麻烦而且痛苦的事情。

我们首先看看,如果不装任何东西,是否可以实现Oracle数据库访问?

其实,.NET本身是自带了针对Oracle数据库访问的组件的,就是下面这个System.Data.OracleClient

技术分享

我们的代码如下(这是最原始的ADO.NET代码,只是做演示)

using System;
using System.Data.OracleClient;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = "user id=system;password=password;data source=192.168.56.101:1521/orcl";

            using (var connection = new OracleConnection(connectionString))
            {
                var cmd = connection.CreateCommand();
                cmd.CommandText = "select * from sys.dba_all_tables";
                connection.Open();
                var reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine(reader.GetString(0));

                }

                reader.Close();
                connection.Close();

            }
           
        }
    }
}

 

看起来应该是没有问题的,运行起来却会报错

Additional information: System.Data.OracleClient requires Oracle client software version 8.1.7 or greater.

技术分享

这里的提示就是说,需要有Oracle Client。

这不是我们希望看到的结果。实际上原理上说,我们这么理解吧,可能是这个组件只是一个wrapper,它实际去操作数据库,还需要通过Oracle Client才能实现。

 

使用Oracle提供的组件

更好的建议就是,使用Oracle 官方提供的托管代码组件。Oracle.ManagedDataAccess.dll

技术分享

技术分享

只要添加了这个Nuget Package,代码几乎不需要任何改动,直接就可以复用。

using System;
using Oracle.ManagedDataAccess.Client;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = "user id=system;password=password;data source=192.168.56.101:1521/orcl";

            using (var connection = new OracleConnection(connectionString))
            {
                var cmd = connection.CreateCommand();
                cmd.CommandText = "select * from sys.dba_all_tables";
                connection.Open();
                var reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine(reader.GetString(0));

                }

                reader.Close();
                connection.Close();

            }
           
        }
    }
}

 

当然比较理想的情况是将连接字符串之类的,可以放在配置文件中去。这个很简单,这里就不说明了。

 

结合Entity Framework使用

Entity Framework 出来已经好多年了,几乎成了所有.NET应用程序中的标配(不管有没有用到)。现在的最新版本应该是 6.1.3 .同时,需要注意的是,以后会有一个所谓的Entity Framework Core ,而且开源了 https://github.com/aspnet/EntityFramework

回到正题,之前的代码写法其实还是比较原始的,那么如何结合Entity Framework进行Oracle数据库方面的编程呢?

首先,安装下面的这个组件:Oracle.ManagedDataAccess.EntityFramework

技术分享

然后,可以使用Code first的方式编写如下代码

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;

namespace ConsoleApplication
{
    public class OracleContext : DbContext
    {
        public OracleContext() : base("OracleDbContext")
        {

        }

        public DbSet<Employee> Employees { get; set; }

    }

    [Table("EMPLOYEES", Schema = "SYSTEM")]
    public class Employee
    {
        [Key()]
        [Column("EMPLOYEEID")]
        public int EmployeeID { get; set; }

        [Column("FIRSTNAME")]
        public string FirstName { get; set; }
        [Column("LASTNAME")]
        public string LastName { get; set; }
    }
}

 

 

这里的代码没有什么出奇的。配置文件需要有如下的设置(一般在添加Oracle.ManagedDataAccess.EntityFramework 这个组件的时候,会自动修改配置文件)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="oracle" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) " />
             </dataSources>
    </version>
  </oracle.manageddataaccess.client>
  <connectionStrings>
    <add name="OracleDbContext" connectionString="user id=system;password=password;data source=oracle" providerName="Oracle.ManagedDataAccess.Client" />
  </connectionStrings>
  <system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.ManagedDataAccess.Client" />
      <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <publisherPolicy apply="no" />
        <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
        <bindingRedirect oldVersion="4.121.0.0 - 4.65535.65535.65535" newVersion="4.121.2.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v13.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

后台数据库的表格设计也是很简单。

技术分享

需要注意的是,经过实验,我发现目前这个Entity Framework要求所操作的表必须要有主键,而且主键必须是一个identity column(即自己绑定一个序列,实现自动增长),否则会报错

实际上后台会通过一个触发器来实现这个功能

create or replace TRIGGER EMPLOYEES_TRG
BEFORE INSERT ON EMPLOYEES
FOR EACH ROW
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN
    IF INSERTING AND :NEW.EMPLOYEEID IS NULL THEN
      SELECT EMPLOYEES_SEQ.NEXTVAL INTO :NEW.EMPLOYEEID FROM SYS.DUAL;
    END IF;
  END COLUMN_SEQUENCES;
END;

 

接下来在前端程序中就简单多了,下面是一个代码片段

var ctx = new OracleContext();

ctx.Employees.Add(new Employee() {FirstName = "ares", LastName = "chen" });
ctx.SaveChanges();

var query = ctx.Employees.ToArray();
foreach (var item in query)
{
    Console.WriteLine(item);
}

 

需要注意的是,如果需要使用Entity Frmaework的Database first或Model first的功能,还是需要安装Oracle Client,或者准确地说应该是ODAC组件

http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html

在.NET开发面向Oracle数据库的应用程序

标签:

热心网友 时间:2022-04-08 23:32

不复杂,和使用SQL 2005一样。
Oracle的强大不在于对外界程序的复杂,而在于其本身的功能。
数据库在.net的编程接口都大同小异。
都在Data空间下。
Oracle和SQL使用的方法都一样。

热心网友 时间:2022-04-09 00:50

ORACLE 本身就复杂

热心网友 时间:2022-04-09 02:25

用SQL Server 2005很不错啊

热心网友 时间:2022-04-09 04:16

其实和SQL SERVER是一样的,只不过,自身的功能比较复杂,用.NET编辑的时候的调用方法和SQL SERVER语法一致!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...频数和频率成正比,2频数一定时,频率与总次数成反比,对不对_百度... ...总次数之间的关系是( ) A.频数越大,频率越大 B.总次数一定时,频数越... 实验的总次数、频数及频率三者的关系是( )A.频数越大,频率越大B.频数... 嘎牙鱼的做法大全 安无线网要用多少元网费要交多少元不用用了要不要交网费,想寻求大家的... 无线网费1年多少钱 "Hbr"作为“港”的缩写,其在英语中的使用频率和应用示例如何? 【车主点评:吉利汽车帝豪GL 使我荣华富贵】 请问,如果,家用,自动挡,帝豪gl,英朗,科沃兹,卡罗拉,轩逸,同等价位,建议... ...景点?既能休闲的时候看看又能长点知识@@谢谢各位了! 一个提手一个庸是什么成语 为什么新式步枪都有这么一个提手,不会增加重 士官退役后一般安排什么样的工作 太极拳中是 1起式2左右懒扎衣 3 单鞭 4提手上式5白鹤晾翅6左右搂膝拗步7上步斑斓锤8如风似闭是什么太极拳 一个提手一个番读音是什么 左边是提手旁右边是个“式” 请问这个字什么,怎么读?并推荐一个好用的部首查字法网站 提手旁加上式可以组什么词语? 左边一个提手旁右边一个式是什么字 提手旁加式 什么字 一个提手一个式是什么字 健康管理师领补贴需要什么条件 Microsoft Office Visio 2007在绘制甘特图时星期六和星期天绘制不上怎么办 数码相机内存卡格式化后又写满了,还能恢复以前的照片吗 相机内存卡格式化了,然后又重新拍了很多照片,格式化的照片还能恢复 健康管理师的证书怎么申请补贴?有什么条件啊? 西安健康管理师领取补贴需要什么条件 谁能帮忙提供财务人员绩效考核表和方案越详细越好!(紧急求助) 关于人与人之间互相关爱的作文儿 怎么加速百度网盘下载速度 凤凰单丛有那几种呢? 有谁知道,当兵的,四级士官,退伍以后能安排工作吗?如果能,大概是什么样的工作? 独生子女奖励金发放的标准是什么? 如果当兵5年退伍后有什么待遇,会有工作分配吗?会分配什么样的工作? 威海市2020独生子费标准具体多少? 当兵十年以上,复员后一般安排什么工作? 我的空调制冷正常,制热效果不好,怎么解决? 独生子女补助金由谁发,发多少,什么时间发?是哪个法规或条例规定的? 聊城医生路过起火小区撬窗救2名幼童,事情的原委是什么? 浙江舟山7岁男孩车祸离世,为何网友纷纷痛心不止? 新郎医生婚礼途中救溺水男童? 如何看待新郎医生婚礼途中救溺水男童的这个做法? 长沙一名小男童吃花生窒息,医生是如何将其抢救回来的? 20月大男童被15厘米刀插入后脑,救回来了吗? 关于新郎医生婚礼途中救溺水男童一事,你有何看法? 五一二大地震中医生救死扶伤的故事 令人感动的故事 男童坠楼120认定死亡拒救,家人自行送医救活孩子,你怎么看? 新郎医生在婚礼途中救溺水男童,这体现了什么? 新郎医生婚礼途中救溺水男童,新娘是嫁对人了吗? 自我保护事例