【发布时间】: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为什么存在。