【问题标题】:Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding in VB.Net超时已过。在操作完成之前超时时间已过或服务器在 VB.Net 中没有响应
【发布时间】:2019-07-01 05:22:56
【问题描述】:

我有一个简单的 SQL 查询,在执行查询时在服务器端的 DB 中被触发,有时它会显示错误消息:

超时。在操作完成之前超时时间已过或服务器没有响应。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,Boolean breakConnection) 在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,Boolean breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 在 System System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async) 在 System.Data.SqlClient.SqlCommand 的 .Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)。 System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 处的 InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)

我的查询是:

If sqlconn.State = ConnectionState.Closed Then sqlconn.Open()
Txn = sqlconn.BeginTransaction

cmd = sqlconn.CreateCommand
cmd.Transaction = Txn
    strSql = "insert into " & tableName _
    & " (RepSerNo,ProductType,ProductID,ProductName,Qty,GrpQty,IDSNo,CubicalNo,BatchNo,BalanceId," _
    & "VernierID,UserID,UserName,PrDate,PrTime,Side,Unit,DecimalPoint," _
    & "WgmtModeNo,InstruID,Nom,PosTol,NegTol,NomEmpty,PosTolEmpty,NegTolEmpty," _
    & "NomNet,PosTolNet,NegTolNet,RepoLabel1,RepoLabel2,RepoLabel3,RepoLabel4,RepoLabel5," _
    & "RepoLabel6,RepoLabel7,RepoLabel8,RepoLabel9,RepoLabel10,RepoLabel11, " _
    & "RepoLabel12,RepoLabel13,RepoLabel14,RepoLabel15,RepoLabel16,RepoLabel17," _
    & "RepoLabel18,RepoLabel19,RepoLabel20)" _
    & " values(" _
    & RepBatchSrNo & "," & ProductType(cno) & "," & Chr(39) & ProductId(cno) & Chr(39) & "," & Chr(39) & Product_Name(cno) & Chr(39) & "," & Qty(cno) & "," & GrpQty(cno) & "," & IDSNo(cno) & "," & CubicNo(cno) & "," & Chr(39) & BatchNo(cno) & Chr(39) & "," & Chr(39) & balanceIdforTabCap(cno) & Chr(39) & "," _
    & Chr(39) & VernierId(cno) & Chr(39) & "," & Chr(39) & UserId(cno) & Chr(39) & "," & Chr(39) & UserName(cno) & Chr(39) & "," & DT & "," & Chr(39) & TM & Chr(39) & "," & Chr(39) & SIDE(cno) & Chr(39) & "," & Chr(39) & unit(cno) & Chr(39) & "," & DecimalPoint(cno) & "," _
    & wgmtmodeNo & "," & instruID(cno) & "," & NomValLmt(cno, 2) & "," & UppValPer(cno, 2) & "," & LwrValPer(cno, 2) & "," & NomValLmt(cno, 3) & "," & UppValPer(cno, 3) & "," & LwrValPer(cno, 3) & "," _
    & NomValLmt(cno, 0) & "," & UppValPer(cno, 0) & "," & LwrValPer(cno, 0) & "," & Chr(39) & Trim$(ReportLabels(cno, 1)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 2)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 3)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 4)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 5)) & Chr(39) & "," _
    & Chr(39) & Trim$(ReportLabels(cno, 6)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 7)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 8)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 9)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 10)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 11)) & Chr(39) & "," _
    & Chr(39) & Trim$(ReportLabels(cno, 12)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 13)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 14)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 15)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 16)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 17)) & Chr(39) & "," _
    & Chr(39) & Trim$(ReportLabels(cno, 18)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 19)) & Chr(39) & "," & Chr(39) & Trim$(ReportLabels(cno, 20)) & Chr(39) & ")"

    addToLogAudit("from savedata_new() for master:" & strSql)

    cmd.CommandText = strSql
    cmd.CommandTimeout = 0 'already included command timeout to 0 still its not working
    res = cmd.ExecuteNonQuery()

我已经包含 Cmd.Commandtimout=0 仍然收到相同的错误消息 感谢您的帮助,提前致谢。

【问题讨论】:

  • 请不要使用字符串连接来创建查询,因为这会使您的代码容易受到 SQL 注入攻击以及 SQL 语法错误的影响。使用 SqlParameters。 How can I avoid SQL injection attacks?
  • cmd 是一种 IDisposable 类型,因此应该在 Using 块中。你正在做sqlconn 的方式意味着你试图让它保持活力,这是一个坏主意,连接池意味着它可以非常有效地为你正在做的每件事打开一个新连接 - SqlConnection 类型是也是 IDisposable,所以也应该在 Using 块中。

标签: sql-server vb.net


【解决方案1】:

您获得的超时是在连接上,而不是在您的查询上。

【讨论】:

  • 你确定吗?堆栈跟踪说它来自SqlCommand.ExecuteNonQuery()...
  • @Richardissimo at System.Data.SqlClient.SqlConnection.OnError
  • @Richardissimo Plus 查询中绝对没有任何内容(尽管编码风格很糟糕)会导致 SQL 服务器超时。
  • 很公平。如果那里有问题,我会预料到他们打开连接时会发生错误;但是代码甚至没有显示命令是否在using 块中,更不用说连接(应该也是如此),所以我们没有太多工作要做。我想你可能已经成功了。
  • @Richardissimo 对,很难重建所有丢失的代码。
猜你喜欢
  • 1970-01-01
  • 2015-12-21
  • 2012-09-23
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
相关资源
最近更新 更多