在 web.config 的连接字符串中如何转义引号

98

我在 web config 中有一个连接字符串:

<add name="MyConString" connectionString="Server=dbsrv;User ID=myDbUser;Password=somepass"word" providerName="System.Data.SqlClient" />

如您所见,密码中有引号(")(由其他部门提供,我无法更改此数据库用户的密码)。

在此连接字符串中,我该如何转义引号?

顺便说一句:我已尝试在字符串中使用&quot;。那样行不通——ado.net会抛出ArgumentException:"初始化字符串的格式不符合从索引57开始的规范。"57是我的连接字符串中&quot;的位置。我还尝试将密码部分用单引号括起来-也不起作用。

还尝试了""和\"-网站配置文件无法解析。

感谢您的解决方案:

我必须同时转义双引号并将密码放在单引号中:

<add name="MyConString" connectionString="Server=dbsrv;User ID=myDbUser;Password='somepass&quot;word'" providerName="System.Data.SqlClient" />
5个回答

117

使用&quot;而不是"进行转义。

web.config是一个XML文件,因此您应该使用XML转义。

connectionString="Server=dbsrv;User ID=myDbUser;Password=somepass&quot;word"

参见论坛帖子。

更新:

&quot;应该可以正常工作,但是由于它不能,您是否尝试过其他.NET的字符串转义序列?\"""

更新2:

尝试使用单引号来设置connectionString:

connectionString='Server=dbsrv;User ID=myDbUser;Password=somepass"word'

或者:

connectionString='Server=dbsrv;User ID=myDbUser;Password=somepass&quot;word'

更新3:

根据MSDN(SqlConnection.ConnectionString 属性)的说明:

如果要包括分号、单引号或双引号字符,值必须用双引号括起来。 如果该值既包含分号又包含双引号字符,则该值可以用单引号括起来。

因此:

connectionString="Server=dbsrv;User ID=myDbUser;Password='somepass&quot;word'"
问题不在于web.config,而是连接字符串的格式。在连接字符串中,如果一个键值对中的值包含 " 字符,那么需要用 ' 将其括起来。因此,Password=somepass"word 是无效的,而Password='somepass"word' 是有效的。

这个不起作用。如果它是在普通的XML中,显然会起作用,但在属性值中不会。 - Sebastian P.R. Gingter
@Sebastian P.R. Gingter - 奇怪的是这个不起作用。你尝试过其他转义序列吗? - Oded
是的。当使用 "" 和 " 时,整个 Web.config 文件无法解析。 & quot; 在字符串内部不会被替换为 ",导致查询字符串无法解析,从而产生了上述错误。如果这么简单,我就不会在这里问了;-) - Sebastian P.R. Gingter
1
@Sebastian P.R. Gingter - 在这里的人们不知道你尝试过什么和你知道什么。你需要在问题中包含这些细节(正如你现在所做的)。 - Oded
我的密码(在连接字符串中)有两个双引号。无法正常工作。我更改了我的密码。只有一个双引号的密码可以正常工作。我还尝试了双重编码,但它没有起作用。 - Jo Smo
显示剩余5条评论

75
connectionString="Server=dbsrv;User ID=myDbUser;Password=somepass&quot;word"

由于web.config是XML文件,您需要转义五个特殊字符:

&amp; -> & 和号,U+0026
&lt; -> < 左尖括号,小于号,U+003C
&gt; -> > 右尖括号,大于号,U+003E
&quot; -> " 引号,U+0022
&apos; -> ' 单引号,U+0027

+不是问题,我想。


Duc Filan补充说: 您还应该使用单引号'将密码括起来:

connectionString="Server=dbsrv;User ID=myDbUser;Password='somepass&quot;word'"

对我来说,问题出在存储在web.config中的密码中的&符号。这很明显,但同时也很难追踪。当web.config中存在此情况时,Azure网站会给出一个错误提示:“由于发生内部服务器错误,无法显示页面。”它似乎也没有将任何内容写入错误日志中。感谢原帖提问者和您的提醒。 - Timothy Lee Russell
方括号怎么办?([]) - Dzianis Yafimau
分号 ; 字符? - Kiquenet
@Kiquenet 分号字符不是问题。 - Rob Farquharson
@DzianisYafimau 方括号不是问题 - Rob Farquharson

2
如果 &quot; 无法正常工作,请尝试使用 &#34;

and字符的转义符为&,而&字符的转义符为&。 - Kiquenet

1

Odeds的回答几乎完整了。只有一件事需要补充。

  1. 像Emanuele Greco所说,转义xml特殊字符。
  2. 像Oded所说,将密码用单引号括起来。
  3. (这是新的) 用另一个单引号转义单引号 (ref)

如果密码为"';,那么这应该是一个有效的连接字符串:

connectionString='Server=dbsrv;User ID=myDbUser;Password='&quot;&amp;&amp;;'

我认为你的意思是 password=''''; 是有效的。但是你的建议是唯一有效的。这实际上也用于其他转义方案中。 - Bluebaron

0

使用&quot;应该可以解决问题。


不行,以前就试过了才来这里问,否则我也不会问了。 - Sebastian P.R. Gingter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接