使用Oracle.ManagedDataAccess连接到Oracle

Khu*_*eed 16 .net c# oracle odp.net

我在我的C#(.NET 4.0)项目中使用Oracle.ManagedDataAccess Nuget Package Version 12.1.022.该程序包会自动在app.config文件中创建条目.如何从此文件中读取数据源字符串以便能够连接到数据库?

System.Configuration.ConfigurationManager.AppSettings.Get( "数据源");

不适合我

<?xml version="1.0" encoding="utf-8"?>

<configuration>
  <configSections>
    <section name="oracle.manageddataaccess.client"
             type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </configSections>
  <system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.ManagedDataAccess.Client" />
      <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client"
           description="Oracle Data Provider for .NET, Managed Driver"
           type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <publisherPolicy apply="no" />
        <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
        <bindingRedirect oldVersion="4.121.0.0 - 4.65535.65535.65535" newVersion="4.121.2.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

  <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="MyDataSource"
                    descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=100.100.100.100)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=myservice.com)))" />
      </dataSources>
    </version>
  </oracle.manageddataaccess.client>
</configuration>
Run Code Online (Sandbox Code Playgroud)

b_l*_*itt 16

通常,您将引用标准连接字符串中的别名:

  <connectionStrings>
    <add name="MyConnection" connectionString="Data Source=MyDataSource;User Id=scott;Password=tiger;"/>
  </connectionStrings>
Run Code Online (Sandbox Code Playgroud)

然后你将使用标准方法来检索字符串:

ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString;
Run Code Online (Sandbox Code Playgroud)

另请注意,数据源部分是可选的.您可以将描述符直接嵌入连接字符串中:

  <connectionStrings>
    <add name="MyConnection" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=100.100.100.100)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=myservice.com)));User Id=scott;Password=tiger;"/>
  </connectionStrings>
Run Code Online (Sandbox Code Playgroud)

您还可以在tnsnames.ora文件中引用别名.默认情况下,驱动程序在exe文件夹中查找tnsnames.ora,在TNS_ADMIN环境变量中指定目录,或者在TNS_ADMIN配置变量中查找:

http://docs.oracle.com/cd/E48297_01/doc/win.121/e41125/featConfig.htm#autoId6 http://docs.oracle.com/cd/E48297_01/doc/win.121/e41125/featConfig的.htm#autoId7

  • 非常感谢.这是我见过的关于所有部件如何组合在一起的最佳解释.数据源部分解决了我的问题,因为人们比我更聪明地盯着我的电脑,无处可去. (2认同)

Ser*_*dez 5

您可以在连接字符串中引用已定义的数据源

<oracle.manageddataaccess.client>
    <version number="*">
        <dataSources>
            <dataSource alias="MyDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=100.100.100.100)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=myservice.com)))" />
        </dataSources>
    </version>
</oracle.manageddataaccess.client>
Run Code Online (Sandbox Code Playgroud)

例如,在这个特定情况下:

public class OracleDBManager
{
    private OracleConnection _con;
    private const string connectionString = "User Id={0};Password={1};Data Source=MyDataSource;";
    private const string OracleDBUser = "exampleUser";
    private const string OracleDBPassword = "examplePassword";

    public OracleDBManager()
    {
        InitializeDBConnection();
    }

    ~OracleDBManager()
    {
        if (_con != null)
        {
            _con.Close();
            _con.Dispose();
            _con = null;
        }
    }

    private void InitializeDBConnection()
    {
            _con = new OracleConnection();
            _con.ConnectionString = string.Format(connectionString, OracleDBUser, OracleDBPassword);
            _con.Open();
    }
}
Run Code Online (Sandbox Code Playgroud)