1. ホーム
  2. c#

[解決済み] 実行タイムアウトが切れました。操作の完了前にタイムアウト時間が経過したか、サーバーが応答しない[重複]。

2022-02-18 17:27:50

質問事項

私のコードを実行すると、次のような例外が発生します。

System.Data.dll で 'System.Data.SqlClient.SqlException' 型の処理されない例外が発生しました。

追加情報です。実行タイムアウトが切れました。 操作の完了前にタイムアウト時間が経過したか、サーバーが応答していません。

私のコードは以下の通りです。

    private void FillInDataGrid(string SQLstring)
    {
        string cn = ConfigurationManager.ConnectionStrings["Scratchpad"].ConnectionString; //hier wordt de databasestring opgehaald
        SqlConnection myConnection = new SqlConnection(cn);
        SqlDataAdapter dataadapter = new SqlDataAdapter(SQLstring, myConnection);
        DataSet ds = new DataSet();
        myConnection.Open();
        dataadapter.Fill(ds, "Authors_table");
        myConnection.Close();
        dataGridView1.DataSource = ds;
        dataGridView1.DataMember = "Authors_table";
    }

そして、私のSQLstringは以下の通りです。

SELECT dbo.[new].[colom1],dbo.[new].[colom2],dbo.[new].[colom3],dbo.[new].[colom4],  
                dbo.[new].[Value] as 'nieuwe Value',
                dbo.[old].[Value] as 'oude Value'
                FROM dbo.[new]
                JOIN dbo.[old] ON dbo.[new].[colom1] = dbo.[old].[colom1] and dbo.[new].[colom2] = dbo.[old].[colom2] and dbo.[new].[colom3] = dbo.[old].[colom3] and dbo.[new].[colom4] = dbo.[old].[colom4] 
                where dbo.[new].[Value] <> dbo.[old].[Value]

解決方法は?

クエリがデフォルトの30秒より長く必要な場合は コマンドタイムアウト より高い。そのためには、DataAdapter をインスタンス化した後に、そのインスタンスの SelectCommand プロパティをこのように変更します。

private void FillInDataGrid(string SQLstring)
{
    string cn = ConfigurationManager.ConnectionStrings["Scratchpad"].ConnectionString; //hier wordt de databasestring opgehaald
    DataSet ds = new DataSet();
    // dispose objects that implement IDisposable
    using(SqlConnection myConnection = new SqlConnection(cn))
    {
        SqlDataAdapter dataadapter = new SqlDataAdapter(SQLstring, myConnection);

        // set the CommandTimeout
        dataadapter.SelectCommand.CommandTimeout = 60;  // seconds

        myConnection.Open();
        dataadapter.Fill(ds, "Authors_table"); 
    }
    dataGridView1.DataSource = ds;
    dataGridView1.DataMember = "Authors_table";
}

もう一つの選択肢は、クエリに対応することです。Sql Server では 実行計画 . きっと、その中にフルテーブルスキャンがあるのでしょう。の1つか2つのカラムにインデックスを追加して実験してみてはいかがでしょうか? [old][new] テーブルを作成します。インデックスを追加すると、挿入と更新の実行時間が長くなり、スペースが必要になることに留意してください。