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

时间:2011-05-03 19:37:31

标签: vb.net visual-studio-2008 timeout

我不确定这是VB.NET错误还是SQL Server。但是我在跟踪堆栈跟踪时遇到了上述错误:

  

[SqlException(0x80131904):超时   过期。超时时间已过   在完成手术之前   或服务器没有响应。]
  System.Data.SqlClient.SqlConnection.OnError(SQLEXCEPTION   exception,Boolean breakConnection)   +1950890 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException   exception,Boolean breakConnection)   +4846875 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject   stateObj)+194
  System.Data.SqlClient.TdsParser.Run(RunBehavior   runBehavior,SqlCommand cmdHandler,   SqlDataReader dataStream,   BulkCopySimpleResultSet   bulkCopyHandler,TdsParserStateObject   stateObj)+2392
  System.Data.SqlClient.SqlDataReader.ConsumeMetaData()   +33 System.Data.SqlClient.SqlDataReader.get_MetaData()   +83 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader   ds,RunBehavior runBehavior,String   resetOptionsString)+297
  System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,   Boolean returnStream,Boolean async)   +954 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior   cmdBehavior,RunBehavior runBehavior,   Boolean returnStream,String方法,   DbAsyncResult结果)+162
  System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,   Boolean returnStream,String method)   +32 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior   行为,字符串方法)+141
  System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(的CommandBehavior   行为)+12
  System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(的CommandBehavior   行为)+10
  System.Data.Common.DbDataAdapter.FillInternal(数据集   数据集,DataTable [] datatables,Int32   startRecord,Int32 maxRecords,String   srcTable,IDbCommand命令,   CommandBehavior行为)+130
  System.Data.Common.DbDataAdapter.Fill(数据集   dataSet,Int32 startRecord,Int32   maxRecords,String srcTable,   IDbCommand命令,CommandBehavior   行为)+287
  System.Data.Common.DbDataAdapter.Fill(数据集   dataSet)+94
  GlobalFunctions.GlobalF.GetComplaintTrendingList6(日期时间   FirstMonth,DateTime LastMonth,Int32   rowLevel)+489
  ASP.website_complaints_complainttrendinglist6_aspx.Main()   在   E:\的Inetpub \ amdmetrics-d.web.abbott.com \ wwwroot的\网站\投诉\ ComplaintTrendingList6.aspx:94   ASP.website_complaints_complainttrendinglist6_aspx.Page_Load(对象   发件人,EventArgs E)in   E:\的Inetpub \ amdmetrics-d.web.abbott.com \ wwwroot的\网站\投诉\ ComplaintTrendingList6.aspx:60   错误帮助(IntPtr的   fp,Object o,Object t,EventArgs e)   +14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object   发件人,EventArgs e)+35
  System.Web.UI.Control.OnLoad(EventArgs的   e)+99
  System.Web.UI.Control.LoadRecursive()   +50 System.Web.UI.Page.ProcessRequestMain(布尔值   includeStagesBeforeAsyncPoint,Boolean   includeStagesAfterAsyncPoint)+627

这是在Microsoft .NET Framework版本:2.0.50727.3620; ASP.NET版本:2.0.50727.3618和SQL Server 2008。 它标记导致此错误的行说:

1: PrintMessageGrid.DataSource = GlobalFunctions.GlobalF.GetComplaintTrendingList6(FirstMonthDate, LastMonthDate, TheLevel) 

即使我可以在查询分析器中运行此存储过程,它也会在8秒后返回。可能是什么原因和修复?

以下是我宣布此功能的详细信息:

Public Shared Function GetComplaintTrendingList6(ByVal FirstMonth As DateTime, ByVal LastMonth As DateTime, ByVal rowLevel As Integer) As DataSet
    Dim DSPageData As New System.Data.DataSet
    Dim param(2) As SqlClient.SqlParameter

    param(0) = New SqlParameter("@FirstMonthDate", SqlDbType.DateTime)
    param(0).Value = FirstMonth
    param(1) = New SqlParameter("@LastMonthDate", SqlDbType.DateTime)
    param(1).Value = LastMonth
    param(2) = New SqlParameter("@TheLevel", SqlDbType.Int)
    param(2).Value = rowLevel

    ''# A Using block will ensure the .Dispose() method is called for these variables, even if an exception is thrown 
    ''# This is IMPORTANT - not disposing your connections properly can result in an unrespsonsive database 
    Using conn As New SQLConnection(ConfigurationSettings.AppSettings("AMDMetricsDevConnectionString")), _
   cmd As New SQLCommand("ComplaintTrendingList6", conn), _
    da As New SQLDataAdapter(cmd)
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.AddRange(param)

        da.Fill(DSPageData)
    End Using

    Return DSPageData
End Function

奇怪的是,如果我在存储过程中进行了这么小的更改,它会通过,但不会给我我想要的数据: 没错,但这个版本没有给我我想要的东西:

