【问题标题】:stubborn error when trying to merge a table into a dataset尝试将表合并到数据集中时出现顽固错误
【发布时间】:2018-08-15 22:42:06
【问题描述】:

我正在尝试在我的小游戏中查找 .NET 错误。

这是错误:

ArgumentNullException: 'table' 参数不能为空

System.DataSet.Merge(数据表)

它发生在它试图将表合并到现有数据集的下一行。

我正在尝试尽可能多地进行检查以确定数据集或表是否为空,但它在 ds.Merge 行上继续出错。

Dim ds As DataSet
'getData = simple function that uses SqlConnection & SqlDataAdapter to get data from my database
ds = utils.getData("Sproc_GetGameEncounters")

Dim MonsterDataSet As DataSet

MonsterDataSet = utils.getData("Sproc_MonsterDataSetFromDB")

If Not MonsterDataSet Is Nothing Then
    If MonsterDataSet.Tables("TreasureList") Is Nothing OrElse MonsterDataSet.Tables("TreasureList").Rows.Count = 0 Then
        'MonsterDataSet.Tables("TreasureList") is  empty
    Else
        ds.Merge(MonsterDataSet.Tables("TreasureList"))  'line where error occurs
    End If
End If

我是否可以添加更多检查来帮助修复或至少追踪此错误?

谢谢!

【问题讨论】:

  • 使用调试器确保 MonsterDataSet 中存在名为 TreasureList 的表。
  • Dim MonsterDataSet As DataSet 不创建数据集,它只是声明一个对象变量。除非utils.getData 返回一个DataSet(不是DataTable),否则它将是Nothing。不过,这似乎会导致 NRE。所以无论那个神秘的助手做什么,它都不会在那个数据集中用那个名字创建一个表……至少不是总是这样。该代码没有显示任何正在创建的东西
  • 似乎“帮助”方法没有它可能有用(或不太聪明)。如果它返回一个 DataTable,而不是 2 个 DataSet,您可以在调用它时简单地将每个表添加到单个数据集中。
  • 是否涉及多线程?
  • 很有可能。创建的表未命名。由于“助手”没有告诉 TableName,它很可能没有一个。 Ergo dsMosnter.Tables("anything") 将返回 null。在DataSet中创建一个DataTable只需要3行代码,所以不清楚getData为什么存在。

标签: vb.net dataset


【解决方案1】:

我最近遇到了同样的问题。问题是适配器,它没有得到表的名称。我有类似的功能,很高兴分享。

您可以在填充数据集后设置表名,或使用TableMappingshere an answerTableMappings),但我更喜欢第一种方式。

填充数据集的函数

    Private Function sql_fillDataset(sql As String, Optional tablesName As String() = Nothing) As DataSet


        dim sql_connection As SqlConnection
        Dim command As SqlCommand
        Dim adapter As New SqlDataAdapter
        Dim ds = New DataSet

        Try

            sql_connection = New SqlConnection("YOUR_CONNECTION_STRING")
            sql_connection.Open()

            command = New SqlCommand(sql, sql_connection)

            adapter.SelectCommand = command
            adapter.Fill(ds)

            If Not tablesName Is Nothing AndAlso Not ds Is Nothing AndAlso Not ds.Tables Is Nothing AndAlso ds.Tables.Count = tablesName.Length Then
                For i = 0 To ds.Tables.Count - 1
                    ds.Tables(i).TableName = tablesName(i)
                Next
            End If

            command.Dispose()
            adapter.Dispose()
            sql_connection.Close()
            sql_connection.Dispose()

            Return ds
        Catch ex As Exception
            Return Nothing
        End Try

    End Function

如何使用

Dim ds As New Dataset
ds = sql_fillDataset("SELECT * FROM TABLE1")
' #### Here is your case, and you haven't the table name
ds.tables(0)

或者

Dim ds As New Dataset
ds = sql_fillDataset("SELECT * FROM TABLE1", New String() {"TABLE1"})
' #### Here is your solution, but the dataset have the name !!
ds.tables("TABLE1")

或者多张桌子

Dim ds As New Dataset
ds = sql_fillDataset("SELECT * FROM TABLE1; SELECT * FROM TABLE2", New String() {"TABLE1", "TABLE2"})
ds.tables("TABLE1")
ds.tables("TABLE2")

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多