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クエリをSQL Management Studioで自分で手動で実行することにしましたが、正常に実行され、いくつかのレコードが生成されました。しかし、クエリの結果で目立ったことが1つあります。Friendsテーブル内のvarchar(max)タイプのフィールド内に、不適切にエンコードされたHTMLテキストがいくつかありました(具体的に<!--
は、「Narrative」列のデータ内にある種類のエンコードされたコメントシンボル)。疑わしいデータ行は次のようになります。
Name Birthdate Narrative
==== ========= ==============
Fred 21-Oct-79 <!--HTML Comment -->Once upon a time...
エンコードされたHTML記号「<
」に注意してください。これは「<」文字を表しています。どういうわけかそれはデータベースに入り、私のC#コードはそれを拾うことができませんでした!connect.Open()行で毎回失敗しました!データベーステーブルFriendsのその1行のデータを手動で編集し、代わりにデコードされた「<」文字を入力した後、すべてが機能しました!その行は次のようになるはずです。
Name Birthdate Narrative
==== ========= ==============
Fred 21-Oct-79 <!--HTML Comment -->Once upon a time...
以下の簡単なUPDATEステートメントを使用して、1つの不良行を編集しました。ただし、エンコードされたHTMLの問題のある行が複数ある場合は、REPLACE関数を使用するより複雑なUPDATEステートメントが必要になる場合があります。
UPDATE Friends SET Narrative = '<!--HTML Comment -->Once upon a time...' WHERE Narrative LIKE '<%'
したがって、ストーリーの教訓は(少なくとも私の場合は)HTMLコンテンツをデータベースに保存する前にサニタイズすることです。そもそもこの不可解なSQL Serverエラーは発生しません。(ええと、HTMLコンテンツを適切にサニタイズ/デコードすることは、さらに情報が必要な場合、別のStackOverflow検索に値する別の議論の主題です!)