【问题标题】:How to Retrieve Data from Oracle Database using ML.NET's DatabaseSource Class如何使用 ML.NET 的 DatabaseSource 类从 Oracle 数据库中检索数据
【发布时间】:2020-12-04 22:41:44
【问题描述】:

我在 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 通用安装程序)相矛盾。但是我不确定如何将它与 ML.NET DataBaseSource 一起使用。

【问题讨论】:

    标签: c# oracle ml.net


    【解决方案1】:

    从 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;
    }
    
    

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

    资源

    this Oracle Q&Athis Oracle official doc 中进行一些实验。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-29
      • 2020-07-25
      • 1970-01-01
      • 2021-12-31
      • 2019-05-30
      • 2020-08-03
      • 1970-01-01
      • 2018-09-04
      相关资源
      最近更新 更多