执行超时。在操作完成之前超时时间已过或服务器未响应。

9

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

类型为“System.Data.SqlClient.SqlException”的未处理异常发生在 System.Data.dll 中

附加信息:执行超时已过期。操作尚未完成或服务器未响应。

我的代码如下:

    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]

1
您的查询似乎需要花费一些时间来执行。 - Ehsan Sajjad
1
执行过程中显然出现了超时问题。可能是由于你在连接查询中涉及的行数、连接条件或筛选条件等原因导致的。参考这篇文章:https://dev59.com/NWoy5IYBdhLWcg3wYM2B?rq=1 - bit
1
@EhsanSajjad 我认为这个问题不是重复的。一个是关于sql Command,另一个是关于SqlDataAdapter。由于两者都来自System.Data.SqlClient命名空间,因此错误消息相同。但解决方法是不同的。 - Muhammad Ashikuzzaman
@MuhammadAshikuzzaman 在任何情况下设置查询超时时间都是相同的。 - Ehsan Sajjad
@EhsanSajjad,其中一个是 SqlDataAdapter da = new SqlDataAdapter(str, dbCon); da.SelectCommand.CommandTimeout = 300; 另一个是 SqlCommand command = new SqlCommand(); command.CommandTimeout = 300; - Muhammad Ashikuzzaman
显示剩余6条评论
1个回答

19

如果您的查询需要超过默认的30秒,您可能希望将CommandTimeout设置得更高一些。在实例化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中,你可以分析执行计划。我敢打赌里面有一次全表扫描。你可以尝试在[old][new]表的一个或两个列上添加索引。请记住,添加索引会以插入和更新的更高执行时间及空间需求为代价。


我尝试了60秒,但它仍然没有加载,现在我要尝试15分钟,除了更改我的CPU之外,有没有任何方法可以加快进程速度? - wouter de jong
2
就像我之前所说的,你的查询语句是问题所在。你可以尝试添加索引。我建议你在 Sql Server 管理工具中运行该语句,并根据执行计划的结果进行优化。 - rene
一个小时过去了还没做完:P我现在在SQL服务器管理工具中执行查询,这已经花了5分钟哈哈。 - wouter de jong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接