这个 VB.NET 错误是啥意思? '你调用的对象是空的。' [复制]

Posted

技术标签:

【中文标题】这个 VB.NET 错误是啥意思? \'你调用的对象是空的。\' [复制]【英文标题】:What does this VB.NET error mean? 'Object reference not set to an instance of an object.' [duplicate]这个 VB.NET 错误是什么意思? '你调用的对象是空的。' [复制] 【发布时间】:2020-08-21 03:06:14 【问题描述】:

我有三个 SQL 表:TGolfers、TEventYears 和 TGolferEventYears。 TGolferEventYears 是哪个高尔夫球手参加了哪个赛事的表格。我已经成功填充了一个 Event Years 组合框 (cboEventYears),现在我正在尝试根据所选年份的高尔夫球手填充第二个 Golfers 组合框。但由于某种原因,我的 SELECT 语句抛出错误:“对象引用未设置为对象的实例。” 我不知道这是什么意思,有人可以帮忙吗?代码如下,谢谢。

'Load golfers combo box based on event year
Private Sub cboEventYears_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboEventYears.SelectedIndexChanged

    Try

        Dim strSelect As String = ""
        Dim cmdSelect As OleDb.OleDbCommand 'Used for Select Statement
        Dim drSourceTable As OleDb.OleDbDataReader 'Where data is retrieved to
        Dim dt As DataTable = New DataTable 'Table we will load from our reader

        'Open the DB
        If OpenDatabaseConnectionSQLServer() = False Then

            'If not, warn user
            MessageBox.Show(Me, "Database connection error." & vbNewLine &
                                    "The application will now close.",
                                    Me.Text + " Error",
                                    MessageBoxButtons.OK, MessageBoxIcon.Error)

            'Close form
            Me.Close()
        End If

        'Build Select Statement 
        strSelect = "SELECT TGolfers.intGolferID, TGolfers.strLastName FROM TGolferEventYears JOIN TGolfers ON TGolferEventYears.intGolferID = TGolfers.intGolferID WHERE TGolferEventYears.intEventYearID = " & cboEventYears.SelectedValue.ToString

        'Retrieve all records
        cmdSelect = New OleDb.OleDbCommand(strSelect, m_conAdministrator)
        drSourceTable = cmdSelect.ExecuteReader

        'Load Table from Data Reader
        dt.Load(drSourceTable)

        'Add item to Combo Box. We need golferID to be associated
        'with the last name in order to pull the rest of the data.
        'Binding column name to the combo box display and value members.
        cboGolfers.ValueMember = "TGolfers.intGolferID"
        cboGolfers.DisplayMember = "TGolfers.strLastName"
        cboGolfers.DataSource = dt

        'Select first item in the list by default
        If cboGolfers.Items.Count > 0 Then cboGolfers.SelectedIndex = -1


     Catch excError As Exception

         'Log and display error message
         MessageBox.Show(excError.Message)

     End Try
End Sub

【问题讨论】:

不,我现在明白这是某种空错误,但不确定这意味着什么或为什么会发生。还是谢谢 该问题的答案为您提供了任何人都可以提供给您的所有信息,而无需实际调试您的系统。这是在 .NET 中编码的基本概念,因此我建议花时间理解它并学习调试它。 尝试在组合框选定值上放置一个断点。它是否返回选定的值?如果是这样,请在 Execute Reader 上放置另一个断点,以查看是否有打开的连接。最后一件事,在返回的数据表上放置另一个断点 想象一下你正在做饭,而食谱需要一茶匙盐。你拿起你的盐瓶,试着往混合物里加盐。嗯?什么都没有出来!你没盐了!这是一个与NullReferenceException 等效的现实世界:您尝试使用不存在的东西。任何NullReferenceException 的秘诀是调试并找出不应该存在的内容(即找到null 的内容)。 OT 如果您使用的是 SqlServer(如您的 OpenDatabaseConnectionSQLServer 所建议的那样),还有 SqlConnection 和 SqlCommand 对象可能比 OleDb 的性能更好。见docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient 【参考方案1】:

很可能您在选择语句中引用了一个空值,我会说cboEventYears.SelectedValue.ToString 是您的罪魁祸首。再次尝试您的代码,但使用常量而不是这个,看看这是否修复。你也可以试试cboEventYears.text 我注意到这通常是更好的选择。

【讨论】:

以上是关于这个 VB.NET 错误是啥意思? '你调用的对象是空的。' [复制]的主要内容,如果未能解决你的问题,请参考以下文章

vb.net中方法名称后的美元符号是啥意思

VB和C#的区别是啥

在 VB.NET 中调用过程的优缺点是啥?

从 Java 调用 VB.NET 函数的最佳方法是啥?

visual C++中error C2352是啥意思

vb2005 是啥东西