0

この関数は、App_Codeフォルダ内のクラスファイルにあります

 Public Shared Function CRUD(ByVal _sql As String, ByVal _parameterNames() As String, ByVal _parameterVals() As String) As Integer
        Dim _noOfRowsAffected As Integer
        Dim _connection As SqlConnection = Global.Connection.GetDbConnection()
        Dim _command As New SqlCommand(_sql, _connection)

        Try
            If _parameterNames IsNot Nothing Then
                For i = 0 To _parameterNames.Length - 1
                    _command.Parameters.AddWithValue(_parameterNames(i), _parameterVals(i))
                Next
            End If

            _noOfRowsAffected = _command.ExecuteNonQuery()
        Catch ex As Exception
            'MsgBox(ex.Message)
            _noOfRowsAffected = -1
        Finally
            If _connection.State = ConnectionState.Open Then
                _connection.Close()
                _connection.Dispose()
                _command.Dispose()
            End If
        End Try

        Return _noOfRowsAffected
    End Function

このコードはaspx.vbページにあります

Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click
        Dim _parameterNames(6), _parameterVals(6) As String
        _parameterNames(0) = "@Name"
        _parameterVals(0) = txtCoachingName.Text
        _parameterNames(1) = "@Address"
        _parameterVals(1) = txtCoachingAddress.Text
        _parameterNames(2) = "@Mob1"
        _parameterVals(2) = txtCoachingMob1.Text
        _parameterNames(3) = "@Mob2"
        _parameterVals(3) = txtCoachingMob2.Text
        _parameterNames(4) = "@LLine"
        _parameterVals(4) = txtCoachingLLine.Text
        _parameterNames(5) = "@Established"
        _parameterVals(5) = ddlCoachingEstablished.SelectedValue
        _parameterNames(6) = "@DemoVideo"
        _parameterVals(6) = txtCoachingDemoVideo.Text
        _parameterNames(7) = "@Password"
        _parameterVals(7) = txtCoachingPassword.Text
         Try
        DataAccess.CRUD("UPDATE CoachingDetails SET Name=@Name,Address=@Address,Mob1=@Mob1,Mob2=@Mob2,L_Line=@LLine,Established=@Established,Demo_Video=@DemoVideo,Password=@Password,Step_Completed='True',Time_Stamp='" & Date.Now & "'", _parameterNames, _parameterVals)
    Catch ex As Exception

    End Try

Primary Key Violationここで、ページで例外をキャッチしたいのですが、クラス関数によってエラーがキャッチされるためaspx.vb、ページで例外を取得しませんaspx.vb。クラスファイルからaspx.vbファイルに例外を取得するにはどうすればよいですか。 ?? サブ終了

4

2 に答える 2

2

再スロー。(http://www.selfelected.com/rethrow/)

Try
    ....
Catch ex As Exception 
    do some stuff with ex
    Throw    ' important to not use ex as parameter as that would start a new exception stack.
Finally
    do some other stuff
End Try

キャッチでは何もしないので、スキップしてください。

Try
    ....
Finally
    do some other stuff
End Try

コードをより良くするために、の使用を読んでください。Usingを使用すると、コンパイラにTry/Finallyを暗黙的に挿入させることができます。コードは次のようになります。

Using connection As SqlConnection = Global.Connection.GetDbConnection()
    Using command As New SqlCommand(sql, connection)
        If parameterNames IsNot Nothing Then
            For i = 0 To parameterNames.Length - 1
                command.Parameters.AddWithValue(parameterNames(i), parameterVals(i))
            Next
        End If
        noOfRowsAffected = _command.ExecuteNonQuery()
    End Using
End Using

すべての変数をローカルにしたことに注意してください。あなたは私よりもあなたのコードについてもっとよく知っているので、これはあなたにとって不可能かもしれません...(しかし、コードはあなたの変数がクラス変数であると示唆しましたが、とにかくそれらをローカルとして扱いました。)

Dapperもチェックしてください。Dapperはスタックオーバーフローが実行されるものです。これは、SQL呼び出しの記述を記述および読み取りしやすくするための優れた小さなライブラリです。

于 2012-07-01T19:05:17.637 に答える
1

PrimaryKeyViolationExceptionBCLにはキャッチできるものがありません。

最も近いのは、をキャッチSqlExceptionしてメッセージを調べ、SQLServerが報告した問題が何であるかを確認することです。このためのブロックは、より具体的であるため、catchブロックのCatchにある必要があります。Exception

Try
    If _parameterNames IsNot Nothing Then
        For i = 0 To _parameterNames.Length - 1
            _command.Parameters.AddWithValue(_parameterNames(i), _parameterVals(i))
        Next
    End If

    _noOfRowsAffected = _command.ExecuteNonQuery()
Catch ex As SqlException
    ' Do stuff - logging, checking the exception message etc...
    ' Rethrow exception if you want the exception to bubble up
Catch ex As Exception
    'MsgBox(ex.Message)
    _noOfRowsAffected = -1
Finally
    If _connection.State = ConnectionState.Open Then
        _connection.Close()
        _connection.Dispose()
        _command.Dispose()
    End If
End Try
于 2012-07-01T19:04:29.747 に答える