我创建了一个包含某些字段的窗体.我试图通过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#代码中.
下面是我的连接字符串.
<add name="ConnectionString_T1" connectionString="DSN=CLA_T5;Uid=abc;Pwd=abc;45" providerName="System.Data.Odbc" />
OdbcConnection connection = new OdbcConnection(connection_string);
Run Code Online (Sandbox Code Playgroud)
PS:我尝试将此密码用双引号/单引号/".但没有用.仍然面临这个错误.我已经尝试将所有转义序列放在",双引号,单引号,/"等.
Dav*_*ugh 11
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}"
,将由abc;}45}
ODBC引擎读取.
这似乎是完全无证的,尽管有几个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}");
}
Run Code Online (Sandbox Code Playgroud)
哪里SomeDriver
有用户user
密码abc;}45
我遇到了实体框架连接字符串的类似问题。虽然我没有使用,但OdbcConnection
我想我会添加对我有用的东西来帮助任何人解决类似的问题。我们创建了一个带有分号的密码。它破坏了我们的实体框架连接字符串。错误是:
'不支持关键字:'[分号后的剩余密码];multipleactiveresultsets'。
我通过在用户名和密码字段周围放置单引号 (') 解决了该问题。结果是一个包含以下内容的连接字符串:
initial catalog=myDB;User
Id='MyUser';Password='abc;123';multipleactiveresultsets=True;
Run Code Online (Sandbox Code Playgroud)
尝试这个连接字符串...
<add name="ConnectionString_T1" connectionString="DSN=CLA_T5;Uid='abc';Pwd='abc;45';" providerName="System.Data.Odbc" />
Run Code Online (Sandbox Code Playgroud)
我正在使用相同类型的棘手密码并以这种方式解决这个问题......