解决SQL查询的超时错误

时间:2011-07-14 16:30:20

标签: c# sql timeout

我收到此错误:

  

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

我知道已有指南帮助解决这个问题,但他们并不适合我。我错过了什么或者我应该在哪里将代码添加到我的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");

5 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:5)

您正在尝试连接到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;    
    }
}

答案 2 :(得分:2)

由于在其他答案中尚未提及增加连接超时的确切命令 - 如果您确定需要增加连接超时,则应在连接字符串中执行以下操作:< / p>

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

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

答案 3 :(得分:1)

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

"Data Source=MyDatabaseServer...

然后你需要确保:

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

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

有很多文章可以解决SQL Server连接问题 - 在Server Fault

上搜索特定错误消息,或者将其作为特定问题解决

答案 4 :(得分:1)

最近遇到了这个问题并找到了resolution that worked for me

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

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

来自MSDN:

  

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

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

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