0

この null 参照例外を修正するのに問題があります

    Dim Conn As New OleDb.OleDbConnection
    Dim Trans As OleDb.OleDbTransaction

    Try
        ' create the stream writer object
        Dim FS As New System.IO.StreamReader(FileName)

        ' open DB connection and start a transaction
        Dim Tmp As New POSDSTableAdapters.ItemsTableAdapter
        Conn.ConnectionString = Tmp.Connection.ConnectionString
        Conn.Open()
        Trans = Conn.BeginTransaction

        ' clear all tables
        Dim CMD As New OleDb.OleDbCommand
        CMD.CommandText = " delete from ReciptDetails"
        CMD.Connection = Conn
        CMD.Transaction = Trans
        CMD.ExecuteNonQuery()
        CMD.Dispose()

        CMD = New OleDb.OleDbCommand
        CMD.CommandText = " delete from Recipts"
        CMD.Connection = Conn
        CMD.Transaction = Trans
        CMD.ExecuteNonQuery()
        CMD.Dispose()

        CMD = New OleDb.OleDbCommand
        CMD.CommandText = " delete from items"
        CMD.Connection = Conn
        CMD.Transaction = Trans
        CMD.ExecuteNonQuery()
        CMD.Dispose()

        CMD = New OleDb.OleDbCommand
        CMD.CommandText = " delete from RestorantTable"
        CMD.Connection = Conn
        CMD.Transaction = Trans
        CMD.ExecuteNonQuery()
        CMD.Dispose()

        CMD = New OleDb.OleDbCommand
        CMD.CommandText = " delete from [Values]"
        CMD.Connection = Conn
        CMD.Transaction = Trans
        CMD.ExecuteNonQuery()
        CMD.Dispose()

        ' load the tables
        If Not LoadTableFromBackup(Conn, Trans, FS, "RestorantTable") Then
            Trans.Rollback()
            Conn.Close()
            FS.Close()
            Return False
        End If
        If Not LoadTableFromBackup(Conn, Trans, FS, "Values") Then
            Trans.Rollback()
            Conn.Close()
            FS.Close()
            Return False
        End If
        If Not LoadTableFromBackup(Conn, Trans, FS, "items") Then
            Trans.Rollback()
            Conn.Close()
            FS.Close()
            Return False
        End If
        If Not LoadTableFromBackup(Conn, Trans, FS, "Recipts") Then
            Trans.Rollback()
            Conn.Close()
            FS.Close()
            Return False
        End If
        If Not LoadTableFromBackup(Conn, Trans, FS, "ReciptDetails") Then
            Trans.Rollback()
            Conn.Close()
            FS.Close()
            Return False
        End If

        FS.Close()

        Trans.Commit()

        Conn.Close()
        Return True
    Catch ex As Exception
        Trans.Rollback()
        Conn.Close()
        Return False
    End Try
End Function
4

2 に答える 2

2

上記のコメントに基づいてTrans、値が割り当てられていないように見えます。コードの小さなサンプルを見てください。

Try
    ' create the stream writer object
    Dim FS As New System.IO.StreamReader(FileName)

    ' open DB connection and start a transaction
    Dim Tmp As New POSDSTableAdapters.ItemsTableAdapter
    Conn.ConnectionString = Tmp.Connection.ConnectionString
    Conn.Open()
    Trans = Conn.BeginTransaction

    ' the rest of the code...
Catch ex As Exception
    Trans.Rollback()
    Conn.Close()
    Return False
End Try

ブロックはそれをCatch前提としてTransおり、Conn値を持つことになります。ただし、行の前に例外がスローされたTrans = Conn.BeginTransaction場合Trans、値が割り当てられることはないため、null( NothingVB では) になります。

ここで起こっているのは、その行の前に何かが例外をスローしていることです。しかし、例外ハンドラー自体がまったく異なる例外をスローします。これは本質的に、見つけようとしている実際のエラーである最初の例外を覆い隠しています。

デバッガーを使用して、ブレーク ポイントを配置しTrans.Rollback()、元の例外が何であるかを確認します。これは、修正する必要があるものです。

それとは別に、Try/Catchブロックを少し再構築して、変数に値があると想定しないようにすることができます。初心者として始めるために、少なくともCatchブロックでこれを行うことができます:

Catch ex As Exception
    If Trans Is Not Nothing Then
        Trans.Rollback()
    End If
    If Conn Is Not Nothing Then
        Conn.Close()
    End If
    Return False
End Try
于 2013-10-09T14:27:05.077 に答える