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

时间:2014-03-14 07:01:13

标签: 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);

PS:我尝试将此密码用双引号/单引号/&#34; 。但没用。仍然面临这个错误。我试过把所有的转义序列放在&#34;,双引号,单引号,/&#34;等。

6 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

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

  

&#39;不支持关键字:&#39; [分号后的其余密码]; multipleactiveresultsets&#39;。&#39;

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

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

答案 3 :(得分:1)

尝试此连接字符串...

<add name="ConnectionString_T1" connectionString="DSN=CLA_T5;Uid='abc';Pwd='abc;45';" providerName="System.Data.Odbc" />

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

答案 4 :(得分:0)

我遇到了完全相同的问题,并且基于 Microsoft 文档 https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnection.connectionstring?redirectedfrom=MSDN&view=dotnet-plat-ext-5.0#System_Data_SqlClient_SqlConnection_ConnectionString 我使用了双引号(不起作用),然后密码周围的单引号起作用了。类似的东西:

var connectionString = "Data Source={datasource};Initial Catalog={InitialCatalog};User Id={LocalUserId};Password='{LocalPassword}';

LocalPassword 和 LocalUserId 只是类成员。

答案 5 :(得分:-1)

尝试以下方法之一:

<add name="ConnectionString_T1" connectionString="DSN=CLA_T5;Uid=abc;Pwd='abc;45'" providerName="System.Data.Odbc" />

<add name="ConnectionString_T1" connectionString="DSN=CLA_T5;Uid=abc;Pwd=&quot;abc;45&quot;" providerName="System.Data.Odbc" />
  

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