- PR -

XMLのDiffGramを使ったDataSet更新

1
投稿者投稿内容
たけたけ
会議室デビュー日: 2005/01/06
投稿数: 5
投稿日時: 2005-01-06 19:44
外部で編集されたデータをDiffGram形式で読み取ってデータベースに適用させる
プログラムを作っています。
以下がソースです。

Dim ds as new DataSet
Dim conn As New OleDbConnection("○○○")
Dim adapter As New OleDbDataAdapter()
Dim queryString As String = "SELECT T_1.* FROM T_1"

adapter.SelectCommand = new OleDbCommand(queryString,conn)
adapter.Fill(ds,"T_1")

Dim updateDS as new DataSet

conn.Open()
updateDS = ds.Clone()
updateDS.ReadXml(Request.InputStream, XmlReadMode.DiffGram)
ds.Merge(updateDS)
adapter.Update(ds, "T_1")
ds.AcceptChanges()
conn.Close()

ソースはあっているような気がしているのですがエラーがでます。
updateDS.ReadXml(Request.InputStream, XmlReadMode.DiffGram)
の行で
The root element is missing.
Exception Details: System.Xml.XmlException: The root element is missing.
というエラーです。
きっとRequest.InputStreamが問題なのではと思っているのですが
Request.InputStreamを視覚的に確認する方法がわかりません。
MSDNで調べた以下のソースを試すと
Dim str As Stream, strmContents As String
Dim counter, strLen, strRead As Integer

' Create a Stream object.
str = Request.InputStream
' Find number of bytes in stream.
strLen = CInt(str.Length)
' Create a byte array.
Dim strArr(strLen) As Byte
' Read stream into byte array.
strRead = str.Read(strArr,0,strLen)

' Convert byte array to a text string.
For counter = 0 To strLen-1
strmContents = strmContents & strArr(counter).ToString()
Next counter

Diffgram形式の文字列ではなく数字の羅列が表示されます。

もし参考になるページ等がございましたら教えて下さい。宜しくお願いします。


開発環境は手打ちです。サーバーはwin server2003です。(外国サーバーです)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-01-07 21:35
引用:

たけたけさんの書き込み(2005-01-06 19:44)より:

ソースはあっているような気がしているのですがエラーがでます。
updateDS.ReadXml(Request.InputStream, XmlReadMode.DiffGram)
の行で
The root element is missing.
Exception Details: System.Xml.XmlException: The root element is missing.
というエラーです。
きっとRequest.InputStreamが問題なのではと思っているのですが
Request.InputStreamを視覚的に確認する方法がわかりません。


 エラーが「The root element is missing.」なので、Request.InputStreamの中身が問題でしょう。ここでStreamオブジェクトが取れているのだから、そのままファイルにでも吐き出してやればいいのでは?

 で、Requestの型はなんでしょう?これってHttpRequest?そのようですね。MSDNの…というのも、HttpRequest.InputStreamの説明のところに書いてあるものですね。数字の羅列?そうですね。Byte型に放り込んで、それの“値”を出力していますから。

 それで、これって、クライアントがサーバに投げる問い合わせ電文そのものじゃないですか?その中から特定の要素を抜き出す必要があるんじゃないですか?
_________________
たけたけ
会議室デビュー日: 2005/01/06
投稿数: 5
投稿日時: 2005-01-11 10:02
Jittaさん、返信ありがとうございます。
Request.InputStreamの中身を見るために、最初

Dim sw As StreamWriter
sw.Write(Request.InputStream)

とやってしまいだめでした。
Request.SaveAsを使うとうまくいきました。

中身を見てみると一見大丈夫(Diffgramとして)なのですが
これから細かくチェックしてみようと思います。
Diffgramをサーバーに送りつけた主はFlashMX2004のXMLconnectorで
ノンコードで作成されたDiffgramですので構文のミスよりは
エンコードの問題なのかもと、現時点では推測しています。
わかり次第報告致します。
たけたけ
会議室デビュー日: 2005/01/06
投稿数: 5
投稿日時: 2005-01-24 18:29
結果の報告です。
やはりエンコードに問題があったので(外国サーバだからでしょうか)
W_Stream = Request.InputStream
Dim SrFromStream As StreamReader = New StreamReader(W_Stream, Encoding.GetEncoding(932))
W_Str = "<?xml version=""1.0"" encoding=""Shift_JIS"" ?>" & SrFromStream.ReadToEnd()
として「Shift_JIS」にすることによってうまくいきました。
1

スキルアップ/キャリアアップ(JOB@IT)