4

Visual Studio 2008 で C# コード ビハインドで書かれた asp.net Web アプリがあります。

別のサーバー上の SQL Server データベースにクエリを実行する SQL クエリがあります。クエリを実行すると、90 秒後にタイムアウトします。あらゆる種類のさまざまな設定を試しました。

私はインターネットをトロールしましたが、まだ答えが見つかりません。コードにCommandTimeoutクエリ用に設定する行があります。クエリに設定するとCommandTimeout = 1;1 秒後にタイムアウトになり、クエリに設定するとCommandTimeout = 90;90 秒後にタイムアウトになります。

これはすべて問題ありませんが、私のクエリには約時間がかかります。実行するのに 150 秒。コードをCommandTimeout = 200;クエリに変更しても、90 秒後にタイムアウトします。90秒未満のタイムアウトしか変更できないようです。90 秒を超えると、90 秒でタイムアウトになります。

これは私を怒らせています。私のコードを上書きしている別の設定はありますか?

これが私のコードです

// bind the data to the Gridview
private void BindTaskList()
{
    string startDate = StartDate.Text;
    string endDate = EndDate.Text;

    // Create a connection string referring to the connection string from web.config file
    string conStr = ConfigurationManager.ConnectionStrings["Docupro_ReportingConnectionString"].ConnectionString;

    SqlConnection sqlConnection = new SqlConnection(conStr);

    // This is the SQL query and must be in one long line
    SqlCommand sqlCommand = new SqlCommand("SELECT T5.DisplayName AS 'User', T2.LongName AS 'Print Type', SUM(T1.Quantity) AS 'Total Quantity', '£'+CONVERT(varchar, SUM(T1.Amount), 3) AS 'Total Cost' FROM tblTransaction T1 JOIN tblItem T2 ON T1.ItemID = T2.ItemID JOIN tblLedger T3 ON T1.LedgerID = T3.LedgerID JOIN tblTender T4 ON T1.TenderID = T4.TenderID JOIN tblCustomer T5 ON T4.CustomerID = T5.CustomerID JOIN tblTerminal T6 on T1.TerminalID = T6.TerminalID JOIN tblStation t7 on T6.StationID = t7.StationID WHERE (TransactionDateTime BETWEEN @StartDate AND @EndDate)AND T3.LongName = 'Not Assigned' GROUP BY T5.DisplayName, T2.LongName ORDER BY T5.DisplayName", sqlConnection);

    // Create the parameters from the text boxes and drop down list
    sqlCommand.Parameters.Add(new SqlParameter("@StartDate", startDate));
    sqlCommand.Parameters.Add(new SqlParameter("@EndDate", endDate));

    // Set the command timeout to 200 seconds to allow for long queries
    sqlCommand.CommandTimeout = 200;
    sqlConnection.Open();

    // Create a DataSet to fill with data
    SqlDataAdapter myAdapter = new SqlDataAdapter(sqlCommand);
    DataSet myDataSet = new DataSet();
    myAdapter.Fill(myDataSet);

    // Turn off GridView Footer
    GridView1.ShowFooter = false;

    // Fill the GridView with the DataSet
    GridView1.DataSource = myDataSet;
    GridView1.DataBind();
}

期待に感謝します

アンディ

エラーメッセージは次のとおりです。

Sys.WebForms.PageRequestManagerTimeoutException: サーバー要求がタイムアウトしました ScriptResource.axd
コード:0

4

4 に答える 4

6

エラー メッセージは、(ADO.NET ではなく) ASP.NET からタイムアウトが発生したことを示しています。設定しServer.ScriptTimeout=200ます。

エラーメッセージを解釈することは、エラーをデバッグするための最初のステップです。「タイムアウト」を読んだときに立ち止まらないでください。すべてを読んで解釈します。

于 2013-02-27T13:54:14.253 に答える
2

ふぅ…

エラーが発生しました (ASP 関連ではありません - これはコンソール アプリケーション内にありました) 。また、パラメーターを設定したに CommandTimeout を設定しても (プロパティが更新されたにもかかわらず) 有効にならないことがわかりました。

例えば

SqlCommand comm = new SqlCommand(conn, proc);
comm.Parameters.AddWithValue("@a",123);
comm.CommandTimeout = 300;
comm.ExecuteReader(); //Times out at 30 seconds

しかし

SqlCommand comm = new SqlCommand(conn, proc);
comm.CommandTimeout = 300;
comm.Parameters.AddWithValue("@a",123);
comm.ExecuteReader(); //Times out at 300 seconds

実際にはSqlCommandを返す関数があり、返されたときに実行されましたが、この簡略化されたバージョンでも同じ結果になると思います。

要約すれば

SqlCommand を新規作成した直後に CommandTimeout プロパティを設定してみてください。

于 2016-02-08T12:04:22.770 に答える
0

に設定してみました0か?

備考

値0は制限がないことを示し、コマンドを実行しようとすると無期限に待機するため、CommandTimeoutでは回避する必要があります。

これがリファレンスです。

于 2013-02-27T12:19:17.593 に答える