当我在Visual Studio中遇到这个错误时,它是由以下C#代码执行引起的,该代码试图获取我的SQL Server数据以在网格中显示。断点恰好发生在connect.Open()所在的行上。
“在建立与SQL Server的连接时发生了与特定实例相关联的网络错误。找不到服务器或无法访问。请验证实例名称是否正确,并且SQL Server已配置为允许远程连接。 (提供程序:命名管道提供程序,错误:40-无法打开到SQL Server的连接)”请注意保留HTML标记。
using (var connect = Connections.mySqlConnection)
{
const string query = "SELECT Name, Birthdate, Narrative FROM Friends";
using (var command = new SqlCommand(query, connect))
{
connect.Open();
using (var dr = command.ExecuteReader())
{
while (dr.Read())
{
}
}
}
}
这是一个难以解释的问题,因为SQL查询非常简单,我有正确的连接字符串,并且数据库服务器可用。我决定在SQL管理工具中手动运行实际的SQL查询,它顺利地运行并返回了多个记录。但在查询结果中有一件事情引起了我的注意:Friends表中的varchar(max)类型字段内部存在一些格式不正确的HTML文本(具体来说,是“叙述”列数据内部的一些编码注释符号,类似于<!--
)。可疑的数据行看起来像这样:
Name Birthdate Narrative
==== ========= ==============
Fred 21-Oct-79 <
请注意编码的HTML符号 "
<
",它代表了一个"<"字符。不知怎么的,它出现在了数据库中,我的C#代码无法捕获它!每次都会在connect.Open()行失败!在我手动编辑数据库表Friends的一行数据并替换为未编码的"<"字符后,一切正常!以下是该行应该看起来的样子:
Name Birthdate Narrative
==== ========= ==============
Fred 21-Oct-79 <!--HTML Comment -->Once upon a time...
我使用下面这个简单的 UPDATE 语句来编辑了一个有问题的数据行。但如果你有多个包含编码 HTML 的不良行,你可能需要使用更复杂的 REPLACE 函数来进行更新:
UPDATE Friends SET Narrative = '<!--HTML Comment -->Once upon a time...' WHERE Narrative LIKE '<%'
所以,这个故事的寓意是(至少在我的情况下),在将HTML内容存储到数据库之前对其进行清洗,这样就不会出现这种神秘的SQL Server错误了!(如果需要更多信息,请进行另一次独立的StackOverflow搜索,正确地清理/解码您的HTML内容也值得讨论!)