C#使用电子钱包连接到Oracle数据库

C#使用电子钱包连接到Oracle数据库,c#,.net,oracle-wallet,C#,.net,Oracle Wallet,我正在构建一个连接到多个Oracle数据库的应用程序。连接到我们内部网络上的数据库没有问题,但我需要连接到Oracle云上托管的数据库。在SQL Developer中,连接是使用Oracle钱包实现的,但我确实不知道如何在C#中使用钱包。请举个例子 ****编辑 我至少能够识别我的TNS条目,但我遇到了一个我无法取得进展的问题。这是我的密码 using System; using System.Data; using System.Data.Common; using Oracle.Manage

我正在构建一个连接到多个Oracle数据库的应用程序。连接到我们内部网络上的数据库没有问题,但我需要连接到Oracle云上托管的数据库。在SQL Developer中,连接是使用Oracle钱包实现的,但我确实不知道如何在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>
我尝试过用我能想到的任何方法更新app.config WALLET_位置条目,以及钱包中的sqlnet.ora文件(我认为这是一个危险的问题,因为app.config似乎表示要覆盖它),但我无法克服这个错误。即使是一个指向如何查看错误中所指的“String walletFile”变量值的指针,我也会非常感激。

这里有


托管组件/驱动程序
  • 使用托管assemby,您有2个选项:
  • 第一种选择:

    • 将两个文件(sqlnet.ora、tnsnames.ora)从Wallet.zip放入可执行路径(bin/Debug)
    • 编辑sqlnet.ora并更改“DIRECTORY”变量
    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
    
    WALLET_LOCATION=(SOURCE=(METHOD=file)(METHOD_DATA=(DIRECTORY=<PATH_TO_WALLET_DIRECTORY>)))
    
    <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>
    
    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);
    }