如何使用 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 中,还有一些实验。
我在 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 中,还有一些实验。