質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.79%

Visual Basicで、DataSetに格納したデータをXMLとして変数に格納、値を返したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,669

kn0ws_dev

score 15

前提・実現したいこと

Visual Basic初心者です。

Visual Basicで、MySQLから取ってきた情報をDataSetに
格納し、XMLデータとして変数に出力し、XMLデータを返したいと考えています。

現状では、ローカルフォルダに.xmlファイルを生成し、それを読み込み、XMLデータを
返すようになっていますが、この一連の流れをxmlファイルを生成せず、プログラム上
でのみ実現したいです。

現状: MySQLからデータを取る→DataSetに格納→格納されたデータをXMLとして書き込む→
書き込んだxmlファイルを読み込む→値を返す

理想: MySQLからデータを取る→DataSetに格納→格納されたデータを変数Aに書き込む→
書き込んだ変数Aを読み込む→値を返す

発生している問題・エラーメッセージ

ソースコードにある通り、出来そうなことは試してみましたが、どうしてもうまくいきません。

該当のソースコード

Public Function Func1(ByVal sql As String) As XmlDocument
        Dim constr As String = "userid=root;password=mysql;host=localhost"
        Dim conn As MySqlConnection = New MySqlConnection(constr)
        Dim da As MySqlDataAdapter
        Dim ds As DataSet
        Dim filePath As String
        Dim result As XmlDocument
        Try
            conn.Open()
            filePath = String.Format("C:\Users\admin\Documents\data.xml")
            da = New MySqlDataAdapter(sql, conn)
            ds = New DataSet("user")
            da.FillSchema(ds, SchemaType.Source, "user")
            da.Fill(ds)
            ds.WriteXml(filePath)
            conn.Close()
            Dim xdoc As New XmlDocument()
            xdoc.Load(filePath)
            result = xdoc
        Catch ex As Exception
        End Try
        Return result
    End Function

試したこと

Public Function Func1(ByVal sql As String) As XmlDocument
        Dim constr As String = "userid=root;password=mysql;host=localhost"
        Dim conn As MySqlConnection = New MySqlConnection(constr)
        Dim da As MySqlDataAdapter
        Dim ds As DataSet
        'Dim filePath As String
        Dim xmlStr As String = ""
        Dim result As XmlDocument
        Try
            conn.Open()
            'filePath = String.Format("C:\Users\admin\Documents\data.xml")
            da = New MySqlDataAdapter(sql, conn)
            ds = New DataSet("user")
            da.FillSchema(ds, SchemaType.Source, "user")
            da.Fill(ds)
            'ds.WriteXml(filePath)
            ds.WriteXml(xmlStr)
            conn.Close()
            Dim xdoc As New XmlDocument()
            'xdoc.Load(filePath)
            xdoc.Load(xmlStr) 'xdoc.LoadXml(xmlStr)も試しました
            result = xdoc
        Catch ex As Exception
        End Try
        Return result
    End Function

補足情報(FW/ツールのバージョンなど)

Visual Studio 2015
ASP.NET Webサービス
.NET バージョン: 4.5.2
WebForms

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2019/04/18 16:37

    Web Forms か MVC かどっちですか? .NET のバージョン、MVC ならそのバージョンを書いてください。

    キャンセル

  • kn0ws_dev

    2019/04/18 16:49

    申し訳ありません。まだ触って間もない為、記述を忘れておりました。
    WebFormsで、.NETのバージョンは4.5.2です。

    キャンセル

回答 1

checkベストアンサー

+1

未検証ですが・・・

DataSet.WriteXml メソッドには引数に Stream を取るオーバーロードがありますのでそれを使って、その引数に Response.OutputStream を設定したらよさそうです。

お試しください。試してダメなら連絡ください(その際はどのように試したかの詳細情報も連絡ください)。

【追伸】

ASP.NET ということで、ブラウザでアクセスしてくるユーザーに .xml ファイルを返すと思っていましたが、違うのでしょうか?

