none
フォームのDataGridviewへの表示について RRS feed

  • 質問

  • VB初心者です。フォーム上のボタンをクリックするとdataGridViewにSQLのデータベースを表示させたいのですが・・・

    ある書籍を購入しコードを書いているのですが、VBの理解が足らずなぜ表示できないのか分かりません。
    また、コードの意味等初心者でも分かるようどなたか詳しい方ご教授下さい。

    VB2010 データベースの名前はDa テーブル名は商品名です。
    Provider やdataSourceの書き方はこれでいいのでしょうか?

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    Dim dAdp As OleDb.OleDbDataAdapter
    Dim dSet As DataSet = New DataSet("商品名")
    Dim cn As OleDb.OleDbDataAdapter = New OleDb.OleDbConnection("Provider=.NET Framework Microsoft SQL Server Compact 3.5 用データ プロバイダー;" & "Source=|DataDirectory|\MyDatabase#Da.sdf;")

    dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 商品名", cn)
    dAdp.Fill(dSet, "_MyDatabase_DaDataSet.xsd")
    Me.DataGridView1.DataSource = dSet.Tables("商品名")

    End Class

    ちなみにエクセルのVBAの理解は多少あります。よろしくお願いします

    2014年5月15日 12:54

すべての返信

  • こんな

        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim dAdp As OleDb.OleDbDataAdapter
            Dim dSet As DataSet = New DataSet("商品名") 'これはデータセットに付ける名前を指定しています。テーブル名と合わせる必要はありません
    
            'プロバイダの指定を間違えています。
            Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;" _
                                          & "Data Source=|DataDirectory|\Da.sdf") '#は使いません普通にディレクトリ区切りの\でいいです
    
            dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 商品名", cn)
            dAdp.Fill(dSet, "商品名") '2個目の引数はDataTableに付ける名前です。
            Me.DataGridView1.DataSource = dSet.Tables("商品名") 'Fillで指定したテーブル名を指定して取り出します。一致していないと当然取り出せません。
        End Sub


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2014年5月15日 13:56
  • gekkaさんの回答で解決済みになればそれはそれで良いのですが、その場合でも気になることがありますので書かせていただきます。

    まず、最低でもご自分で書かれているコードがどのようなことを行うのかを理解して下さい。そして、自分でもこれで動くはずなんだけど動かない、どうしてだろう?と質問されるのが普通です。そうではなく、何だかわからないけど書籍のコードを見様見真似で写して、これで動かない、コードが何をやっているのかわからないというのは、残念ながらまだ質問するレベルに達していません。質問するよりも前にご自分で勉強できることがまだまだあります。

    プログラミングが上達する方法の一つは、良いコードをたくさん読み、そしてそのコードの意味をしっかりと理解することです。今回、gekkaさんのコードで、じっくりと流れを追い、完璧に何をやっているか理解する努力をしてみて下さい。おそらく書籍にも動作するコードが載っているはずですので、そちらもまずは十分に自分のものとし、それからご自分でコードを書いてみてください。ご自分で書かれたコードの動作を、他人に説明できるか確かめてみて下さい。他人に説明できるのであれば、十分にご自分のものとされています。

    また、Visual Studioにはデバッグ機能があります。自分の思い通りに動いているか、例えばブレークポイントで中断して、そこの値を確かめることができます。ExcelのVBAにも同じような機能がありますので、ご存知かもしれません。このように進めれば、どこまでが正しく書けていて、どこからが正しく書けていないかがわかります。デバッグ機能を使うことは、プログラミングが上達する上で大きな力になってくれるはずです。

    データベースの扱い方がわからなければ、ADO.NETをキーワードにネットや書籍を探し、勉強してみて下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年5月15日 14:25
    モデレータ
  • 前のスレッドの続きですか?

    であれば、そこでは開発環境は以下のように書いてあったのですが、これは同じですか?

    > Windows vista にVB2010expressとSQL2012を使用しています。

    そして、SQL Server 2012 が Express 版ではないので Express 版の使用が前提のチュートリアル(例えば下記)どおりにやってもうまく行かないということですか?

    10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (VB)
    http://code.msdn.microsoft.com/10-ADONET-VB-1c64942f/

    もしくは、Visual Studio と SQL Server の接続をあまり詳しく書いてないチュートリアル(例えば下記)を参考にしているが、うまく行かないということですか?

    チュートリアル : データベースへのデータの保存 (単一テーブル)
    http://msdn.microsoft.com/ja-jp/library/0f92s97z(v=vs.100).aspx

    上記の想像が当たっているとすると、アップされたコードでは接続文字列やデータプロバイダが違うので、うまく行きません。VB2010 Express(アプリではなく VB2010 そのもの) は SQL Server 2012(Express 版ではない)に接続できないという問題もあります。

    まずはご自分の開発環境をはっきりさせてください。



    • 編集済み SurferOnWww 2014年5月16日 0:44 一部追記
    2014年5月16日 0:40
  • takabobo さま よろしく。

    VB2010 と SQL Compact3.5 の既存データベースの組み合わせですね。
    gekka さまがコードを示して下さり、trapemiya さまが習得の指針を示して下さったので、
    初心者向けに、VB での お勧めの方法を書きます。
    勿論、コードをご自分で、全て書くのは、自由度も高いですし、習得にも有益だと思います。
    でも、混乱し易いと思いますので、最初はこれでは如何でしょうか。

    さて、方法。   以下 VB2008sp1EE で試しました。 VB2010 でも同じかと。

    アクションバーから、データ(A) > データソースの表示(S) と進み、
     データソースで 新しいデータソースの追加... をクリック。
     データソース構成ウィザードで、 データベースを選択。 次へ。
     新しい接続(C) をクリック。
     接続の追加 中央 データベース(D) で 参照(B)... をクリック。
                     尚、 作成(E)... を選べば、新規データベースになりますね。
     データベースを指定。 開く(O) をクリック。
     テスト接続(T) をクリック。   テスト接続に成功しました と出れば OK。
     次へ。             接続文字列が準備されます。
     データベースをコピーしますか と、聞かれますので、お勧めは いいえ 選択。元の場所のデータベースを利用します。
                                   はい を選択では、プロジェクト内にコピーされます。
     接続文字列をアプリケーション構成ファイルに保存 で 次へ。
     データベースオブジェクトの選択 でテーブルを指定し 次へ。 (テーブルのノードをクリックすると展開されます。チェックボックスをチェック)
     完了() クリック。
    これで、データソースが準備されました。

    ここで、フォームのデザイン画面に移り、
    アクションバーから、データ(A) > データソースの表示(S) と進み、
    必要なテーブルをフォームにドロップすれば、標準では、DataGridView が表示されます。

    さて、自動生成されたコードを見て見ると、Address データベース の AddressBase テーブル では。

    Public Class Form1
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'TODO: このコード行はデータを 'AddressDataSet.AddressBase' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
            Me.AddressTableAdapter.Fill(Me.AddressDataSet.AddressBase)
    
        End Sub
    
        Private Sub AddressBaseBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddressBaseBindingNavigatorSaveItem.Click
            Me.Validate()
            Me.AddressBaseBindingSource.EndEdit()
            Me.TableAdapterManager.UpdateAll(Me.AddressDataSet)
    
        End Sub
    End Class

    もし、ボタンで DataGridView に表示したければ、今お書きの様に、イベントハンドラを加えて、
    該当コード部分 Me.AddressTableAdapter.Fill(Me.AddressDataSet.AddressBase)
    を移動します。
    ボタンのクリック以前に DataGridView そのものを出したくない時には、
    Load イベントに DataGridView の Visible = False  ボタン イベントに Visible = True です。

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.AddressBaseDataGridView.Visible = True
            Me.AddressBaseBindingNavigator.Visible = True
            Me.AddressBaseTableAdapter.Fill(Me.AddressDataSet.AddressBase)
        End Sub

    尚、書籍の流れとは異なると思いますので、別の時に、試して見て下さい。


    • 編集済み ShiroYuki_Mot 2014年5月16日 2:27 コード訂正ミス
    2014年5月16日 1:46
  • SurferOnWww さま いつもお世話になります。

    あのう、接続文字列を見ると compact ってありますけど ... 。 余計な書き込みで すみません。

    2014年5月16日 1:59
  • > 接続文字列を見ると compact ってありますけど ... 。

    それは知ってます。

    前のスレッドで SQL2012 と書いてありましたので、それを知った上で確認しています。

    初心者の方の質問には、時々、実際の開発環境とかけ離れたコードがアップされていることもありますので、特に注意が必要と思ってます。

    SQL Server を諦めて Compact にしたのか、SQL Server のままいろいろやってみてダメだった結果をそのままアップしたのか、前のスレッドの質問とは全然関係ないのか、そもそも前のスレッドの時からずっと Compact だったのか、そんなことはエスパーでもない私には分かりませんし。

    • 編集済み SurferOnWww 2014年5月16日 6:11 一部追記
    2014年5月16日 2:39
  • SurferOnWww さま 拝見しました。

    ご存知の上での書き込みでしたか。 大変、失礼致しました。

    2014年5月16日 2:55
  • 丁寧な解説ありがとうございました。少しずつではありますが理解できたつもりです。

    2014年5月25日 11:34
  • しっかりと理解し、意味を確かめながらやっていきたいと思います。

    2014年5月25日 11:35