まず、特定の問題を検索しましたが、問題の原因が見つからないようであることを皆様にお知らせしたいと思います。
ネットワーク マシン上で実行されている SQL Server 2008 インスタンスと、それに接続するように作成したクライアントがあります。
接続するには、SQL Server 2008 インスタンスへの接続を確立し、サーバーに対して実行したクエリの結果が入力された DataTable を返す小さなコード セグメントがあります。とにかく問題は、プログラムを開いてこのメソッドを呼び出すときはいつでも、メソッドの最初の呼び出し時に、接続文字列のように接続タイムアウト値を設定したことに関係なく、約15秒かかり、タイムアウトすることです. 奇妙なことに、メソッドに対して行う 2 回目または 3 回目の呼び出しは問題なく動作します。
この記事「 SQL Server のファイアウォール ポートを開く方法」で説明されているように、サーバー マシンで SQL Server のポートを開き、正しく構成されていることを確認しました。私のコードに特定の問題が見られる人はいますか?
string _connectionString = "Server=" + @Properties.Settings.Default.sqlServer + "; Initial Catalog=" + @Properties.Settings.Default.sqlInitialCatalog +
";User Id=" + @Properties.Settings.Default.sqlUsername + ";Password=" + @Properties.Settings.Default.sqlPassword + "; Connection Timeout=1";
private DataTable ExecuteSqlStatement(string command)
{
using (SqlConnection conn = new SqlConnection(_connectionString))
{
try
{
conn.Open();
using (SqlDataAdapter adaptor = new SqlDataAdapter(command, conn))
{
DataTable table = new DataTable();
adaptor.Fill(table);
return table;
}
}
catch (SqlException e)
{
throw e;
}
}
}
私のキャッチでキャッチされるSqlExceptionは次のとおりです。「タイムアウトが期限切れになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。」
これは、conn.Open(); で発生します。私が含めたコードスニペットの行。誰かが素晴らしいアイデアを持っているなら!
補遺サーバーに ping を実行すると、応答時間は 10 ミリ秒未満です。さらに、SQL Server Management studio を使用しているときに同じ動作が得られます (この質問を書いた後、考えが頭をよぎったので、これを試しました)。SQL Server Management Studio を使用する場合も 2 回試行する必要があるため、これはコードの問題ではなく、ネットワークの問題であると推測されます。接続障害のエラーチェックを実装してから接続を再試行できることはわかっていますが(とにかくこれを行う必要があります)、根本的な問題に対処していないため、これは特に「クリーン」ではないようです。この問題の経験がある人はいますか?
編集 1 年以上経った後、この質問は 4000 回以上閲覧されましたが、その後、ファイアウォール ポートが開いていると/思っていたのに、実際には開いていないことがわかりました。SQL Server が使用するポート番号に対して Windows のファイアウォールを開く必要があると誤って想定していました。私の場合、TCP ポート 1433 での接続を許可するように設定しました。最初の接続を確立しようとすると、ファイアウォールが問題を引き起こしました。
セットアップの正しい方法は、Windows ファイアウォールを設定して、SQL Server インスタンスの実行可能ファイルを通過させることであることがわかりました。これを行うには、Windows ファイアウォールにプログラムを追加し、SQL インスタンスが存在するフォルダを参照してC:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.SQLINSTANCE\MSSQL\Binn
、sqlservr.exe ファイルをファイアウォール ルールに追加する必要があります。