如何区分连接字符串中的服务名称和连接描述符?
Posted
技术标签:
【中文标题】如何区分连接字符串中的服务名称和连接描述符?【英文标题】:How do I distinguish between a service name and a connect descriptor in a connection string? 【发布时间】:2013-01-13 07:17:03 【问题描述】:希望这对于 Oracle 团队来说应该是一件容易的事。
因此,除了我之前的Question,我现在需要能够在 C# 中处理连接字符串并决定是否对“数据源”值(如果它是服务名称)执行 LDAP 查找,或者只是按原样(连接描述符)。这样做的最佳和最权威方法是什么?我不想做空洞的事情,比如检查第一个字符是否是一个左括号。我正在寻找特定的模式/签名来识别“数据源”是服务名称还是连接描述符。
例如(如获得here),带有一个服务名称,它可能是这样的:
数据源=TORCL;用户ID=myUsername;密码=myPassword;
使用连接描述符,它可能是这样的:
数据源=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));用户ID =我的用户名; 密码=我的密码;
谢谢。
【问题讨论】:
这些连接字符串是您的 web.config(或 app.config)的一部分,对吧?如果您的公司使用 ldap 代替 tnsnames,我假设您只需查找所需的每个(选项 1) 当然,但我的 .config 可以在特殊情况下显式指定连接描述符,我只想编写代码以便处理这种情况。 但是你控制了那个配置,所以你知道你指定了完整的连接字符串,不是吗? 没有。不必要。什么连接字符串可能被传递到我的通用函数中的知识是无关紧要的。我无法编写满足已知服务名称和连接包含某些字符串的描述符的代码。我需要一个通用规则来区分服务名称和连接描述符,无论它来自何处。 .config 可能会在我的脚下发生变化 - 我不希望其他地方的代码因此而中断。 【参考方案1】:在没有答案的情况下,我设计了自己的解决方案,它并不复杂,并且我假设连接描述符将始终包含“DESCRIPTION”。如果这个假设是正确的,那么解决方案就是正确的。如果没有,请随时提出您自己的建议...
string dataSource = connectionString.Split(';').Select(x => x.Split('=')).Single(x => x.First() == "Data Source").Last();
bool isConnectDescriptor = dataSource.IndexOf("DESCRIPTION", StringComparison.OrdinalIgnoreCase) >= 0;
【讨论】:
以上是关于如何区分连接字符串中的服务名称和连接描述符?的主要内容,如果未能解决你的问题,请参考以下文章
R SQL Server ODBC连接在服务器名称中转义字符
oracle连接“监听程序当前无法识别连接描述符中请求的服务’怎么解决