如何从.Net Core连接到Oracle数据库

30

我想在一个 .netCore 库中连接到 Oracle 数据库。是否有任何方法可以实现这一点?

我已经尝试了 另一个 SO 帖子 中的建议,但它不起作用,也许被移除了?如你所见,我正在尝试使用“net461”。

目前,我正尝试使用旧式的 ADO.Net 通过 Oracle.ManagedDataAccess.Client 进行连接。 我也知道 Oracle 还没有推出 .netCore 连接器。 但即使在那里,我也无法使其工作,它很难包含System.Data,每当我尝试添加它时都会出错。

我的 project.json 文件如下:

{
  "version": "1.0.0-*",

  "dependencies": {
    "NETStandard.Library": "1.6.0",
    "Oracle.ManagedDataAccess": "12.1.24160719",
  },

  "frameworks": {
    "netstandard1.6": {
      "imports": [
        "dnxcore50",
        "net461"
      ]
    }
  }
}

这是我目前尝试做的方式。

using Oracle.ManagedDataAccess.Client;

public class MyRepository
{
    public string GetServerVersion()
    {
        var _db = new OracleConnection("User Id=myUser;Password=myPassword;Data Source=MyOracleConnection");

        var serverVersion = _db.ServerVersion;
        return serverVersion;
    }
}

然而,由于缺少System.Data库,上述内容无法编译,而我正在努力引入它。

我没有固定的做法,我只是希望在这个时刻找到最好的合理选项

10个回答

14
在2018年1月底,Oracle发布了Beta版本的.Net Core托管驱动器http://www.oracle.com/technetwork/topics/dotnet/downloads/net-downloads-160392.html。文件中提到支持的平台包括Windows和Linux。
Nuget: https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core 另外还有一些老的替代方案,使用标准/即时Oracle客户端:

最后一种选择的 my TestCore.csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Mono.Data.OracleClientCore" Version="1.0.0" />
  </ItemGroup>
</Project>

我的 program.cs 文件:
using System;
using System.Data.OracleClient;

namespace TestCore
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Starting.\r\n");                      
            using (var _db = new OracleConnection("User Id=myUser;Password=myPassword;Data Source=MyOracleConnection"))
            {
                Console.WriteLine("Open connection...");
                _db.Open();
                Console.WriteLine(  "Connected to:" +_db.ServerVersion);
                Console.WriteLine("\r\nDone. Press key for exit");
                Console.ReadKey();
            }           
        }
    }
}

当我使用Mono版本时,我会遇到这个错误:无法加载DLL“oci”:找不到指定的模块。(HRESULT异常:0x8007007E) - andrecarlucci
• 必须设置到 Oracle Client 的路径。 • 必须使用与 .Net Core 相同版本的 32 位 / 64 位 Oracle 客户端 • 对于 Linux,必须使用 nuget 包 Mono.Data.OracleClientCore.Linux - Dubo
哦,我以为我能像托管版本那样摆脱Oracle客户端。太遗憾了。谢谢。 - andrecarlucci
刚刚测试了 beta 版的 .Net Core 托管驱动程序(在 Windows 上),目前看来它运行得非常好,迫不及待地等待正式发布! - Rémi Gaudin

12

Oracle在nuget上发布了官方的.NET Core数据提供程序

以下是一个基本示例,展示如何使用它:

using Oracle.ManagedDataAccess.Client;

public void Execute(string queryString, string connectionString)
{
    using (OracleConnection connection = new OracleConnection(connectionString))
    {
        OracleCommand command = new OracleCommand(queryString, connection);
        command.Connection.Open();
        command.ExecuteNonQuery();
    }
}

基本上,您可以像使用官方的.NET System.Data.SqlClient一样使用它(可以在网上找到易于入门的教程),只需在代码中将SqlConnection替换为OracleConnection,将SqlCommand替换为OracleCommand即可。


有人可以分享如何在NET Core 3.0 MVC上使用这个包吗? - Fairuz Sulaiman
@Fairuz Sulaiman,我刚刚编辑了我的答案,添加了一个基本示例,可以帮助您入门。 - Rémi Gaudin
谢谢您的回复。需要编辑哪些文件?Startup.cs还是Program.cs? - Fairuz Sulaiman
@Fairuz Sulaiman 实际上,您可以在 ASP.NET Core 应用程序的任何部分使用此代码。但是,如果您想要,您可以在 Startup.cs 中添加一个服务,该服务实例化一个具有公共函数(例如 Execute())的类。因此,之后您可以在应用程序的任何文件中使用依赖注入来注入您的类实例,然后可以使用它来执行所有数据库查询。 - Rémi Gaudin

