mopowoxo 2014-10-14 09:56 采纳率: 0%
浏览 4828

DataTable.Rows.Add(item)抛出错误:“值不能为 null。参数名: key”

界面功能是选则一个功能范围,然后点击新增,在界面列表中新增一行数据。
错误出现场景:选择同一个功能范围,点击新增后,代码会执行DataTable.Rows.Add(item)这句,大约有20%的概率出现如题错误。具体错误信息如下:
捕捉到 System.ArgumentNullException
HResult=-2147467261
_message=值不能为 null。
HResult=-2147467261
IsTransient=false
Message=值不能为 null。
参数名: key
Source=mscorlib
ParamName=key
StackTrace:
在 System.Collections.Generic.Dictionary2.FindEntry(TKey key)
在 System.Collections.Generic.Dictionary
2.get_Item(TKey key)
在 System.Data.DataView.MaintainDataView(ListChangedType changedType, DataRow row, Boolean trackAddRemove)
在 System.Data.DataViewListener.MaintainDataView(ListChangedType changedType, DataRow row, Boolean trackAddRemove)
在 System.Data.Index.<>c
_DisplayClass5.b__4(DataViewListener listener, ListChangedType type, DataRow row, Boolean track)
在 System.Data.Listeners1.Notify[T1,T2,T3](T1 arg1, T2 arg2, T3 arg3, Action4 action)
在 System.Data.Index.MaintainDataView(ListChangedType changedType, Int32 record, Boolean trackAddRemove)
在 System.Data.Index.InsertRecord(Int32 record, Boolean fireEvent)
在 System.Data.Index.ApplyChangeAction(Int32 record, Int32 action, Int32 changeRecord)
在 System.Data.Index.RecordStateChanged(Int32 record, DataViewRowState oldState, DataViewRowState newState)
在 System.Data.DataTable.RecordStateChanged(Int32 record1, DataViewRowState oldState1, DataViewRowState newState1, Int32 record2, DataViewRowState oldState2, DataViewRowState newState2)
在 System.Data.DataTable.SetNewRecordWorker(DataRow row, Int32 proposedRecord, DataRowAction action, Boolean isInMerge, Boolean suppressEnsurePropertyChanged, Int32 position, Boolean fireEvent, Exception& deferredException)
在 System.Data.DataTable.InsertRow(DataRow row, Int64 proposedID, Int32 pos, Boolean fireEvent)
在 System.Data.DataRowCollection.Add(DataRow row)
InnerException:

跟踪代码结果:
item是datatable.row类型。
(不知道怎么放图片)在正常与错误情况下,item.ItemArray有内容,部分为空字符串,内容除时间不一样之外,其余均相同。正常时正常添加,错误时,执行到add方法报错,捕捉错误后,item.ItemArray中的值都变成空,类型为System.DBNull.

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-02 21:21
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    根据您提供的错误信息和代码片段,可以初步判断问题可能出现在DataTable.Rows.Add()函数的调用过程中。这个函数用于向DataTable对象中添加新的行。在您的代码中,当尝试使用DataTable.Rows.Add(item)时,它抛出了一个System.ArgumentNullException异常,原因是在尝试将null作为参数传递给DataTable.Rows.Add()时发生了这种情况。

    为了确定具体的错误原因,我们需要进一步分析代码的具体细节,并排除其他潜在的原因。以下是一些建议的操作步骤来帮助我们解决此问题:

    1. 检查变量赋值

      • 确保每次调用DataTable.Rows.Add(item)之前,变量item始终包含有效的数据。
      • 通过打印或日志记录来观察变量item的内容变化,以确保其在所有操作前后保持不变。
    2. 检查数据源

      • 确认所选的功能范围确实提供了有效的数据供插入。如果数据不正确或者缺失,则可能导致null值被传递给DataTable.Rows.Add()
    3. 检查传递的数据

      • 如果数据来自外部API或其他来源,请确认这些数据是否已成功加载并转换为有效的表格项。
      • 使用适当的验证机制确保传递给DataTable.Rows.Add()的数据符合预期格式。
    4. 捕获异常处理

      • 对于可能出现的System.ArgumentNullException等异常,编写适当的捕获逻辑,以便在发生时能够优雅地处理异常而不是直接引发程序崩溃。
    5. 单元测试

      • 创建针对DataTable.Rows.Add()的单元测试,确保在各种输入情况(包括传入null值)下都能正常工作。
      • 测试覆盖各种边界条件,例如没有提供任何数据、提供大量无效数据等。
    6. 性能分析

      • 考虑对DataTable.Rows.Add()的操作进行优化,例如避免不必要的复制操作或利用更高效的索引查找策略。

    基于以上建议,您可以逐步排查并解决问题。希望这些建议能帮助您找到问题所在,并修复错误。

    评论

报告相同问题?