毎月問題なく動作している毎晩実行されるファイルがあります。突然、クエリタイムアウトエラーが発生します。クイックトレースを見ると、毎回何らかの二次照会(更新)に失敗していることがわかります。Do While Not.EOFのタイムアウト内でクエリを更新する
コード実行の非常に一般的な概要に:
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)
これが最後に何ヶ月のために正常に動作しており、今では、更新のいずれかをヒットするたびに失敗しました。
編集:
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)
編集2:と呼ばれる機能を含む:
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
次に誰かがスクリプトを修正し「UPDATE ... ID =」 'との間の[連結演算子(https://msdn.microsoft.com/en-us/library/sx97884w)を除去する前に、これが働いている場合'と' recSet( "id") 'を呼び出す。しかし、文字列連結によるクエリの構築は、とにかく悪い練習です.b/cでは、コードを[SQLインジェクション](https://xkcd.com/327/)に開きます。 [prepared statement](http://stackoverflow.com/a/18619736)を使用し、 'recSet(" condition ")'と 'recSet(" id ")'の値をパラメータとして呼び出します。 –
ファイルのTFSとタイムスタンプの両方は、これが7月24日以降に触れられていないことを示しています。 –
その後、コードが機能していないか、7月24日以降に条件のどれも起動されていません。 –