解决SQL查询的超时错误

我收到此错误:

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

我知道那里已有指南帮助解决这个问题,但他们并没有为我工作。 我错过了什么或者我应该在哪里将代码添加到我的C#程序中的这些SQL语句中:

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

 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,以及在您自己的计算机上运行的服务器的命名管道。

从你的评论编辑:哦,这是正常的; 一直都在发生。 在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有助于避免exception,但执行时间不合理,而手动执行存储过程需要几秒钟。

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

来自MSDN:

SQL Server的SQL Server Native Client OLE DB提供程序和SQL Server Native Client ODBC驱动程序在连接时自动将IMPLICIT_TRANSACTIONS设置为OFF。 对于与SQLClient托管提供程序的连接,以及通过HTTP端点接收的SOAP请求,SET IMPLICIT_TRANSACTIONS默认为OFF。 […]当SET ANSI_DEFAULTS为ON时,SET IMPLICIT_TRANSACTIONS为ON。

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

重要提示:在我的情况下,我不需要交易,所以我没有问题取消隐式交易设置。 如果在您的情况下交易是必须的,您可能不应该使用此解决方案。