当我在Visual Studio中遇到此错误时,
“建立与SQL Server的连接时发生了与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称正确,并且已将SQL Server配置为允许远程连接。(提供者:命名管道提供者,错误:40-无法打开与SQL Server的连接)”
...这是在执行以下C#代码期间,该代码试图获取我的SQL Server数据以在网格中显示它。中断恰好发生在显示connect.Open()的行上:
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())
{
// blah
}
}
}
}
这是无法解释的,因为SQL查询非常简单,我拥有正确的连接字符串,并且数据库服务器可用。我决定自己在SQL Management Studio中手动运行实际的SQL查询,它运行得很好,并产生了几条记录。但是查询结果中有一件事情引人注目:Friends表中的varchar(max)类型字段中有一些编码不正确的HTML文本(特别是,某些编码的注释符号<!--
属于“ Narrative”列的数据)。可疑数据行如下所示:
Name Birthdate Narrative
==== ========= ==============
Fred 21-Oct-79 <!--HTML Comment -->Once upon a time...
请注意,编码的HTML符号“ <
”代表“ <”字符。不知何故,它进入了数据库,而我的C#代码无法识别它!它每次都在connect.Open()行失败!在我手动编辑数据库表Friends中的那一行数据并放入已解码的“ <”字符后,一切正常!该行应该是这样的:
Name Birthdate Narrative
==== ========= ==============
Fred 21-Oct-79 <!--HTML Comment -->Once upon a time...
我使用下面的这个简单的UPDATE语句编辑了一个坏行。但是,如果您有几行令人讨厌的HTML编码行,则可能需要使用REPLACE函数的更精细的UPDATE语句:
UPDATE Friends SET Narrative = '<!--HTML Comment -->Once upon a time...' WHERE Narrative LIKE '<%'
因此,这个故事的寓意是(至少在我看来),在将HTML内容存储在数据库中之前先对其进行清理,这样一来,您就不会遇到这种神秘的SQL Server错误!(嗯,如果您需要更多信息,则另外一个讨论的主题是正确地清理/解码HTML内容,值得单独进行StackOverflow搜索!)