Escape;(分号)在app.config文件中的odbc连接字符串中

我创建了一个包含某些字段的窗体。 我试图通过ODBC DSN连接与oracle数据库进行交互。

我在app.config中的以下连接字符串中遇到问题。

在连接字符串中,密码包含分号(此处为abc; 45)。 我收到一个错误:

"Format of the initialization string does not conform to specification starting at index 35"

而我正在尝试使用访问此连接字符串

OdbcConnection connection = new OdbcConnection(connection_string);

在C#代码中。

下面是我的连接字符串。

  OdbcConnection connection = new OdbcConnection(connection_string); 

PS:我尝试将此密码用双引号/单引号/“。但没有用。仍然面临这个错误。我已经尝试过所有的转义序列,如”,双引号,单引号,/“等。

Rikitikitik部分正确的做法是通过用{}包围值来逃避ODBC连接字符串中的[]{(),;?*=!@字符,但是错过了一个微妙但非常重要的ODBC连接字符串转义规则关于逃避}

PASS CASE: connectionString="DSN=CLA_T5;Uid=abc;Pwd={abc;45}"

正确地工作以逃避; ,但密码为时会失败

FAIL CASE: connectionString="DSN=CLA_T5;Uid=abc;Pwd={abc;}45}"

因为第一个}字符被解释为转义对的右括号,而不是第二个(正确的) }

要纠正这个问题,你必须手动转义} }

PASS CASE: connectionString="DSN=CLA_T5;Uid=abc;Pwd={abc;}}45}" ,它将被ODBC引擎读取为abc;}45}

尽管有几个MSDN消息来源概述了逃避Rikitikitik提及的封闭式消息,但这似乎完全没有记录。

文档未提及内部}转义方法:

但是,使用快速.net测试工具可以清楚地观察到内部}转义方法:

 OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder builder.Driver = "{SomeDriver}" builder.Add("UID", "user"); builder.Add("PWD", "abc;}45"); MessageBox.Show(builder.ConnectionString) // observe PWD's escaped value of "{abc;}}45}" try { using (OdbcConnection conn = new OdbcConnection(builder.ConnectionString)) { // MessageBox.Show("SUCCEEDED"); } } catch (Exception ex) { MessageBox.Show($"{ResourceManager.GetString("FAILED: ")} {ex.Message}"); } 

其中SomeDriver的用户user密码为abc;}45

显然,在使用分号,等号等转义连接字符串值时,ODBC是特殊的。根据这一点 ,您应该在花括号{}中包含带有特殊字符的值。

 connectionString="DSN=CLA_T5;Uid=abc;Pwd={abc;45}" 

试试这个连接字符串……

  

我使用相同类型的棘手密码,并以这种方式解决这个问题….

我遇到了与entity framework连接字符串类似的问题。 虽然我没有使用OdbcConnection我想我会添加对我来说OdbcConnection东西来帮助任何有类似问题的人。 我们有一个用分号创建的密码。 它打破了我们的entity framework连接字符串。 错误是:

‘不支持关键字:'[分号后的其余密码]; multipleactiveresultsets’。’

我通过在用户名和密码字段周围放置单引号(’)来解决问题。 结果是包含以下内容的连接字符串:

 initial catalog=myDB;User Id='MyUser';Password='abc;123';multipleactiveresultsets=True; 

尝试以下方法之一:

   

请以此为出发点,而不是复制粘贴解决方案