2

接続試行の残りのタイムアウトが複数回試行しても持続しているように見えるという奇妙な問題が発生しています。

接続情報を入力する単純なウィンドウがあり、接続ボタンとキャンセル ボタンがあります。

ユーザーが接続を押すと、次のコードが実行されます。

 DisableControls();
 if((bool)AutoAuthenticated.IsChecked)
 {
     ((MainWindow)Owner).myConnection = new System.Data.SqlClient.SqlConnection
                                          ("server="+ServerName.Text + ";"+
                                          "Trusted_Connection=yes;"  +
                                          "database="+DatabaseName.Text + ";" +
                                          "connection timeout=3");
 }
 else
 {
     ((MainWindow)Owner).myConnection = new System.Data.SqlClient.SqlConnection
     ("user id="+UserName.Text+";" +
     "password="+Password.Password+";" +
     "server="+ServerName.Text+";" +
     "Trusted_Connection=no;" +
     "database="+DatabaseName.Text+";" +
     "connection timeout=3");
 }

 await ConnectToServer();

これは ConnectToServer 関数です。

private async Task ConnectToServer()
{
    //using (((MainWindow)Owner).myConnection)
    //{ 
        await ((MainWindow)Owner).myConnection.OpenAsync();
    //}
}

現時点では、タイムアウト プロパティはテスト用に小さくなっています。

とにかく、接続中にユーザーがキャンセルボタンを押した場合:

private void Cancel_Click(object sender, RoutedEventArgs e)
{
    if (((MainWindow)Owner).myConnection != null &&
        ((MainWindow)Owner).myConnection.State ==
            System.Data.ConnectionState.Connecting)
    {
        ((MainWindow)Owner).myConnection.Close();
        EnableControls();
    }
    else
    {
        this.Close();
    }
}

ここで、偽の詳細を入力してタイムアウトのままにすると、「ネットワーク パスが見つかりませんでした」という例外がキャッチされます。

この後に再度接続しようとすると (または、キャンセル ボタンを押す速さによっては、次の試行の後で)、接続ボタンを押した後、想定されていた時間を待たずに、ほぼ瞬時にタイムアウトします。に。

ここで何が間違っているのかわかりません.SqlConnectionオブジェクトをリセットしようとしましたが、接続を押すたびに新しいSqlConnectionに設定すると、すでにこれを行う必要があると思いました?

4

1 に答える 1

1

私は何が欠けているかを知りました。接続を閉じたり、オブジェクトを破棄したり、すべてを using ステートメントに保持したりしても、接続プールという別の要素があったため、問題は解決しませんでした。

これについてはまだ読む必要がありますが、基本的には古い接続情報などを再利用してリソースを節約します。

ここに詳細がありますが、これが同様の問題を抱えている他の人に役立つ場合はClearPool()、接続を閉じるときに関数を呼び出すだけです:

例 (私の例外処理コードで、Close() を呼び出した後):

System.Data.SqlClient.SqlConnection.ClearPool(((MainWindow)Owner).myConnection);

明らかに、リソース使用の観点からは、接続を再利用する必要がない場合にのみその関数を呼び出すのがおそらく最善ですが、とはいえ、これについてはまだ読む必要があるので、私の言葉を鵜呑みにしないでください!

于 2013-06-07T13:18:45.800 に答える