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

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

ただいまの
回答率

87.48%

データベースから取得したデータを、vbhtmlに表示したい

解決済

回答 1

投稿 編集

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

score 16

環境:
windows10 64bit
visual studio 2019
ASP.NET webアプリケーション MVC
.NET Framework 4.7.2
VB.NET
MySQL
MySQL for Visual Studio 1.2
Connector NET 8.0
以前使用していたDB(masta)及びTable(masta_list)を流用(DBFirst)

経緯

MVCモデルの形で一連の流れを理解するために、スキャフォールディング等を利用せずにデータベースからデータを取得、表示をしようとしています。

データベースから全件取得→JSON形式に変換→そのまま表示(画面にJSON形式の全データ羅列)は出来たのですが、その中身を取り出して順に表示させることができません。

知りたいこと

JSONにこだわるわけではないので、
・取得したデータから値を一つずつ取り出せる
・htmlにリスト(ArrayList)変数を渡せる(javaのsetAttributeのようなもの)
・その変数を受け取り、中身を指定して参照できるもの(getAttributeのようなもの)
↑このようなメソッドを教えていただきたいです。
また、足りないものや無駄なものも時間がお許しでしたら教えていただきたいです。

やろうとしたこと

JsonConvert.DeserializeObjectメソッドがEntityに自動でマッピングしてくれるという情報を目にしたのでこちらのサイトを参考に書いてみました。https://itsakura.com/vbnet-object-json
しかしデータが複数ある(10件程)影響なのか、そもそも構文がおかしいのか、とりあえず名前だけを参照してみようしたのですができませんでした(TestDB.vb)。

ソース:
Contact.vbhtml
渡すものがわからず、変数をViewDataで参照しているだけです。
データの中身をうまく取り出せず、何も表示されません。

<h3>@ViewData("dMessage")</h3>


Entity.vb

Public Class Entity

    Public Property nom() As Integer
    Public Property name() As String
    Public Property kana() As String
    Public Property tell() As String
    Public Property mail() As String
    Public Property year() As Integer
    Public Property month() As Integer
    Public Property day() As Integer
    Public Property age() As Integer
    Public Property code() As Integer
    Public Property add1() As String
    Public Property add2() As String

End Class


HomeController.vb

Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index() As ActionResult
        Return View()
    End Function

    Function About() As ActionResult
        ViewData("Message") = "Your application description page."

        Return View()
    End Function

    Function Contact() As ActionResult

        'TestDBクラスのtestDBメソッドを呼び出し、
        '戻り値を変数に格納
        Dim test As New TestDB()
        Dim deserialized As String = test.testDB()

        ViewData("dMessage") = deserialized
        Return View()
    End Function
End Class


Test.vb

Imports Newtonsoft.Json

Public Class TestDB
    Friend Function testDB()

        'SQL文を引数にしてDAOクラスを呼び出す
        Dim SqlStr = "SELECT * FROM masta_list"
        Dim Dao As New DAO
        Dim DsJson As String = Dao.Connect(SqlStr)

        'Entityクラスにマッピングして値を参照したいがうまく行かない
        Dim entity As Entity = JsonConvert.DeserializeObject(Of Entity)(DsJson)

        Return entity.name  'nameには何も入っていない

    End Function

End Class


DAO.vb
データベースアクセスだけにしたかったが、Con.Close()を分ける方法がわからずに純粋なDAOにできませんでした

Imports MySql.Data.MySqlClient
Imports Newtonsoft.Json

'引数にSql文を渡すことでJSON形式のデータを返す
Public Class DAO
    Friend Function Connect(SqlStr)

        'データベース接続文字列の作成
        Dim Builder = New MySqlConnectionStringBuilder()

        '接続に必要な情報をBuilderに格納
        Builder.Server = "localhost"
        Builder.Port = 3306
        Builder.UserID = "root"
        Builder.Password = "password"
        Builder.Database = "masta"

        Dim ConStr = Builder.ToString()

        'データベースに接続
        Dim Con As New MySqlConnection
        Con.ConnectionString = ConStr
        Con.Open()

        'データ取得のためのアダプタを設定
        Dim Adapter = New MySqlDataAdapter(SqlStr, Con)

        'データを取得、セットする
        Dim Ds As New DataSet
        Adapter.Fill(Ds)

        'データをJSON形式にシリアライズし、返す
        Dim DsJson As String = JsonConvert.SerializeObject(Ds)
        Return DsJson

        'データベースの切断
        Con.Close()
    End Function