7
Oracle计划在2017年底左右认证ODP.NET, Managed Driver在Microsoft .NET Core上。Oracle打算支持在Windows操作系统和Oracle Linux上的托管ODP.NET。Managed ODP.NET可能支持其他操作系统。Oracle将继续评估对其他Linux发行版的支持,并在未来公布添加到认证列表中的内容。Oracle不打算在Microsoft .NET Core 2.0之前认证。.NET Core 2.0包含许多功能,使得在框架上进行托管ODP.NET认证成为可能。
本文来源:http://www.oracle.com/technetwork/topics/dotnet/tech-info/odpnet-dotnet-core-sod-3628981.pdf 更新:Beta版发布ODP.NET Core

13
你好2018年! #还在等待 :( - andrecarlucci

5

如果你正在使用.NET Core与Oracle数据库,则需要安装几个NuGet软件包。

  1. Microsoft.EntityFrameworkCore
  2. Oracle.EntityFrameworkCore
  3. Oracle.ManagedADataAccess.Core

然后在启动类的configureServices方法中编写一些代码。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<OracleDbContext>(options=>options.UseOracle(Configuration.GetConnectionString("OracleConnection")));            
}

OracleDbContext类继承自DbContext类,并在appSettings.json文件中设置了OracleConection连接字符串。

OracleDbContext.cs

public class OracleDbContext : DbContext
{
   public OracleDbContext(DbContextOptions options):base(options){}
}

appSettings.json

{
"ConnectionStrings":{
   "OracleConnection":"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS= 
 (PROTOCOL=TCP)(HOST={url of your database})(PORT={port})))(CONNECT_DATA= 
 {name of your database for ex: SID})));User Id={user id};password= 
 {password}:"
 }
}

花括号{}中的值需要替换。当数据库在服务器上而不是本地时,使用此连接字符串。


CONNECT_DATA 需要 SERVICE_NAME。 (CONNECT_DATA = (SERVICE_NAME = {数据库名称} ) ) - Burk

4

在项目中添加appsettings.json文件(输出目录:始终复制)。填写连接字符串:

{
 "ConnectionStrings": {
   "connection-db": "Data Source=192.168.1.3:1521/ORACLEVM;User 
                     Id=userId;Password=123;Validate Connection=true;"
  }
}

在项目中打开Nuget包管理器,添加以下包:

Microsoft.Extensions.Configuration.Json(用于在 .net core 中使用配置管理器)

Oracle.ManagedDataAccess.Core(Oracle数据访问客户端的 .net core 版本)

    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
           .SetBasePath(Directory.GetCurrentDirectory())
           .AddJsonFile("appsettings.json");

        var configuration = builder.Build();
        var connectionString = configuration.GetConnectionString("connection-db");
        using (OracleConnection connection = new OracleConnection(connectionString))
        {
            var command = new OracleCommand("INSERT INTO ..", connection);
            connection.Open();
            command.ExecuteNonQuery();
        }
    }

3

正如其他回答中提到的,Oracle目前尚未发布其Managed Client的包,但计划在今年晚些时候发布。

然而,从.NET Standard 2.0版本开始,System.Data.OracleClient库已经得到更新并可通过NuGet获得。显然,这不是一个理想的解决方案,因为该库已经过时,但它可以给你一些可用的东西——你可以编写一个包装器,在正式的Oracle库发布后将其替换掉。


1
我使用System.Data.OracleClient时遇到了这个错误: 无法加载DLL 'oci': 找不到指定的模块。 (来自HRESULT的异常: 0x8007007E) - andrecarlucci
添加了一条注释,然后意识到我已经有了答案。看起来这需要安装Oracle客户端。在我的Windows机器上(我有一个),它运行良好,但在Linux上(我目前没有)不行。将尝试在那里安装并查看是否可以正常工作。 - Adam
我在我的CentOS机器上安装了最新的Oracle即时客户端并尝试了一遍 - 问题依旧存在。我试着将oci.dll从我的Windows机器复制到Linux上API的根文件夹中(虽然这是一个Windows .dll,但你永远不知道),但这也没有帮助。有人在DotNetCore 2下使用System.Data.OracleCLient在Linux上工作吗? - Adam

2
你需要删除 project.json 中 frameworks 节点下的 "dnxcore50"(这意味着你的项目不再是纯 .net core 应用程序),然后再尝试。据我所知,目前你无法通过 .net core 连接到 Oracle 数据库,但也许查看此链接可以帮助你。

我现在已经删除了它,但正如你所建议的那样,这仍然使我无法连接到Oracle。看起来现在需要使用旧风格的单独API。 - David C

2
基于Oracle .NET团队的消息,他们已经发布了新的beta ODP.NET Core版本;
你也可以在这里找到它。

1

我需要支付吗? - Toolkit
Express Edition不支持.net core: https://www.devart.com/dotconnect/oracle/editions.html - andrecarlucci

0
我们通过设置Oracle链接服务器并使用存储过程从SQL服务器调用Oracle链接服务器来实现这一点。您可以尝试这样做。您可以使用Openquery或Exec .. At [likedserver]使查询在Oracle端执行。

你能给我们举个例子吗? - Nguyễn Xuân Hoàng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接