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

Pun*_*ith 9 c# string

我创建了一个包含某些字段的窗体.我试图通过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


Pet*_*ete 8

我遇到了实体框架连接字符串的类似问题。虽然我没有使用,但OdbcConnection我想我会添加对我有用的东西来帮助任何人解决类似的问题。我们创建了一个带有分号的密码。它破坏了我们的实体框架连接字符串。错误是:

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

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

initial catalog=myDB;User     
Id='MyUser';Password='abc;123';multipleactiveresultsets=True;
Run Code Online (Sandbox Code Playgroud)


Sag*_*yay 1

尝试这个连接字符串...

<add name="ConnectionString_T1" connectionString="DSN=CLA_T5;Uid='abc';Pwd='abc;45';" providerName="System.Data.Odbc" />
Run Code Online (Sandbox Code Playgroud)

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