如果data为null,则XmlNode.InnerText会中断

时间:2017-12-22 16:38:54

标签: sql-server vb.net ssis etl ssis-2008

我在VS 2008中有一个脚本任务。在这个脚本任务中,我得到一个数据集并将其转换为XML,并循环遍历节点:

Dim dsHistory As New DataSet
dsHistory = GetHistoryByYear(Year)


Dim HistoryDoc As New XmlDocument
HistoryDoc.LoadXml(dsHistory.GetXml)


Dim HistoryStudentList As XmlNodeList
Dim StudentNode as XmlNode
HistoryStudentList = HistoryDox.SelectNodes("/NewDataSet/Table")
dsHistory = Nothing


For Each HistoryStudentNode In HistoryStudentList

    Dim dsCurrentAssessment As New DataSet
    dsCurrentAssessment = GetCurrentAssessmentData(...)

    ...code to make sure dataset has data...

    Dim CurrentAssessmentDoc As New XmlDocument
    CurrentAssessmentDoc.LoadXml(dsCurrentAssessment.GetXml)
    Dim CurrentAssessmentNode As XmlNode
    CurrentAssessmentNode = CurrentAssessmentDoc.SelectSingleNode("/NewDataSet")


    For Each CurrentAssessment As XmlNode In CurrentAssessmentNode.SelectNodes("Table")

        InsertAssessmentHistory(HistInstanceID, CurrentAssessment.Item("TITLE").InnerText, CurrentAssessment.Item("CONTENT").InnerText, CurrentAssessment.Item("TYPE").InnerText, CDate(convertAssessmentDate(CurrentAssessment.Item("ADMINISTRATION_DATE").InnerText)), CurrentAssessment.Item("REPORTING_METHOD").InnerText, CurrentAssessment.Item("SCORE_RESULTS").InnerText, CurrentAssessment.Item("INTERPRETATION").InnerText, CStr(htHistory("ASSESSMENT_ACTION")))

    Next
Next

我遇到的问题是使用InsertAssessmentHistory方法,特别是调用CurrentAssessment.Item(" SCORE_RESULTS")。InnerText。数据集返回其中一个记录的空数据,看起来当在该记录上调用.InnerText时它失败,并且"对象引用未设置为对象的实例"因为XML标签" ..."。

有没有办法调用.InnerText,如果没有数据则返回null?

2 个答案:

答案 0 :(得分:1)

借助@ codexer的指导,我能够让它发挥作用。内循环现在看起来像这样:

For Each CurrentAssessment As XmlNode In CurrentAssessmentNode.SelectNodes("Table")

    Dim ScoreResults As String
    Dim Interpretation As String


    If CurrentAssessment.Item("SCORE_RESULTS") Is Nothing Then
        ScoreResults = Nothing
    Else
        If CurrentAssessment.Item("SCORE_RESULTS").InnerText Is Nothing Then
            ScoreResults = Nothing
        Else
            ScoreResults = CurrentAssessment.Item("SCORE_RESULTS").InnerText
        End If
    End If


    If CurrentAssessment.Item("INTERPRETATION") Is Nothing Then
        Interpretation = Nothing
    Else
        If CurrentAssessment.Item("INTERPRETATION").InnerText Is Nothing Then
            Interpretation = Nothing
        Else
            Interpretation = CurrentAssessment.Item("INTERPRETATION").InnerText
        End If
    End If



    InsertAssessmentHistory(HistInstanceID, _
        CurrentAssessment.Item("TITLE").InnerText, _
        CurrentAssessment.Item("CONTENT").InnerText, _
        CurrentAssessment.Item("TYPE").InnerText, _
        CDate(convertAssessmentDate(CurrentAssessment.Item("ADMINISTRATION_DATE").InnerText)), _
        CurrentAssessment.Item("REPORTING_METHOD").InnerText, _
        ScoreResults, _
        Interpretation, _
        CStr(htHistory("ASSESSMENT_ACTION")))
Next

答案 1 :(得分:1)

为什么要转换为Xml,而您可以使用数据集实现此目的。 这是您提供的内部循环的数据集版本:

For Each CurrentAssessment As DataRow In dsCurrentAssessment.Tables(0).Rows

    Dim ScoreResults As String
    Dim Interpretation As String


    If CurrentAssessment.Item("SCORE_RESULTS") Is Nothing OrElse _
        String.IsNullOrEmpty(CurrentAssessment.Item("SCORE_RESULTS").ToString) Then
        ScoreResults = Nothing
    Else
        ScoreResults = CurrentAssessment.Item("SCORE_RESULTS").ToString
    End If


    If CurrentAssessment.Item("INTERPRETATION") Is Nothing OrElse _
        String.IsNullOrEmpty(CurrentAssessment.Item("INTERPRETATION").ToString) Then
        Interpretation = Nothing
    Else
        Interpretation = CurrentAssessment.Item("INTERPRETATION").ToString
    End If


    InsertAssessmentHistory(HistInstanceID, _
        CurrentAssessment.Item("TITLE").ToString, _
        CurrentAssessment.Item("CONTENT").ToString, _
        CurrentAssessment.Item("TYPE").ToString, _
        CDate(convertAssessmentDate(CurrentAssessment.Item("ADMINISTRATION_DATE").ToString)), _
        CurrentAssessment.Item("REPORTING_METHOD").ToString, _
        ScoreResults, _
        Interpretation, _
        CStr(htHistory("ASSESSMENT_ACTION")))
Next