C# 使用 Wallet 连接到 Oracle 数据库
C# connect to Oracle database using Wallet
我正在构建一个连接到多个 Oracle 数据库的应用程序。我连接到我们内部网络上的数据库没有问题,但我需要连接到一个托管在 Oracle 云上的数据库。在 SQL Developer 中,连接是使用 Oracle Wallet 建立的,但我完全不知道如何在 C# 中使用钱包。一个例子将不胜感激。
****编辑
我至少让它可以识别我的 TNS 条目,但是我遇到了一个问题,我无法在这方面取得任何进展。这是我的代码;
using System;
using System.Data;
using System.Data.Common;
using Oracle.ManagedDataAccess.Client;
class GetSchemaSample
{
static void Main(string[] args)
{
string constr = "User Id=/; Data Source=mytns;";
string ProviderName = "Oracle.ManagedDataAccess.Client";
DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName);
using (DbConnection conn = factory.CreateConnection())
{
try
{
conn.ConnectionString = constr;
conn.Open();
DataTable dtSchema = conn.GetSchema();
dtSchema.WriteXml(ProviderName + "_Schema.xml");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
Console.ReadLine();
}
}
}
并将此添加到我的 App.config;
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name="WALLET_LOCATION" value="c:\Oracle" />
<setting name="SQLNET.WALLET_OVERRIDE" value="true" />
</settings>
</version>
</oracle.manageddataaccess.client>
我遇到的错误是;
The path is not of a legal form.
at System.IO.Path.LegacyNormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)
at System.IO.Path.GetFullPathInternal(String path)
at System.IO.Path.GetFullPath(String path)
at System.IO.FileSystemWatcher.StartRaisingEvents()
at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.CreateSEPSFileWatcher(String walletPath, String walletFile)
at OracleInternal.ConnectionPool.OraclePoolManager.InitializeSEPSCredentials()
at OracleInternal.ConnectionPool.OraclePoolManager.Initialize(ConnectionString cs, OracleConnection con)
at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.GetPM(ConnectionString cs, OracleConnection con, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword, Boolean& bAuthenticated, Boolean& newPM)
at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword, OracleConnection connRefForCriteria)
at Oracle.ManagedDataAccess.Client.OracleConnection.Open()
at GetSchemaSample.Main(String[] args) in C:\Users\peter.holliday\source\repos\OACTesting\Connection1.cs:line 39
我已经尝试以我能想到的所有方式更新 app.config WALLET_LOCATION 条目以及钱包中的 sqlnet.ora 文件(我认为这是一个红色鲱鱼 app.config 似乎表示重写),但我无法克服这个错误。即使是指向我如何查看错误中引用的“String walletFile”变量的值的指针也将不胜感激。
这里有examples
托管 Assemby/Driver
- 对于托管组件,您有 2 个选项:
第一个选项:
- 将 Wallet.zip 中的 2 个文件 (sqlnet.ora、tnsnames.ora) 放入您的可执行文件路径 (bin/Debug)
- 编辑 sqlnet.ora 并更改 'DIRECTORY' 变量
WALLET_LOCATION=(SOURCE=(METHOD=file)(METHOD_DATA=(DIRECTORY=<PATH_TO_WALLET_DIRECTORY>)))
第二个选项:
- 将 XML 添加到您的 app.config
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name="TNS_ADMIN" value="PATH_TO_WALLET_DIRECTORY"/>
<setting name="Wallet_Location" value="PATH_TO_WALLET_DIRECTORY"/>
</settings>
</version>
</oracle.manageddataaccess.client>
非托管Assemby/Driver
- 将 Wallet.zip 中的 2 个文件 (sqlnet.ora、tnsnames.ora) 放入您的可执行文件路径 (bin/Debug)
- 编辑 sqlnet.ora 并更改 'DIRECTORY' 变量(与托管驱动程序相同,选项优先)
正在连接到数据库
public static OracleConnection TakeMeToTheClouds()
{
var user = "admin";
var password = "YOUR PASSWORD";
var ds = "THIS YOU FIND IN 'tnsnames.ora' FILE";
var connectionString = $"User Id={user};Password={password};Data Source={ds};";
return new OracleConnection(connectionString);
}
当钱包中使用的别名在 tnsnames.ora
文件中没有匹配条目时,我也遇到过这个问题。
值得检查的是数据源 mytns
确实存在于 tnsnames.ora
中,并且在您的钱包中,条目的名称与 tns 名称匹配,所以在这种情况下 mytns
.
我正在构建一个连接到多个 Oracle 数据库的应用程序。我连接到我们内部网络上的数据库没有问题,但我需要连接到一个托管在 Oracle 云上的数据库。在 SQL Developer 中,连接是使用 Oracle Wallet 建立的,但我完全不知道如何在 C# 中使用钱包。一个例子将不胜感激。
****编辑
我至少让它可以识别我的 TNS 条目,但是我遇到了一个问题,我无法在这方面取得任何进展。这是我的代码;
using System;
using System.Data;
using System.Data.Common;
using Oracle.ManagedDataAccess.Client;
class GetSchemaSample
{
static void Main(string[] args)
{
string constr = "User Id=/; Data Source=mytns;";
string ProviderName = "Oracle.ManagedDataAccess.Client";
DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName);
using (DbConnection conn = factory.CreateConnection())
{
try
{
conn.ConnectionString = constr;
conn.Open();
DataTable dtSchema = conn.GetSchema();
dtSchema.WriteXml(ProviderName + "_Schema.xml");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
Console.ReadLine();
}
}
}
并将此添加到我的 App.config;
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name="WALLET_LOCATION" value="c:\Oracle" />
<setting name="SQLNET.WALLET_OVERRIDE" value="true" />
</settings>
</version>
</oracle.manageddataaccess.client>
我遇到的错误是;
The path is not of a legal form.
at System.IO.Path.LegacyNormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)
at System.IO.Path.GetFullPathInternal(String path)
at System.IO.Path.GetFullPath(String path)
at System.IO.FileSystemWatcher.StartRaisingEvents()
at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.CreateSEPSFileWatcher(String walletPath, String walletFile)
at OracleInternal.ConnectionPool.OraclePoolManager.InitializeSEPSCredentials()
at OracleInternal.ConnectionPool.OraclePoolManager.Initialize(ConnectionString cs, OracleConnection con)
at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.GetPM(ConnectionString cs, OracleConnection con, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword, Boolean& bAuthenticated, Boolean& newPM)
at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword, OracleConnection connRefForCriteria)
at Oracle.ManagedDataAccess.Client.OracleConnection.Open()
at GetSchemaSample.Main(String[] args) in C:\Users\peter.holliday\source\repos\OACTesting\Connection1.cs:line 39
我已经尝试以我能想到的所有方式更新 app.config WALLET_LOCATION 条目以及钱包中的 sqlnet.ora 文件(我认为这是一个红色鲱鱼 app.config 似乎表示重写),但我无法克服这个错误。即使是指向我如何查看错误中引用的“String walletFile”变量的值的指针也将不胜感激。
这里有examples
托管 Assemby/Driver
- 对于托管组件,您有 2 个选项:
第一个选项:
- 将 Wallet.zip 中的 2 个文件 (sqlnet.ora、tnsnames.ora) 放入您的可执行文件路径 (bin/Debug)
- 编辑 sqlnet.ora 并更改 'DIRECTORY' 变量
WALLET_LOCATION=(SOURCE=(METHOD=file)(METHOD_DATA=(DIRECTORY=<PATH_TO_WALLET_DIRECTORY>)))
第二个选项:
- 将 XML 添加到您的 app.config
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name="TNS_ADMIN" value="PATH_TO_WALLET_DIRECTORY"/>
<setting name="Wallet_Location" value="PATH_TO_WALLET_DIRECTORY"/>
</settings>
</version>
</oracle.manageddataaccess.client>
非托管Assemby/Driver
- 将 Wallet.zip 中的 2 个文件 (sqlnet.ora、tnsnames.ora) 放入您的可执行文件路径 (bin/Debug)
- 编辑 sqlnet.ora 并更改 'DIRECTORY' 变量(与托管驱动程序相同,选项优先)
正在连接到数据库
public static OracleConnection TakeMeToTheClouds()
{
var user = "admin";
var password = "YOUR PASSWORD";
var ds = "THIS YOU FIND IN 'tnsnames.ora' FILE";
var connectionString = $"User Id={user};Password={password};Data Source={ds};";
return new OracleConnection(connectionString);
}
当钱包中使用的别名在 tnsnames.ora
文件中没有匹配条目时,我也遇到过这个问题。
值得检查的是数据源 mytns
确实存在于 tnsnames.ora
中,并且在您的钱包中,条目的名称与 tns 名称匹配,所以在这种情况下 mytns
.