微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 LDAP/OID 连接字符串通过 C# 连接到 Oracle

如何解决如何使用 LDAP/OID 连接字符串通过 C# 连接到 Oracle

关于使用 C#.NET 连接到 Oracle 数据库我有两个问题。

我的程序在我的 Oracle 19c 客户端 64 位文件夹中引用了 Oracle.DataAccess.dll(版本 2.122.19.1)。

我有一个 using 语句:

使用 Oracle.DataAccess.Client;

和此连接代码

string connectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=myserver.sys.mycompany.com)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=mydb.mycompany.com)));User Id=MyLanId;Password=MyPasswors;Validate Connection=True;"

using (OracleConnection connection = new OracleConnection(connectionString))
{
    connection.open();
}

问题 1:

如何创建不指定数据库名称而是查询 LDAP 以获取硬编码在上述无 TNS 连接字符串中的详细服务器/端口信息的 OID 连接字符串?

例如,在 Java 程序中,我们是这样连接的。

base.oracle.db.url=jdbc:oracle:thin:@ldap://oid.gtm.internal.mycompany.com:3060/dbname,cn=OracleContext,dc=mycompany,dc=com

.NET 等价物是什么?

问题编号 2:

当我编译我的 C# 程序时,我选择了“任何 cpu”,但我的程序仅在我引用 64 位 Oracle.DataAccess.dll 时才有效。这是因为我的 PATH 变量在我的 32 位文件夹之前提到了我的 64 位 oracle 客户端文件夹(我有两个)?现在,我的 PATH 变量远远超过了 2048 的最大长度,我无法在不缩短它的情况下更改它,而且我不确定要删除什么。

解决方法

我找到了这篇 SO 帖子,

How do I query LDAP from C# to resolve Oracle TNS hostname while using managed ODP.NET?

除了传入指向 LDAP 服务器的连接字符串之外,我还可以执行 LDAP 查询来获取数据库描述符以构建连接字符串。

这是一个 2 步过程,因此我可能希望在构建连接字符串后对其进行缓存。当我完成连接池和“关闭”连接时,我通常依靠它们,但这两个步骤的过程似乎我必须手动添加一些连接字符串的缓存以避免多次访问 LDAP 的开销。

有更好的方法吗?

    string directoryServer = "oid.gtm.internal.mycompany.com:3060";
    string defaultAdminContext = "cn=OracleContext,dc=mycompany,dc=com";
    string serviceName = "mydb";
    string userId = "mylanid";
    string password = "mypwd";

    using (IDbConnection connection = GetConnection(directoryServer,defaultAdminContext,serviceName,userId,password))
    {
        connection.Open();

        connection.Close();
    }
    
private static IDbConnection GetConnection(string directoryServer,string defaultAdminContext,string serviceName,string userId,string password)
{
    string descriptor = ConnectionDescriptor(directoryServer,serviceName);
    // Connect to Oracle
    string connectionString = $"user id={userId};password={password};data source={descriptor}";
    OracleConnection con = new OracleConnection(connectionString);
    return con;
}

private static string ConnectionDescriptor(string directoryServer,string serviceName)
{
    string ldapAdress = $"LDAP://{directoryServer}/{defaultAdminContext}";
    string query = $"(&(objectclass=orclNetService)(cn={serviceName}))";
    string orclnetdescstring = "orclnetdescstring";

    DirectoryEntry directoryEntry = new DirectoryEntry(ldapAdress,null,AuthenticationTypes.Anonymous);
    DirectorySearcher directorySearcher = new DirectorySearcher(directoryEntry,query,new[] { orclnetdescstring },SearchScope.Subtree);

    SearchResult searchResult = directorySearcher.FindOne();
    byte[] value = searchResult.Properties[orclnetdescstring][0] as byte[];

    if (value != null)
    {
        string descriptor = Encoding.Default.GetString(value);
        return descriptor;
    }

    throw new Exception("Error querying LDAP");
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?