当我在 Visual Studio 中遇到此错误时,
“建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)”</p>
...这是在执行以下 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 文本(具体来说,<!--
“叙述”列的数据中存在一些排序的编码注释符号)。可疑数据行如下所示:
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 搜索!)