Wir haben eine Datei, die jede Nacht läuft, die seit Monaten ohne Probleme funktioniert hat. Plötzlich führt es zu Abfrage-Timeout-Fehlern. Ein schneller Trace zeigt mir, dass es jedes Mal bei sekundären Abfragen (Updates) versagt.Update Abfrage innerhalb Do NotEOF Zeitüberschreitung
Eine sehr allgemeine Zusammenfassung der Codeausführung:
strSQL = "EXEC usp_GET_listofRecords"
rsRun(recSet, strSQL)
Do While Not recSet.EOF
If recSet("condition") = 0 Then
strSQL2 = "UPDATE t_table SET status=0 WHERE id=" & recSet("id")
rsRun2(recSet2, strSQL2)
rsClose(recSet2)
ElseIf recSet("condition") = 1 Then
strSQL2 = "UPDATE t_table SET status=1 WHERE id=" & recSet("id")
rsRun2(recSet2, strSQL2)
rsClose(recSet2)
ElseIf recSet("condition") = 3 Then
strSQL2 = "UPDATE t_table SET status=3 WHERE id=" & recSet("id")
rsRun2(recSet2, strSQL2)
rsClose(recSet2)
End if
recSet.MoveNext
Loop
rsClose(recSet)
Dies wurde für Monate und Monate am Ende in Ordnung zu arbeiten, und nicht jetzt jedes Mal, dass einen des Updates trifft.
Edit: Ich weiß, dass die Update-Befehle gültig sind, denn ohne Frage die folgenden Werke zu tun:
strSQL = "EXEC usp_GET_listofRecords"
rsRun(recSet, strSQL)
Do While Not recSet.EOF
If recSet("condition") = 0 Then
strSQL2 = strSQL2 & "UPDATE t_table SET status=0 WHERE id=" & recSet("id") & "; "
ElseIf recSet("condition") = 1 Then
strSQL2 = strSQL2 & = "UPDATE t_table SET status=1 WHERE id=" & recSet("id") & "; "
ElseIf recSet("condition") = 3 Then
strSQL2 = strSQL2 & = "UPDATE t_table SET status=3 WHERE id=" & recSet("id") & "; "
End if
recSet.MoveNext
Loop
rsClose(recSet)
rsRun recSet, strSQL2
rsClose(recSet)
Edit 2: Einschließlich der Funktionen aufgerufen:
Function rsRun(recSet, strSQL)
Call OpenDB()
Set recSet = Server.CreateObject("ADODB.Recordset")
recSet.Open strSQL, dbConn
End Function
Function rsRun2(recSet2, strSQL2)
Call OpenDB()
Set recSet2 = Server.CreateObject("ADODB.Recordset")
recSet2.Open strSQL2, dbConn
End Function
Function OpenDB()
Set dbConn = Server.CreateObject("ADODB.Connection")
dbConn.ConnectionTimeout = 30
dbConn.CommandTimeout = 120
dbConn.Open strConnectionString, strUserName, strPassword
End Function
Wenn dies vorher funktioniert hat, dann hat jemand das Skript modifiziert und den [Verkettungsoperator] (https://msdn.microsoft.com/en-us/library/sx97884w) zwischen '" UPDATE ... id = "entfernt 'und' recSet ("id") '. Das Erstellen von Abfragen nach String-Verkettungen ist jedoch ohnehin eine schlechte Übung, b/c öffnet den Code für [SQL injection] (https://xkcd.com/327/). Verwenden Sie eine [prepared statement] (http://stackoverflow.com/a/18619736) und rufen Sie sie mit den Werten von 'recSet (" condition ")' und 'recSet (" id ")' als Parameter auf. –
Sowohl TFS als auch der Zeitstempel der Datei zeigen, dass dies seit dem 24. Juli nicht mehr berührt wurde. –
Dann hat entweder der Code nicht funktioniert oder keine der Bedingungen wurde seit dem 24. Juli ausgelöst. –