SELECT E.PRODUCT_GROUP, a.QXP_SHORT_DESC, COUNT(DISTINCT A.QXP_EXCEPTION_NO), A.QXP_REPORT_DATE, DATEADD(M, DATEDIFF(M, 0, A.QXP_REPORT_DATE), 0) AS STARTDATE
FROM ALL_COMPLAINTS A
LEFT OUTER JOIN SMARTSOLVE.V_QXP_ISSUE_REF D ON A.QXP_ID = D.IRF_QXP_ID 
INNER JOIN CT_ProductFailures b ON b.old_modes = a.qxp_short_desc
LEFT OUTER JOIN [MANUAL].PRODUCTS E ON A.EPA_PRD_CODE = E.LIST_NUMBER 
LEFT JOIN SMARTSOLVE.V_CXP_CUSTOMER_PXP C ON A.QXP_ID = C.QXP_ID
INNER JOIN @SelectedLevels F ON A.[LEVEL] = F.LevelId
WHERE   --[LEVEL] > 0 AND
(A.QXP_SHORT_DESC <> 'Design Control') 
and A.QXP_REPORT_DATE >= @OneYearAgo AND A.QXP_REPORT_DATE <= @LastMonthDate
AND (C.QXP_EXCEPTION_TYPE <> 'Non-Diagnostic' OR C.QXP_EXCEPTION_TYPE IS NULL)  
GROUP BY E.PRODUCT_GROUP, A.QXP_REPORT_DATE,  A.QXP_SHORT_DESC 

导致错误的存储过程:

INSERT #PVAL_NUM
SELECT E.PRODUCT_GROUP, b.new_modes 'QXP_SHORT_DESC', COUNT(DISTINCT A.QXP_EXCEPTION_NO), A.QXP_REPORT_DATE, DATEADD(M, DATEDIFF(M, 0, A.QXP_REPORT_DATE), 0) AS STARTDATE
FROM ALL_COMPLAINTS A
LEFT OUTER JOIN SMARTSOLVE.V_QXP_ISSUE_REF D ON A.QXP_ID = D.IRF_QXP_ID 
INNER JOIN CT_ProductFailures b ON b.old_modes = a.qxp_short_desc
LEFT OUTER JOIN [MANUAL].PRODUCTS E ON A.EPA_PRD_CODE = E.LIST_NUMBER 
LEFT JOIN SMARTSOLVE.V_CXP_CUSTOMER_PXP C ON A.QXP_ID = C.QXP_ID
INNER JOIN @SelectedLevels F ON A.[LEVEL] = F.LevelId
WHERE   --[LEVEL] > 0 AND
(A.QXP_SHORT_DESC <> 'Design Control') 
and A.QXP_REPORT_DATE >= @OneYearAgo AND A.QXP_REPORT_DATE <= @LastMonthDate
AND (C.QXP_EXCEPTION_TYPE <> 'Non-Diagnostic' OR C.QXP_EXCEPTION_TYPE IS NULL)
GROUP BY E.PRODUCT_GROUP, A.QXP_REPORT_DATE, b.new_modes

4 个答案:

答案 0 :(得分:7)

您需要在dataadapter的select命令上增加命令超时。

以下是增加dataadapter命令超时的代码。

adapter.SelectCommand.CommandTimeout = 0;

SQL连接超时与为执行的命令设置的超时不同。

定义如下。 来自MSDN

  

获取在尝试建立连接之前等待的时间   终止尝试并产生错误。

在MSDN上设置连接超时..

  

您可以使用设置连接等待超时的时间   连接中的ConnectTimeout或Connection Timeout关键字   串。值为0表示没有限制,应避免在a中   ConnectionString因为尝试连接无限期等待。

所有超时的默认值为30秒。

答案 1 :(得分:4)

我认为这意味着数据库操作耗时太长而且放弃了。

尝试在web.config中添加连接超时

<add key="DBConnection" value="server=LocalHost;uid=sa;pwd=;database=DataBaseName;Connect Timeout=200; pooling='true'; Max Pool Size=200"/>

答案 2 :(得分:3)

使用查询分析器(或SSMS,现在)以及应用程序获得的内容可能是非常不同的,主要是由于参数嗅探。

我建议阅读Erland Sommarskog的this article了解详情。

答案 3 :(得分:-1)

  

“..数据库操作花了太长时间而放弃了。”

这是对的。当您与服务器的连接发生冲突时会发生这种情况。

暂时解决此问题..

“修复您的LAN连接”

您可以通过右键单击连接并单击“修复”

来执行此操作

要永久解决这个问题..

工作组中不应该有静态和动态IP地址的组合。如果要设置静态组,请不要包含动态连接 - 反之亦然。

之后,不再有显示“Timeout Expired”的错误。

喝彩!