質問に書かれたメソッドをよく見てみると  XmlDocument を返してますが、ASP.NET Web アプリでユーザーにそれを返すということはないはずですけど。

ユーザーに返すものとかではではなく、内部処理の話ですか?

【追伸2】

DatSset.WriteXml メソッド、XmlDocument.Load メソッドの、引数に Stream を取るオーバーロードを使って、MemoryStream 経由で「DB からデータを取得し XmlDocument オブジェクトを生成」をオンメモリで行うサンプルです。DB は MySQL のサンプル world の country テーブルです。

コードは C# ですが読めなければ変換サービス http://converter.telerik.com/ を使ってみてください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Xml;
using MySql.Data.MySqlClient;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = @"接続文字列";
            string commandText = "SELECT Code, Name, Continent, SurfaceArea, IndepYear, Population " + 
                                 "FROM country WHERE Region='North America'";
            DataSet dataset = new DataSet();
            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
                using (MySqlCommand command = new MySqlCommand(commandText, connection))
                {
                    MySqlDataAdapter adapter = new MySqlDataAdapter();
                    adapter.SelectCommand = command;
                    adapter.Fill(dataset);
                }
            }
            MemoryStream stream = new MemoryStream();
            dataset.WriteXml(stream, XmlWriteMode.WriteSchema);
            XmlDocument xmlDocument = new XmlDocument();
            stream.Position = 0L;
            xmlDocument.Load(stream);

            Console.WriteLine(xmlDocument.OuterXml);

        }
    }
}


結果は以下の通りです。(見やすくなるよう改行とインデントを入れてます)

<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:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="Table">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Code" type="xs:string" minOccurs="0" />
                <xs:element name="Name" type="xs:string" minOccurs="0" />
                <xs:element name="Continent" type="xs:string" minOccurs="0" />
                <xs:element name="SurfaceArea" type="xs:float" minOccurs="0" />
                <xs:element name="IndepYear" type="xs:short" minOccurs="0" />
                <xs:element name="Population" type="xs:int" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <Table>
    <Code>BMU</Code>
    <Name>Bermuda</Name>
    <Continent>North America</Continent>
    <SurfaceArea>53</SurfaceArea>
    <Population>65000</Population>
  </Table>
  <Table>
    <Code>CAN</Code>
    <Name>Canada</Name>
    <Continent>North America</Continent>
    <SurfaceArea>9970610</SurfaceArea>
    <IndepYear>1867</IndepYear>
    <Population>31147000</Population>
  </Table>

  ・・・中略・・・

</NewDataSet>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/19 12:49 編集

    依然として返事がありませんが、「DB からデータを取得し XmlDocument オブジェクトを生成」という操作をオンメモリで出来れば質問者さんの課題は 100% 解決と理解して・・・

    質問者さんのコードで使っている DataSet.WriteXml メソッド、XmlDocument.Load メソッドは引数に String 即ちファイルへのパスを取るものなのでファイル経由にならざるを得ません。

    DataSet.WriteXml メソッド、XmlDocument.Load メソッドには引数に Stream を取るオーバーロードがあるので、それらを使えばファイル経由ではなくて MemoryStream 経由にできる、即ち「DB からデータを取得し XmlDocument オブジェクトを生成」をオンメモリでできるはずです。

    お試しください。

    キャンセル

  • 2019/04/21 10:26

    上に書いた「DB からデータを取得し XmlDocument オブジェクトを生成」のサンプルコードを回答欄にアップしておきます。

    キャンセル

  • 2019/04/22 09:55

    SurferOnWww様、ご返信が遅れてしまい申し訳ありません。
    そして、素晴らしいサンプルコードをご提示頂きありがとうございます。
    早速試しました所、私の理想通りの動作をしていました。
    本当にありがとうございます。
    わざわざお時間を頂き申し訳ありません。
    本当に本当にありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る