我收到此错误:
超时已过期。操作完成之前经过的超时时间或服务器没有响应。
我知道已有指南帮助解决这个问题,但他们并不适合我。我错过了什么或者我应该在哪里将代码添加到我的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");
答案 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解决了这个问题。
重要提示:在我的情况下,我不需要交易,所以取消隐式交易设置没有问题。如果在您的情况下交易是必须的,您可能不应该使用此解决方案。