在赋值变量为Null Reference Exception之前使用变量

时间:2013-10-09 14:10:58

标签: vb.net

我无法修复此空引用异常

    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

2 个答案:

答案 0 :(得分: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阻止假定TransConn具有值。但是,如果在行[{1}}之前抛出异常,则永远不会为Trans = Conn.BeginTransaction分配值,因此它将为Trans({{1}在VB)。

这里发生的事情是之前该行正在抛出异常。但是,您的异常处理程序本身会抛出一个完全不同的异常。这基本上掩盖了第一个异常,即您尝试查找的实际错误。

使用调试器,在null上设置一个断点并查看原始异常是什么,这是您需要纠正的内容。

除此之外,您可以稍微重新构造Nothing块,以免假设变量具有值。只是为了让你作为初学者,至少你可以在你的Trans.Rollback()区块中执行此操作:

Try/Catch

答案 1 :(得分:1)

这不是错误。这是一个警告,因为您在分配之前使用了trans。移动Conn.Open() 尝试之前Trans = Conn.BeginTransaction,你将解决它。