End Class


足りない情報等随時追加いたします。
よろしくお願いいたします。

追記

EDMを作成しようとすると、この画面が出て止まってしまいます。
イメージ説明

ソリューションの参照の一部です。
MySql.DataとMySql.Data.EntityFrameworkを入れても結果が変わりませんでした
参照

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • SurferOnWww

    2020/10/30 14:56

    > MySQL

    前のスレッドでは SQL Server (LocalDB) だったはずですか MySQL に変わったのですか? MySQL, Connector/NET, MySQL for Visual Studio のバージョンは何ですか?

    どうしても MySQL でなければならないということでなければ SQL Server を利用することをお勧めします。Connector/NET, MySQL for Visual Studio のバージョンによっては Visual Studio の Entity Framework 関係のデザイナが動かなかったということがありましたので。

    勉強中ということだと理解してますが、Visual Studio との相性の問題で動かないことの解決に時間と労力を費やすのは無駄ですし、SQL Server で勉強してから MySQL に進んだ方が結局は早そうですので。

    キャンセル

  • sad

    2020/10/30 15:37

    申し訳ございません。SQLServerを使用していたところ、上司に以前使っていたデータベースを利用できる方法でまずやってくれと指示を受け、MySQLにしました(外部のDBの利用方法を学ぶため)。前回いただいた回答は学習面、そしてこれから実務で使用する際に役立つと思います。ありがとうございます。

    MySQL for Visual Studio 1.2
    Connector NET 8.0
    この二つはわかりました、、MySQLがわかりません。申し訳ございません。

    キャンセル

  • sad

    2020/10/30 15:44

    ご指摘、ご提案ありがとうございます。
    もしご指摘の通りにうまく動かないということになった場合はその旨を伝えてSQLServerに移行しようと思います。
    とりあえず今は指示頂いたことを全力で終わらせたいと考えています。

    キャンセル

回答 1

checkベストアンサー

+1

データベースから取得したデータを、vbhtmlに表示したい

普通に ASP.NET MVC アプリを作るならそこに JSON が出てくることはないです(見当違いの方向に進んでいます)。

View に渡すべきは List<Entity> 型のオブジェクトです。

Visual Studio の ADO.NET Entity Data Model で EDM を作り、それをベースに Controller の Action Method で Linq to Entities を使って  List<Entity> オブジェクトを作り、それを View に渡すというのが普通のやり方です。

問題は MySQL for Visual Studio, Connector/NET と Visual Studio の相性で、古いバージョンのものはダメだったのですが、自分の環境の MySQL for Visual Studio 1.2.9, Connector/NET 8.0.19 と Visual Studio 2019 では問題なかったので、試してみてはいかがですか?

具体的な手順は、SQL Server の場合ですが、以下の記事の (1) ~ (10) を見てください。MySQL もほぼ同じ手順になります。

スキャフォールディング機能
http://surferonwww.info/BlogEngine/post/2017/07/23/creating-controller-and-view-in-mvc-using-scaffolding-function.aspx

以前作った簡単な MySQL のテーブルを使ったサンプルがありますので、それの画像を貼っておきます。

基になる MySQL の list テーブル

イメージ説明

Visual Studio で作成した EDM

イメージ説明

同時に自動生成されたコンテキストクラスと

イメージ説明

エンティティクラス

イメージ説明

スキャフォールディングで作った Controller (index 部分のみ) と

イメージ説明

それに対応する View

イメージ説明

結果

イメージ説明

