none
XMLの保存がうまくいきません RRS feed

  • 質問

  • XMLを読込(basSplitRead)後に、編集後保存(basSplitWrite)していますが、保存で
    「オブジェクト参照がオブジェクト インスタンスに設定されていません」が発生します。
    インスタンスもNEWで作成してますしエレメント数・順も正しいはずですが。
    アドバイスをいただけませんか

        Public Sub basSplitRead(ByVal strRecordCaption As String, ByRef usrSplitColumns() As usrSplitColumnsTag)
            Dim strPath As String = My.Application.Info.DirectoryPath & "\A.Xml"
            Dim dsetSplitName As DataSet = New DataSet("SplitSetup")

            ' /* FileOpen & Read */
            Using sRead As IO.StreamReader = New IO.StreamReader(strPath, System.Text.Encoding.Default)
                dsetSplitName.ReadXml(sRead)
                With dsetSplitName.Tables("SplitValue")
                    For I As Short = 0 To 19
                        usrSplitColumns(I).strCaption = .Rows(I).Item("Caption")
                        usrSplitColumns(I).strField = .Rows(I).Item("Field")
                        usrSplitColumns(I).shtWidth = .Rows(I).Item("Width")
                        usrSplitColumns(I).strFormat = .Rows(I).Item("Format")
                        usrSplitColumns(I).shtAlignment = .Rows(I).Item("Alignment")
                    Next
                End With
            End Using
        End Sub

        Public Sub basSplitWrite(ByVal strRecordCaption As String, ByRef usrSplitColumns() As usrSplitColumnsTag)
            Dim strPath As String = My.Application.Info.DirectoryPath & "\A.Xml"
            Dim dsetSplitName As DataSet = New DataSet("SplitSetup")

            Using sWrite As IO.StreamWriter = New IO.StreamWriter(strPath, False, System.Text.Encoding.Default)
                With dsetSplitName.Tables("SplitValue")
                    For I As Short = 0 To 19
                        .Rows(I).Item("Caption") = usrSplitColumns(I).strCaption <--Error!
                        .Rows(I).Item("Field") = usrSplitColumns(I).strField
                        .Rows(I).Item("Width") = usrSplitColumns(I).shtWidth
                        .Rows(I).Item("Format") = usrSplitColumns(I).strFormat
                        .Rows(I).Item("Alignment") = usrSplitColumns(I).shtAlignment
                    Next
                End With
                dsetSplitName.WriteXml(sWrite, XmlWriteMode.WriteSchema)
            End Using
        End Sub

    2010年10月20日 7:14

回答

  • >アドバイスをいただけませんか

     

    まず、basSplitWriteメソッドでは、DataSetのインスタンスを生成した後、

    そのインスタンスの”SplitValue”というテーブルに対してデータの設定をループで行ってますが

    そもそもSplitValue”というテーブル自体が、まず存在していないと思います。

    なので、DataSetのインスタンスに対して、SplitValue”というDataTableインスタンスを追加

    する必要があります。

     

    追加したSplitValue”というテーブルには、列の定義がされていないので、

    定義する必要もあります。

     

    さらに、データを追加する際には、追加するための行を、テーブルに追加する必要があります。

     

    上記を行った場合、以下のような感じになるかと思います。

    Public Sub basSplitWrite(ByVal strRecordCaption As String, ByRef usrSplitColumns() As usrSplitColumnsTag)
      Dim strPath As String = My.Application.Info.DirectoryPath & "\A.Xml"
      Dim dsetSplitName As DataSet = New DataSet("SplitSetup")
      ' データテーブルを定義
      Dim dt As New DataTable("SplitValue")
      dt.Columns.Add("Caption")
      dt.Columns.Add("Field")
      dt.Columns.Add("Width")
      dt.Columns.Add("Format")
      dt.Columns.Add("Alignment")
      ' 引数のデータをデータテーブルにセット
      For I As Short = 0 To 19
        ' 行を追加
        dt.Rows.Add(dt.NewRow())
        ' 行にデータをセット
        dt.Rows(I).Item("Caption") = usrSplitColumns(I).strCaption ' --Error!
        dt.Rows(I).Item("Field") = usrSplitColumns(I).strField
        dt.Rows(I).Item("Width") = usrSplitColumns(I).shtWidth
        dt.Rows(I).Item("Format") = usrSplitColumns(I).strFormat
        dt.Rows(I).Item("Alignment") = usrSplitColumns(I).shtAlignment
      Next
      ' データセットに、データテーブルのインスタンスを追加
      dsetSplitName.Tables.Add(dt)
      ' XMLへ保存
      Using sWrite As IO.StreamWriter = New IO.StreamWriter(strPath, False, System.Text.Encoding.Default)
        dsetSplitName.WriteXml(sWrite, XmlWriteMode.WriteSchema)
      End Using
    End Sub
    
    

     

    また、XMLを呼び出すbasSplitReadメソッドについてですが、

    前後関係がわからないので、もし引数のusrSplitColumnsの各要素の初期化が行われて

    いない場合は、初期化を行う必要があります。

    Public Sub basSplitRead(ByVal strRecordCaption As String, ByRef usrSplitColumns() As usrSplitColumnsTag)
      Dim strPath As String = My.Application.Info.DirectoryPath & "\A.Xml"
      Dim dsetSplitName As DataSet = New DataSet("SplitSetup")
    
      ' /* FileOpen & Read */
      Using sRead As IO.StreamReader = New IO.StreamReader(strPath, System.Text.Encoding.Default)
        dsetSplitName.ReadXml(sRead)
        With dsetSplitName.Tables("SplitValue")
          For I As Short = 0 To 19
            ' 要素の初期化
            usrSplitColumns(I) = New usrSplitColumnsTag()
            ' 値をセット
            usrSplitColumns(I).strCaption = .Rows(I).Item("Caption")
            usrSplitColumns(I).strField = .Rows(I).Item("Field")
            usrSplitColumns(I).shtWidth = .Rows(I).Item("Width")
            usrSplitColumns(I).strFormat = .Rows(I).Item("Format")
            usrSplitColumns(I).shtAlignment = .Rows(I).Item("Alignment")
          Next
        End With
      End Using
    End Sub
    
    

    2010年10月20日 7:58

