如何使用 ML.NET 的 DatabaseSource Class 从 Oracle 数据库中检索数据

How to Retrieve Data from Oracle Database using ML.NET's DatabaseSource Class

我在 Oracle 中有一个数据集市,我正在尝试通过 ML.NET 的 DatabaseSource 连接器连接。 documentation 中的示例展示了如何像这样连接到 SQL 数据库:

string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=<YOUR-DB-FILEPATH>;Database=<YOUR-DB-NAME>;Integrated Security=True;Connect Timeout=30";

string sqlCommand = "SELECT Size, CAST(NumBed as REAL) as NumBed, Price FROM House";

DatabaseSource dbSource = new DatabaseSource(SqlClientFactory.Instance, connectionString, sqlCommand);

但是,连接到 Oracle 似乎并不那么简单。 Oracle 的 docs 指示我需要获取 Oracle.DataAccess.dll 然后我需要加载 DbProviderFactory,如:

var factory = DbProviderFactories.GetFactory("My Invariant Name");
DatabaseSource dbSource = new DatabaseSource(factory, connectionString, sqlCommand);

我试过了,但是 (1) 按照文档中的指示安装 Oracle Universal Installer 之后,以及 (2) 尝试加载 DbProviderFactory 我收到一条错误消息,指出“指定的不变名称 'Oracle.DataAccess.dll'未在已注册的 .NET 数据提供程序列表中找到。"

当似乎有各种官方 Oracle NuGet 包时,整个方法感觉不必要地复杂,这与我正在阅读的文档(使用 Oracle Universal Installer)相矛盾。但是我不确定如何将它与 ML.NET DataBaseSource.

一起使用

从 Oracle 下载 NuGet 包 Oracle.ManagedDataAccess.Core。我的示例用法如下。

using Microsoft.ML;
using Microsoft.ML.Data;
using System.Data.Common;
using Oracle.ManagedDataAccess.Client;

public static IDataView LoadDataFromDataMart(MLContext mlContext)
{
    var databaseloader = mlContext.Data.CreateDatabaseLoader<MyLoaderType>();

    string connectionString = $"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST = 
        hostname_here)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = service_name_here)));User 
        ID=user_id_here;Password=password_here";

    string sqlCommand = "Select * from Table";
    DatabaseSource dbSource = new DatabaseSource(new OracleClientFactory(), connectionString, 
    sqlCommand);
    IDataView dataview = databaseloader.Load(dbSource);
    return dataview;
}

答案最终非常简单,但由于网络上的一些过时信息,我花了比应该的时间更长的时间来弄清楚,所以我认为值得 post 答案在这里。

资源

this Oracle Q&A and this Oracle official doc 中,还有一些实验。