もし、相性の問題で ADO.NET Entity Data Model で EDM を作れないという場合は、ADO.NET + Connector/NET を使って List<Entity> オブジェクトを作って View に渡してください。

MVCモデルの形で一連の流れを理解するために、スキャフォールディング等を利用せずにデータベースからデータを取得、表示をしようとしています。

Visual Studio の機能を利用しないでアプリを作るのは時間と労力の無駄です。理解したいなら、Visual Studio が作ったコードを見て理解するようにすべきです。

【追記】

下の 2020/11/02 09:59 の私のコメントで「後で回答欄に自分のプロジェクトの画像を貼っておきます」と言った件です。

質問者さんの場合は余計なものが入っています(その影響は分かりませんが)。バージョンも不明、設定も不明ですが、プロパティを見て比べてみてください。

MySql.Data

イメージ説明

MySql.Data.EntityFramework

イメージ説明

なお、自分の環境は MySQL とか Oracle などは入ってない Windows 10 Pro 64-bit の PC に、以下の記事のように MySQL 8.0.19 をインストールしています。

MySQL をインストールしました(その 3)
http://surferonwww.info/BlogEngine/post/2020/04/20/installation-of-mysql-on-new-desktop-pc.aspx

そうすると、MySql.Data, MySql.Data.EntityFramework は GAC にインストールされ、レジストリ, Program Files フォルダ, machine.config にも設定がなされます。

また、Visual Studio の拡張機能には MySQL for Visual Studio がインストールされます。

イメージ説明

そうすると、2020/10/30 17:43 のコメントで紹介した記事の「(2) 参照設定」のセクションのように参照を追加できるようになり。ADO.NET Entity Data Model を使って、上に紹介した記事の (1) ~ (10) のように EDM を生成できるはずです。

以上を読んでも解決できないということですと、ADO.NET Entity Data Model を使っての EDM の作成に関しては、自分はこれ以上お手伝いできることはなさそうです。

上の回答で、

相性の問題で ADO.NET Entity Data Model で EDM を作れないという場合は、ADO.NET + Connector/NET を使って List<Entity> オブジェクトを作って View に渡してください。

と書きましたが、その前に Entity Framework を使って List<Entity> オブジェクトを作れないか調べてみるのがよさそうです。

先のスレッド https://teratail.com/questions/300897 で行ったように、コンテキストクラス、エンティティクラス、web.config の接続文字列(MySQL 用の)を自分で書いて実装し、上の回答のコントローラーの画像で示したように db.Entity.ToList で List<Entity> オブジェクトを作れないか試してみることをお勧めします。

それがダメなら、ADO.NET + Connector/NET を使って List<Entity> オブジェクトを作るということにせざるを得ないと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/11/04 11:07

    こっそりと追記いたします。
    SQLServerで試してみたところ上手くいきました。スキャフォールディングはMySQLは難しいみたいです、、。
    Viewのテンプレートを利用しながら、自力でDB接続の設定をしてList<Entity>を返すことで一連の流れを行うことが出来ました。
    ありがとうございました。

    キャンセル

  • 2020/11/04 12:06

    MySQL を諦めて SQL Server にする前に、上の回答にも書きましたが、先のスレッド https://teratail.com/questions/300897 で行ったように、コンテキストクラス、エンティティクラス、web.config の接続文字列(MySQL 用の)を自分で書いて実装し、上の回答のコントローラーの画像で示したように db.Entity.ToList で List<Entity> オブジェクトを作れないか試してみることをお勧めします。

    キャンセル

  • 2020/11/04 13:59

    ありがとうございます。
    web.configに接続文字列を書いて、それをdb.Entity.ToListで利用するとList<Entity>オブジェクトができる、、の解釈で間違いないでしょうか?
    現状は、modelクラスとDAOクラスを作成し、DAOでMySQLの接続文字列を作成し接続、modelでSQL実行→List<Entity>にデータを格納、Controller→Viewに渡す、といった流れでできています(遠回りですが)。
    上記の件、時間を作って試してみます。

    キャンセル

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

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

関連した質問

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