解决SQL查询的超时错误

本文关键字:超时 错误 查询 SQL 解决 | 更新日期: 2023-09-27 18:02:20

我得到这个错误:

超时过期。操作完成前的超时时间或服务器没有响应。

我知道已经有指南可以帮助解决这个问题,但它们对我不起作用。我错过了什么,或者我应该在哪里添加代码到这些SQL语句在我的c#程序:

String sql = project1.Properties.Resources.myQueryData;
SqlDataAdapter sqlClearQuestDefects = new SqlDataAdapter(sql,
    "Data Source=ab;Initial Catalog=ac;User ID=ad; Password =aa");
DataSet lPlanViewData = new DataSet();
sqlClearQuestDefects.Fill(lPlanViewData, "PlanViewData");

我在这行得到超时错误:

SqlDataAdapter sqlClearQuestDefects = new SqlDataAdapter(sql, 
    "Data Source=ab;Initial Catalog=ac;User ID=ad; Password =aa");

解决SQL查询的超时错误

SqlDataAdapter adp = new SqlDataAdapter();
adp.SelectCommand.CommandTimeout = 0;  // Set the Time out on the Command Object

您正在尝试连接到SQL Server,并且它需要比ADO更长的时间。. NET愿意等待。

尝试连接到同一台服务器,使用相同的用户名和密码,使用SQL server Management Studio。如果你得到同样的错误,要么是你的连接字符串有问题,你指定的服务器没有运行,或者你不能通过网络从你所在的地方到达服务器(也许你在一个公共IP地址试图进入一个内部服务器名称)。我无法想象这样的场景:在SSMS中输入完全相同的服务器和凭据并连接,然后在ADO中执行相同的操作。. NET失败

如果您使用的是慢速网络,可以尝试增加超时值。然而,如果一个连接要发生,它应该发生得非常快。

查看一下您的SQL Native Client设置和服务器上的SQL Server设置。有一节是允许的协议;SQL可以使用多种协议进行连接。通常,您希望TCP/IP用于网络上的服务器,而Named Pipes用于运行在您自己计算机上的服务器。

编辑你的评论:哦,这很正常;这种事经常发生。在TCP网络中,数据包在传输过程中不时发生"碰撞"或"丢失"。这是分组交换技术的一个众所周知的弱点,在大多数情况下,它是由TCP协议本身管理的。不容易检测到的一种情况是,对连接的初始请求在混乱中丢失。在这种情况下,服务器不知道有一个请求,客户端也不知道他们的请求没有被接收。因此,客户端所能做的就是放弃。

要使您的程序更健壮,您所要做的就是期望出现一两次失败,然后重新尝试您的请求。这里有一个基本的算法:

SqlDataAdapter sqlClearQuestDefects;
short retries = 0;
while(true)
{
    try
    {
       sqlClearQuestDefects = new SqlDataAdapter(sql, "Data Source=ab;Initial Catalog=ac;User ID=ad; Password =aa");
         break;
    }
    catch(Exception)
    {
       retries++;
         //will try a total of three times before giving up
       if(retries >2) throw;    
    }
}

由于在其他答案中没有提到增加连接超时的确切命令(到目前为止)-如果您确定需要增加连接超时,您将在连接字符串中这样做:

 Data Source=ab;Initial Catalog=ac;User ID=ad; Password =aa; Connection Timeout=120

式中120 = 120秒。我记得默认是20或30。

这可能是数据库的连接问题,例如,如果有以下连接字符串:

"Data Source=MyDatabaseServer...

然后你需要确保:

  • 机器MyDatabaseServer连接到网络,并且可以从您正在运行应用程序的机器(以"MyDatabaseServer"的名称)访问
  • 数据库服务器在MyDatabaseServer上运行
  • MyDatabaseServer上的数据库服务器被配置为接受来自远程机器的连接
  • 本机和MyDatabaseServer上的防火墙设置已正确设置为允许通过
  • 进行SQL Server连接
  • 您的用户名/密码等是正确的

您还可以尝试从客户机使用SQL Server Management Studio连接到给定的数据库实例,作为诊断步骤。

有很多关于SQL Server连通性问题的文章——在谷歌上搜索一下出现的特定错误信息或失败的特定问题

最近遇到了这个问题,找到了适合我的解决方法。

顺便说一下,设置Timeout = 0有助于避免异常,但执行时间不合理,而手动执行存储过程需要几秒钟。

底线:我将SET IMPLICIT_TRANSACTIONS OFF添加到用于填充数据集的存储过程中。

从MSDN:

SQL Server Native Client OLE DB ProviderSQL Server本机客户端ODBC驱动程序自动设置连接时将IMPLICIT_TRANSACTIONS设置为OFF。集的连接时,IMPLICIT_TRANSACTIONS默认为OFFSQLClient管理的提供程序,并通过接收SOAP请求HTTP端点。[…]当SET ANSI_DEFAULTS为ON时,SET IMPLICIT_TRANSACTIONS为ON。

所以我认为,在我的情况下,默认值不是必需的。(我无法核实。在SQL server上没有足够的权限)。但是将这一行添加到我的SP中解决了这个问题。

重要:在我的例子中,我不需要事务,所以取消隐式事务设置没有问题。如果在您的情况下,事务是必须的,那么您可能不应该使用此解决方案。