C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 30 を表示中)
■14278 / )  Re[3]: ADO.NetからXMLを使う方法
□投稿者/ 魔界の仮面弁士 (620回)-(2008/02/14(Thu) 14:01:22)
No14274 (ふるふる さん) に返信
> この場合、OleDbDataAdapter1を使わなくても、
> rs.Fiter = "条件"
> rs.Fields("サーバ名").Value
> でとってくればいいですね。

いいえ。それは止めておくべきでしょう。

絞り込みが必要なら、DataView なり BindingSource なりを使えば良いのですから、
先に書いたように、DataTable に受けて、DataTable 側から読み取るようにしてください。


どうしても ADODB だけでやるのであれば、せめて
 name = rs.Fields("DBServer").Value
ではなく、
 name = rs.Collect("DBServer")
の構文を使うことをお薦めします。


Fields 経由での取得を行うとなると、VB.NET においては
 Fs = rs.Fields
 F = Fs("DBServer")
 name = F.Value
 If Marshal.IsComObject(F) Then Marshal.ReleaseComObject(F)
 If Marshal.IsComObject(Fs) Then Marshal.ReleaseComObject(Fs)
のように、Fields コレクションを解放する必要がある(※)ため、コードが煩雑になってしまいます。


(※) ADODB の PIA を参照設定している場合、Fields は COM ではないため、解放不要です。
 しかし、Visual Studio によって自動生成された IA を参照設定している場合や レイトバインド時は、解放処理が必須となります。
 (PIA を使ったとしても、Recordset や Connection は ReleaseComObject が必要ですが)


> .NetからADODBを使うのはあまりよくないような気がしたんですが、
そのとおり、多用は避けるべきでしょう。
実際、負荷の高い状況での利用には適さないようですし。

http://support.microsoft.com/kb/910696/en-us
http://support.microsoft.com/kb/321415/ja


> テーブルをXML化した場合はADOの技術のほうがいいんでしょうか...
もちろん、ふるふるさんが最初に提示されたように、
 dataSet1.ReadXml("environ.xml")
 name = dataSet1.Tables("row").Rows(0)("DBServer")
のように読み取る事は可能ですが、この方法だと、row テーブルの列がすべて String 型になってしまいますし、
主キー情報なども保持されません。(今回は、すべての列がテキストなので、たまたま問題が無かっただけで)

environ.xml の内容をキチンと解析して、型情報などを維持した DataSet/DataTable を
組み立てるには、今回の方法を用いた方が楽である、という事です。



もし、Recordset を使わず、かつ、元データの型情報なども維持させたいのであれば、
XSLT などを用いて、元の XML データを下記の形式に加工しておくという手もあります。

これならば、dataSet1.ReadXML するだけで、型情報なども維持されますよ。


<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="NewDataSet" msdata:IsDataSet="true"
     msdata:MainDataTable="environ" msdata:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="environ">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Environ" type="xs:string" minOccurs="0" />
                <xs:element name="Machine" type="xs:string" minOccurs="0" />
                <xs:element name="MyPath" type="xs:string" minOccurs="0" />
                <xs:element name="DBServer" type="xs:string" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <environ>
    <Environ>Development</Environ>
    <Machine>hogehage</Machine>
    <MyPath>DEV</MyPath>
    <DBServer>hogehage</DBServer>
  </environ>
  <environ>
    <Environ>Testing</Environ>
    <Machine>hogehage</Machine>
    <MyPath>TEST</MyPath>
    <DBServer>hogehage</DBServer>
  </environ>
  <environ>
    <Environ>Production</Environ>
    <Machine>hoge</Machine>
    <MyPath>APPL</MyPath>
    <DBServer>hoge</DBServer>
  </environ>
  <environ>
    <Environ>QA</Environ>
    <Machine>hogehage</Machine>
    <MyPath>APPL</MyPath>
    <DBServer>hogehage\QA</DBServer>
  </environ>
</NewDataSet>

返信 編集キー/


管理者用

- Child Tree -