如何从 .Net Core 连接到 Oracle 数据库连接
Posted
技术标签:
【中文标题】如何从 .Net Core 连接到 Oracle 数据库连接【英文标题】:How to connect to an Oracle database Connection from .Net Core 【发布时间】:2017-05-18 11:55:26 【问题描述】:在 .netCore 库中,我想连接到 Oracle 数据库。有什么办法可以做到吗?
我已经尝试了another SO post 上的建议,但它不起作用,也许从那以后被删除了?正如您在我的 project.json 中看到的,我正在尝试使用“net461”。
我目前正在尝试通过老式 ADO.Net 使用 Oracle.ManagedDataAccess.Client。我也知道甲骨文还没有买下 .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,我正在努力导入。
我不拘泥于任何特定的做法,我只是想要目前最好的合理选择。
【问题讨论】:
【参考方案1】:2018 年 1 月由 Oracle 发布的测试版 .Net Core Managed 驱动程序 http://www.oracle.com/technetwork/topics/dotnet/downloads/net-downloads-160392.html。 文档中支持的平台提及现在是 Win 和 Linux。
Nuget:https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core
具有标准/即时 Oracle 客户端的其他旧替代方案:
.Net Core 2.0 我推荐使用ericmend oracleClientCore-2.0 : https://github.com/ericmend/oracleClientCore-2.0。 Nuget:dotNetCore.Data.OracleClient我在Win和Linux平台上使用成功。有我的small sample 或者 System.Data.OracleClient 也适用于 2.0 - 请参阅 @Owen 帖子。但我只在Win平台测试过 .Net Core >= 1.0 你可以使用非官方的LinqDan .NET Core 的Oracle 客户端,基于Mono 的Oracle 客户端https://github.com/LinqDan/oracleclientcore Nuget:Mono.Data.OracleClientCore。我的 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>
我的程序.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();
【讨论】:
我在使用单声道版本时收到此错误:无法加载 DLL 'oci':找不到指定的模块。 (HRESULT 异常:0x8007007E) • 必须设置 Oracle 客户端的路径。 • 必须使用与.Net Core 相同版本的32 位/64 位Oracle 客户端 • 对于Linux,必须使用nuget 包Mono.Data.OracleClientCore.Linux 哦,我以为我可以像在托管版本中那样摆脱 Oracle 客户端。好难过。谢谢。 刚刚测试了 beta .Net Core Managed 驱动程序(在 Windows 上),目前运行良好,等不及正式发布了!【参考方案2】:Oracle 在 nuget 上发布了official Data Provider for .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 我刚刚编辑了我的答案以添加一个可以帮助您开始的基本示例。 感谢您的回复。哪些文件需要编辑? Startup.cs 还是 Program.cs? @Fairuz Sulaiman 实际上,您可以在 ASP.NET Core 应用程序的任何部分使用此代码。但是,如果您愿意,您可以在 Startup.cs 中添加一个服务,该服务使用 Execute() 等公共函数实例化一个类。因此,在您可以在应用程序的任何文件中使用依赖注入来注入您的类实例之后,该实例可用于执行所有数据库查询。【参考方案3】:Oracle 计划在 2017 日历年年底左右对 Microsoft .NET Core 上的托管驱动程序 ODP.NET 进行认证。 Oracle 打算在 Windows 操作系统和 Oracle Linux 上的 .NET Core 上支持托管 ODP.NET。 托管 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
更新:测试版发布ODP.NET Core
【讨论】:
您好 2018! #还在等待 :(【参考方案4】:正如其他答案中提到的,Oracle 尚未为其托管客户端发布软件包,但计划在今年晚些时候发布。
但是,从 .NET Standard 2.0 版本开始,System.Data.OracleClient 库已更新(可通过 NuGet 获得)。显然这不是一个理想的解决方案,因为该库已过时,但它确实为您提供了一些可以使用的东西 - 您可以编写一个包装器并在发布时将其换成官方 Oracle 库。
【讨论】:
我使用 System.Data.OracleClient 收到此错误:无法加载 DLL 'oci':找不到指定的模块。 (HRESULT 异常:0x8007007E) 添加了评论,然后意识到我有答案。看来这需要安装一个 oracle 客户端。在我的 Windows 机器(我有一台)上运行良好,但在 linux(我目前没有)上运行良好。将尝试在那里安装,看看它是否可以工作 好吧,我在我的 CentOS 机器上安装了最新的 Oracle 即时客户端并再次尝试 - 同样的问题。尝试将 oci.dll 从我的 windows 机器复制到 linux 上 API 的根文件夹中(没有太大希望,因为它是 windows .dll,但你永远不知道)但这也无济于事。有没有人让 System.Data.OracleCLient 在 Linux 下使用 DotNetCore 2 工作?【参考方案5】:您应该从 frameworks 节点下的 project.json 中删除“dnxcore50”(这意味着您的项目不再是纯 .net 核心应用程序),然后重试。据我所知,您无法通过 .net core 现在连接到 oracle,也许检查 this link 会有所帮助
【讨论】:
我现在已将其删除,但正如您所建议的,它仍然使我无法连接到 Oracle。现在看起来像一个单独的 API,使用旧样式。【参考方案6】:基于Oracle .NET team他们发布了新的测试版ODP.NET Core;
你也可以找到here
【讨论】:
【参考方案7】:将 appsettings.json 添加到项目(输出目录:始终复制)。填写连接字符串:
"ConnectionStrings":
"connection-db": "Data Source=192.168.1.3:1521/ORACLEVM;User
Id=userId;Password=123;Validate Connection=true;"
在项目中打开 Manage Nuget Packages,添加这些包:
Microsoft.Extensions.Configuration.Json(在 .net core 中使用配置管理器)
Oracle.ManagedDataAccess.Core(.net核心版oracle数据访问客户端)
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();
【讨论】:
【参考方案8】:如果您使用带有 .NET 核心的 oracle 数据库,则需要安装几个 nuget 包。
-
Microsoft.EntityFrameworkCore
Oracle.EntityFrameworkCore
Oracle.ManagedADataAccess.Core
这之后需要在启动类的configureServices方法中写一些代码。
public void ConfigureServices(IServiceCollection services)
services.AddDbContext<OracleDbContext>(options=>options.UseOracle(Configuration.GetConnectionString("OracleConnection")));
OracleDbContext 类继承自 DbContext 类,OracleConection 连接字符串在 appSettings.json 文件中设置。
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 = database name))【参考方案9】:终于 devart 的 dotConnect for Oracle 支持 .net 核心,因为版本“9.4.280”。
【讨论】:
我需要付费吗? Express版不支持.net核心:devart.com/dotconnect/oracle/editions.html【参考方案10】:我们通过设置一个 oracle 链接服务器并使用存储过程从 SQL 服务器调用 Oracle 链接服务器来实现这一点。你可以试试。您可以使用 Openquery 或 Exec .. At [likedserver] 使查询在 Oracle 端执行。
【讨论】:
你能给我们举个例子吗?以上是关于如何从 .Net Core 连接到 Oracle 数据库连接的主要内容,如果未能解决你的问题,请参考以下文章
如何从 AWS Lambda .Net Core 应用程序 API 连接到 AWS RDS SQL Server?
如何从 asp.net core webapi 获取数据到连接到数据库的 angular 11.0.0。我试图这样做,但它返回空记录
从 ASP.NET Core 连接到 SQL Server 的最佳实践?