0

実行に時間がかかる Update ストアド プロシージャを含む QueriesTableAdapter があります。ストアド プロシージャが呼び出されるクエリ テーブル アダプタのコマンド タイムアウト プロパティを増やそうとしています。

ストアド プロシージャは、Web サービスを介して 1 つのプロセスによってまれに呼び出されるメンテナンス ルーチンです。

注意: これは、TableAdapter ではなく、QueriesTableAdapter であり、.net 4.5 VS 2012 を使用しています。

DAL のコード ビハインドに、次のコードを追加しました。

Namespace mbr_AccountTableAdapters
    Partial Public Class QueriesTableAdapter

        ''' <summary>
        ''' Sets the commant timeout.
        ''' Set to 0 to specify the longest timout value supported by the db.
        ''' </summary>
        Public WriteOnly Property CommandTimeout As Integer
            Set(value As Integer)
                If Not IsNothing(Me._commandCollection) Then
                    For Each cmd As System.Data.IDbCommand In Me._commandCollection
                        cmd.CommandTimeout = value
                    Next
                End If
            End Set
        End Property

    End Class
End Namespace

その後、BLL から次のコードを使用して、ストアド プロシージャを実行できます。

Dim rows As Integer = 0 'number of affected rows

Using myQTA As New DAL.mbr_AccountTableAdapters.QueriesTableAdapter

    'increase the command timeout:
    myQTA.CommandTimeout = 0 '0 = larget value possible

    Dim queryResult As Object
    queryResult = myQTA.usrsp_mbr_account_CleanupInactive()
    If Not IsNothing(queryResult) Then
        rows = Convert.ToInt32(queryResult)
    End If

End Using

次のエラーが表示されます。

[Win32Exception (0x80004005): 待機操作がタイムアウトしました]

[SqlException (0x80131904): タイムアウトが発生しました。操作が完了する前にタイムアウト時間が経過したか、サーバーが応答していません。]


クエリが機能することに注意してください。接続やその他のエラーに問題はありません。処理が必要なデータの量をデータの小さなサブセットに減らすと、クエリはエラーなしで実行されます。

問題は、30 秒以上かかる場合です。

クエリは 30 秒後に正確にタイムアウトします。

web.config のデータベース接続文字列に 'Connection Timeout=90' を追加しても違いはありませんが、それでも 30 秒後にタイムアウトします。

4

1 に答える 1

0

私は自分の問題を解決することができました。

_commandCollection は常に NULL であるため、CommandTimeout 値は設定されません。

最初に InitCommandCollection() を呼び出してコマンド コレクションを初期化する必要があります。その後、CommandTimeout 値を設定できます。

コードを次のように変更しました。

Public WriteOnly Property CommandTimeout As Integer
    Set(value As Integer)

        'initialize the collection first:
        If IsNothing(Me._commandCollection) Then
            Me.InitCommandCollection()
        End If

        If Not IsNothing(Me._commandCollection) Then
            For Each cmd As System.Data.IDbCommand In Me._commandCollection
                cmd.CommandTimeout = value
            Next
        End If
    End Set
End Property

期待どおりに機能するようになり、ストアド プロシージャのカスタム タイムアウト値を設定できるようになりました。

この情報が他の誰かに役立つことを願っています。

于 2013-10-01T03:32:00.840 に答える