すべての返信

  • >アドバイスをいただけませんか

     

    まず、basSplitWriteメソッドでは、DataSetのインスタンスを生成した後、

    そのインスタンスの”SplitValue”というテーブルに対してデータの設定をループで行ってますが

    そもそもSplitValue”というテーブル自体が、まず存在していないと思います。

    なので、DataSetのインスタンスに対して、SplitValue”というDataTableインスタンスを追加

    する必要があります。

     

    追加したSplitValue”というテーブルには、列の定義がされていないので、

    定義する必要もあります。

     

    さらに、データを追加する際には、追加するための行を、テーブルに追加する必要があります。

     

    上記を行った場合、以下のような感じになるかと思います。

    Public Sub basSplitWrite(ByVal strRecordCaption As String, ByRef usrSplitColumns() As usrSplitColumnsTag)
      Dim strPath As String = My.Application.Info.DirectoryPath & "\A.Xml"
      Dim dsetSplitName As DataSet = New DataSet("SplitSetup")
      ' データテーブルを定義
      Dim dt As New DataTable("SplitValue")
      dt.Columns.Add("Caption")
      dt.Columns.Add("Field")
      dt.Columns.Add("Width")
      dt.Columns.Add("Format")
      dt.Columns.Add("Alignment")
      ' 引数のデータをデータテーブルにセット
      For I As Short = 0 To 19
        ' 行を追加
        dt.Rows.Add(dt.NewRow())
        ' 行にデータをセット
        dt.Rows(I).Item("Caption") = usrSplitColumns(I).strCaption ' --Error!
        dt.Rows(I).Item("Field") = usrSplitColumns(I).strField
        dt.Rows(I).Item("Width") = usrSplitColumns(I).shtWidth
        dt.Rows(I).Item("Format") = usrSplitColumns(I).strFormat
        dt.Rows(I).Item("Alignment") = usrSplitColumns(I).shtAlignment
      Next
      ' データセットに、データテーブルのインスタンスを追加
      dsetSplitName.Tables.Add(dt)
      ' XMLへ保存
      Using sWrite As IO.StreamWriter = New IO.StreamWriter(strPath, False, System.Text.Encoding.Default)
        dsetSplitName.WriteXml(sWrite, XmlWriteMode.WriteSchema)
      End Using
    End Sub
    
    

     

    また、XMLを呼び出すbasSplitReadメソッドについてですが、

    前後関係がわからないので、もし引数のusrSplitColumnsの各要素の初期化が行われて

    いない場合は、初期化を行う必要があります。

    Public Sub basSplitRead(ByVal strRecordCaption As String, ByRef usrSplitColumns() As usrSplitColumnsTag)
      Dim strPath As String = My.Application.Info.DirectoryPath & "\A.Xml"
      Dim dsetSplitName As DataSet = New DataSet("SplitSetup")
    
      ' /* FileOpen & Read */
      Using sRead As IO.StreamReader = New IO.StreamReader(strPath, System.Text.Encoding.Default)
        dsetSplitName.ReadXml(sRead)
        With dsetSplitName.Tables("SplitValue")
          For I As Short = 0 To 19
            ' 要素の初期化
            usrSplitColumns(I) = New usrSplitColumnsTag()
            ' 値をセット
            usrSplitColumns(I).strCaption = .Rows(I).Item("Caption")
            usrSplitColumns(I).strField = .Rows(I).Item("Field")
            usrSplitColumns(I).shtWidth = .Rows(I).Item("Width")
            usrSplitColumns(I).strFormat = .Rows(I).Item("Format")
            usrSplitColumns(I).shtAlignment = .Rows(I).Item("Alignment")
          Next
        End With
      End Using
    End Sub
    
    

    2010年10月20日 7:58
  • ありがとうございます。

    XMLファイル作成にはColumns.Addを行っておりますが、保存にはされていませんでした。

    単純なことですいませんでした。感謝です。

    2010年10月20日 8:28