我创建了一个包含某些字段的窗体。我正在尝试通过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;等。
答案 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="abc;45"" providerName="System.Data.Odbc" />
请以此为出发点,而不是复制粘贴解决方案