トップ回答者
XMLの保存がうまくいきません

質問
-
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 SubPublic 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
回答
-
>アドバイスをいただけませんか
まず、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
- 回答としてマーク VS2008初心者 2010年10月20日 8:25
すべての返信
-
>アドバイスをいただけませんか
まず、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
- 回答としてマーク VS2008初心者 2010年10月20日 8:25