0

アップロードされた XML ファイルに基づいて、ユーザーがさまざまなデータベースのテーブルを更新できるようにするツールを作成しようとしています。ユーザーが SQL Server インスタンスを選択し、ログイン資格情報を書き込めるようにする必要があります。資格情報が正しければ、更新するデータベースを選択する必要があります。

私の問題は、提供されたユーザー名とパスワードが間違っている場合、ユーザーは、入力が間違っていることを伝えるためにキャッチする例外を取得するのに2〜3秒待たなければならないことです。

私のコードは次のようになります。

private void comboDatabaseTarget_DropDown(object sender, System.EventArgs e)
        {
            String connString = "Server=" + this.comboSQLServerInstances.Text + ";User Id=sa;Password=testPasswd;";
            try
            {
                using (SqlConnection sqlConn = new SqlConnection(connString))
                {
                    sqlConn.Open();
                    DataTable tblDatabases = sqlConn.GetSchema("Databases");
                    sqlConn.Close();
                    foreach (System.Data.DataRow row in tblDatabases.Select())
                    {
                        this.comboDatabaseTarget.Items.Add(row.ItemArray[0]);
                    }
                }
            }
            catch (Exception ex)
            {

                MessageBox.Show("wrong username and password, or bad sql instance");
            }
        }

私の質問は: データベースに接続しようとしたときにタイムアウトを設定する方法はありますか? ユーザー名とパスワードが正しければ、ほぼ瞬時に回答を受け取ることができるため、100 ミリ秒としましょう。

ありがとうございました!

4

3 に答える 3

3

あなたのコメントに基づいて、 SqlConnection.ConnectionTimeoutを設定してみてください。デフォルトは 15 秒です。

編集:

プロパティは実際には読み取り専用です。ただし、備考欄には次のように記載されています。

You can set the amount of time a connection waits to time out by using the 
ConnectTimeout or Connection Timeout keywords in the connection string. A value 
of 0 indicates no limit, and should be avoided in a ConnectionString because an 
attempt to connect waits indefinitely.
于 2013-01-16T11:48:41.230 に答える
2

接続文字列に時間を追加することで、接続タイムアウトを設定できます。

追加してみてください:-

"Connection Timeout=2;"接続文字列の最後に。

ただし、これでは何も解決しません。をキャッチする Try/Catch ステートメントを作成しましたExceptionが、MessageBox.

また、上記のように「Using ステートメント」を使用すると、接続を閉じるために呼び出す必要はありません。これは、using ステートメントによって自動的に行われます。

于 2013-01-16T11:58:00.073 に答える
1

接続文字列自体からログイン タイムアウトを設定できます。 SqlConnectionStringBuilder.ConnectTimeoutを参照してください。デフォルトは 15 秒です。ただし、このタイムアウトをはるかに低い値 (ns) に設定することは、非常に悪い考えです。アクセス拒否の例外が発生するという事実は、ログインが成功し、資格情報が正しくないために拒否されたことを意味します。つまり、認証情報を確立するのに 2 ~ 3 秒かかります。したがって、ログイン タイムアウトを低く設定すると、すべての接続が単純に閉じられます。ログインする前にタイムアウトになるからです。. 通常、コールド ログイン (最初の試行) では 2 ~ 3 秒かかります。: DNS 名、Kerberos チケット、ターゲット LSA、SQL 認証トークン。アプリケーションの応答性を維持するには、メッセージ ポンプを 2 ~ 3 秒間ハイジャックしないようにしてください (つまり、バックグラウンド スレッドから接続をテストします)。

以前の応答のコメントの一部は、通常、ログイン タイムアウト ( SqlConnectionStringBuilder.ConnectTimeout) とコマンド タイムアウト ( ) を混同していますSqlCommand.CommandTimeout。この 2 つは異なるスコープをカバーし、実際には異なるデフォルト (15 秒と 30 秒) を持っています。

于 2013-01-16T12:34:55.867 に答える