Rikitikitik is partly correct about escaping []{(),;?*=!@
characters in an ODBC Connection String by surrounding the value with {}
, but misses a subtle but extremely important ODBC Connection String escape rule that is NOT documented by Microsoft about escaping }
.
PASS CASE: connectionString="DSN=CLA_T5;Uid=abc;Pwd={abc;45}"
Works correctly to escape the ;
, but will fail when the password is
FAIL CASE: connectionString="DSN=CLA_T5;Uid=abc;Pwd={abc;}45}"
Because the first }
character is interpreted as the closing brace of the escape pair, rather than the second (correct) }
.
To correct for this, you have to manually escape the }
with a second }
PASS CASE: connectionString="DSN=CLA_T5;Uid=abc;Pwd={abc;}}45}"
, which will be read as abc;}45}
by the ODBC engine.
This appears to be a totally undocumented, despite several MSDN sources outlining the enclosing {}
escaping Rikitikitik mentions.
Documentation failing to mention the interior }
escape method:
However, the interior }
escape method is clearly observable with a quick .net test harness:
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}");
}
where SomeDriver
has a user user
with password abc;}45
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…