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提及的封闭式消息,但这似乎完全没有记录。
文档未提及内部}
转义方法:
- https://msdn.microsoft.com/en-us/library/system.data.odbc.odbcconnection.connectionstring(v=vs.110).aspx
- https://msdn.microsoft.com/en-us/library/ms130822.aspx
但是,使用快速.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;
尝试以下方法之一:
请以此为出发点,而不是复制粘贴解决方案