【问题标题】:Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding [duplicate]执行超时已过期。在操作完成之前超时时间已过或服务器没有响应[重复]
【发布时间】:2017-05-09 01:09:44
【问题描述】:

当我运行我的代码时,出现以下异常:

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";
    }

我的 SQL 字符串如下:

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]

【问题讨论】:

  • 您的查询似乎需要一些时间来执行
  • @EhsanSajjad 你认为执行时间是这里的问题吗?
  • @EhsanSajjad I only 得到了一张大约 7000 行的表格
  • 显然在执行过程中有超时。可能是行数、连接数、连接中的条件。看到这个stackoverflow.com/questions/8602395/…
  • @EhsanSajjad 我认为这个问题不重复。一个用于sql Command,另一个用于SqlDataAdapter。由于两者都来自 System.Data.SqlClient 命名空间,因此错误消息是相同的。但解决方法不同。

标签: c# sql sqldataadapter


【解决方案1】:

如果您的查询需要超过默认的 30 秒,您可能需要将CommandTimeout 设置得更高。为此,您将在实例化该实例的 SelectCommand 属性上的 DataAdapter 后对其进行更改,如下所示:

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 中你可以分析execution plan。我敢打赌里面有一个全表扫描。您可以尝试在[old][new] 表中的一列或两列上添加索引。请记住,添加索引是以增加插入和更新的执行时间和空间要求为代价的。

【讨论】:

  • 我试了60秒,还是没有加载,我现在要试15分钟,有什么办法可以加快进程吗?除了改变我的CPU。
  • 正如我所说,您的查询是问题所在。您可以尝试添加索引。我只需在 Sql Server 管理工作室中运行该语句,并根据执行计划的结果进行优化。
  • 一个小时后仍然没有完成:P 我现在在 de SQL server management studio 中执行查询,这已经需要 5 分钟哈哈
猜你喜欢
  • 1970-01-01
  • 2015-12-21
  • 2012-09-23
  • 2021-12-03
  • 1970-01-01
  • 2011-10-08
  • 2013-03-06
  • 2019-07-01
  • 2011-08-20
相关资源
最近更新 更多