从 sql 数据库中检索数据,并且不会遇到超时异常

本文关键字:遇到 异常 超时 数据库 sql 检索 数据 | 更新日期: 2023-09-27 17:55:59

我运行下面的代码从sql中提取数据,q是我使用的查询。数据集很大,需要> 2 分钟才能带来不幸的是,我得到了一个例外:

未处理的异常:System.Data.SqlClient.SqlException:超时 过期。 在 操作完成或服务器没有响应。 尝试连接时发生此故障 CT 到路由目的地。--->系统.组件模型.Win32异常:等待操作超时 ---内部异常堆栈跟踪结束--- at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action'1 wr apCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, boolean callerHa sConnectionLock, Boolean asyncClose)

如何解决它,尽管有时间,我将能够检索我需要的所有数据。

   List<string> dataList = new List<string>();
   using (SqlConnection connection = new SqlConnection(csb.ConnectionString))
   {
         connection.Open();
         using (SqlCommand command = new SqlCommand(q, connection))
         {
               using (SqlDataReader reader = command.ExecuteReader())
               {
                      if (reader.HasRows)
                      {
                           while (reader.Read())
                           {
                               dataList .Add(reader.GetString(0));
                           }
                      }
               }
         }
    }

从 sql 数据库中检索数据,并且不会遇到超时异常

您必须设置 SQL 命令的 Timeout 属性,以便该查询仅在等待了几秒钟后才会引发超时异常。

超时

是一个整数值,用于指定在引发超时异常之前等待的秒数。

请检查 SqlCommand.CommandTimeout

根据 MSDN,默认值为 30 秒。

这个 SO 答案为使用超时提供了很好的建议。(引文如下)

对于大多数查询,1 分钟的超时似乎是合理的。一个 8+ 小时 超时似乎不合理。

您是否有预计花费超过一分钟的查询?如果 因此,将其提高到您期望高于您期望的任何值的值 看看一切是否正常工作,但不要高到服用 永远提醒您注意问题。(例如,您可能从 1 分钟到 5 分钟。

奖金(来源)

命令超时设置为零将删除时间限制,在以下情况下 等待查询运行。

但是,如果数据库脱机,程序将等待 无限期地为不会发生的事情,所以你应该 请考虑改为设置较长的时间,以便命令超时 最终而不是永远不会。

按如下方式修改代码应该允许命令有足够的时间返回结果:注意:使用3分钟

using (SqlCommand command = new SqlCommand(q, connection))
                    {
                        command.CommandTimeout = 180;
                        using (SqlDataReader reader = command.ExecuteReader())
                        {
                            if (reader.HasRows)
                            {
                                while (reader.Read())
                                {
                                    dataList .Add(reader.GetString(0));
                                }
                            }
                        }
                    }

详细信息: SqlCommand.CommandTimeout