ものがたり(旧)

atsushieno.hatenablog.com に続く

ReadXml()で読み込んだテーブルの列にint indexerでアクセスすべきでない件について

ここ

詳しい理由とベターな解決策も説明できるんですが、@IT利用規約第4条によると、ここで書いてしまうと@IT著作権が帰属すると書かれているようなので、勿体ないので書けません 。気が向いたら個人ページで書いてリンクを載せます。
と書いていた話。めんどっちいので@ITには追記しません(ていうか皆さん@IT利用規約には問題があると思いませんか? 皆さんにもこういうスタイルで意味のある文章は外だしすることをお薦めします*1)。

ていうかこんなもので生成したテーブルにintでアクセスしようなんていう人がいること自体信じられない…と言いたいところなんですが、そんな衝撃は半年前に既に受けていたので、ああまだいたかそんな香具師、っていう感じです。

さて、int indexerでアクセスすべきでない理由は、こんな感じです:

  • インスタンス中の要素に属性や省略可能な要素があれば、順序は不定になる
  • 親子関係(DataRelation)が生成される場合、そのキー(自動生成されるかも)がどこに入り込むか分からない
  • そもそもReadXml()が生成中のDataColumnをどう管理しているか分からない。HybridDictionaryやHashtableが中で使われていたら(実質的に)ランダムになる。

ReadXml()…というよりその内部で使用されるInferXmlSchema()…はまともなビジネス アプリケーションで使うべきものではありません。ReadXmlSchema()を使うか(これもかなり挙動不審ですが)、あるいはxsd.exeを使ってstrongly typed datasetを生成して使った方がいいでしょう(これがベスト)。

いずれにしても、きっちりスキーマを定義すべきだと思います。XML Schemaなんて書けない!ということであれば、DataSetをプログラムでカリカリと定義して、TypedDataSetGeneratorという標準クラスを使えば、カスタムDataSetクラスをCodeDomで生成できます。

ちなみに、DataColumnにOrdinalを設定しておけば、予定通りの順序で出てきます。XML Schemamsdata:Ordermsdata:Ordinalプロパティを使えば、スキーマにも書けます。いずれにしろReadXml()では不可能な話ですが。

*1:ていうかこんな利用規約は無効だと確信しているので、個人的にはどうでもいいんだけど