none
データベースのプログラミングについて。 RRS feed

  • 質問

  • 年の瀬のお忙しい中、申し訳ありません。
    一生懸命、本などを数冊購入してみましたが、問題が解決できませんでしたので、教えていただければ幸いだと思いまして、思い切って、送信を差し上げてしましました。
    ADO.netのデータベースプログラミングですが、DataGridコントロールなどを使わないで、データベースを操作してみたいのですが、どうも記述方法がわかりません。
    接続型で、コードを書いてみようと思います。
    c:\DATABASE\Data.mdb データベース名
    table1 テーブル名
    field1 field2 field3 ・・・・・・。

    field1、2、3、をListboxに表示させたいのですが、とりあえず、データベースより、fieldの値を習得する記述の方法を教えてください。

    本を読んでも、コントロールを使う方法しか書いていません。
    以前は、DAOなどで、コードを書いていたのですが、ADO.netになって、すっかり様相が変わってしまい、さっぱりわかりません。
    お忙しい中とは存じますが、どうか、よろしくお願い申し上げます。
    申し訳ありません

     

    2008年12月31日 14:21

回答

  •  タッチ2 さんからの引用

    以前のVBでしたら、リストボックスで、リストボックス内で、フォーカスが選択している部分をListIndexなどの、Index値で、選択場所を指定できて、その選択部分の文字列を収得できていたと思いますが、VB2008でも、同じようなことができるのでしょうか?

     

    以下のようにすれば可能です。

     

    ListBox1.Items(ListBox1.SelectedIndex).ToString()

     

     タッチ2 さんからの引用

    Me.ListBox1.DisplayMember

    Me. ListBox1.ValueMember

     Me.ListBox1.DataSource

     

    上記はデータがバインドしている場合です。ListBoxに限らず、これらのコントロールで値を表示するには2通りあります。1つはコントロールに一つずつ値を追加していく方法で、もう一つはデータソースを指定して後の表示はコントロールに任せてしまう方法です。DisplayMemberなどを使用する方法は後者になります。

     

     タッチ2 さんからの引用

    全く自身がありませんが、この際、思い切って無駄の多少の投資をするかも知れませんが、良い参考書があれば教えてください。

    バイブルといおうか・・・・。


    バイブルはMSDNライブラリです。ただ、系統だてて説明されていませんし、平易な言葉で書かれていませんので、慣れというかある程度実力のある人向きかもしれません。
    しかし、今回の場合のようにDisplayMemberなどのキーワードが見つかったのですから、まずはそのキーワードをMSDNライブラリで確認されることは必須の作業です。その上でわかりやすく書かれているWebページをネットで検索されるのが良いと思います。少なくともサンプルコードがどのようなことを行っているのかを完全に理解するように解読していかなければ力が付いていきません。理解できないところがあれば掲示板などで質問して下さい。
    最近はこの分野の参考書をあまり読まないので、良い参考書はちょっと思いつきません。ごめんなさい。

    2009年1月5日 8:58
    モデレータ

すべての返信

  • こちらが参考になると思います。

     

    結果セットを返すデータ コマンドの実行
    http://msdn.microsoft.com/ja-jp/library/aa984368(VS.71).aspx

    2009年1月1日 2:37
    モデレータ
  • trapemiyaさん、早速のお返事ありがとうございました。

    早速、URLを覗いてみましたが、なんだか意味がさっぱりです。

    本当に超初心者なので、できれば、もっとわかりやすくお願いしたいのが本心です。

    申し訳ありません。

    本などを見ると、

    Connectionオブジェクトを開けて、

    Commandオブジェクトを作って

    ExcuteReaderメソッドを実行します。

    と記述がありますが、どこへデータベース名を書けばよいのか、

    テーブル名は?フィールド名は?

    下記はなんだか、DataReaderオブジェクトのようでうが、

    なんがかさっぱりです。

     

    ' Visual Basic
    Dim dreader As System.Data.OleDb.OleDbDataReader
    OleDbCommand1.CommandText = "authors"
    OleDbCommand1.CommandType = CommandType.TableDirect
    OleDbConnection1.Open()
    dreader = OleDbCommand1.ExecuteReader(CommandBehavior.CloseConnection)
    Dim s As String = ""
    While dreader.Read()
       s &= dreader("au_id").ToString() _
         & vbTab & dreader("au_fname").ToString() _
         & " " & dreader("au_lname").ToString & ControlChars.CrLf
    End While
    TextBox1.Text = s
    dreader.Close()

    非接続型では、Datasetオブジェクトを使用するのですよね、

    クライアントPCやサーバーPCなどは使用しないので、とりあえずは接続型でコードを書いてみようと思います。

    本当に初心者で申し訳ありません。

    お差し支えなければ、本当に、一から教えていただきたいと希望いたします。

    お忙しい中、お返事どうもありがとうございました。

    2009年1月1日 7:39
  • 下記のドキュメントも参照してみてください。

    MSDN

    ADO.NET
        ADO.NET の概要
            ADO.NET のコード例
              .NET Framework Data Provider for OLE DB

     

        ADO.NET でのデータの取得および変更

            DataAdapter と DataReader (ADO.NET) 
                DataAdapter からの DataSet の読み込み (ADO.NET)


    System.Data.OleDb 名前空間

    2009年1月1日 15:10
  • とりあえずコードを書いて説明を付加してみました。

     

    Code Snippet

    Imports System.Data.OleDb
    Imports System.IO

     

    Public Class MdbConnect

     

        Private Sub cbtn_Read_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbtn_Read.Click

     

            'データベースへの接続オブジェクトを作成。データベースの指定はコンストラクタにて指定。
            Dim dbconnect As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Path.Combine(Application.StartupPath, "db1.mdb"))
            'データベースへコマンドを発行するコマンドオブジェクトを作成
            Dim dbcommand As New OleDb.OleDbCommand
            'テーブルを読むためのデータリーダーオブジェクトのインスタンスを保存する変数を宣言
            Dim reader As OleDb.OleDbDataReader

     

            'コマンドオブジェクトに、どのデータベースへコマンドを発行するのか教える。つまり、接続オブジェクトを与える。
            dbcommand.Connection = dbconnect
            'コマンドオブジェクトに発行してもらうSQL文を与える。
            dbcommand.CommandText = "select name from table1"
            '上記のCommandTextの種類を指定。CommandType.TextはSQL文であることを表す。
            dbcommand.CommandType = CommandType.Text

     

            '接続オブジェクトをここで初めて実際にデータベースにつなぐ。
            dbconnect.Open()

     

            'コマンドを発行し、データベースから接続型でデータを読む込む際に使用するデータリーダーオブジェクトを得る。
            reader = dbcommand.ExecuteReader()

     

            '得られたデータリーダーを利用して、レコードを1件ずつ読み、ListBoxに追加する。
            While (reader.Read())
                ListBox1.Items.Add(reader("name"))
            End While

     

            'データリーダーを閉じる。
            reader.Close()
            'データベースへの接続を閉じる。
            dbconnect.Close()

        End Sub

     

    End Class

     

     

     

    2009年1月2日 3:26
    モデレータ
  • 解説つきのきめ細かい説明でありがとうございました。

    早速、頑張ってみたところ、データベースに接続することができました。

    なんだか、接続型、非接続型とまだまだ、理解しなければいけない点が沢山ありますが、徐々になれていこうと思います。

    データベースに接続は確認できましたが、これからも、値を収得したり、レコードを更新したり、削除したり、追加したりする作業が多々ありまして、なかなか、気の重い感じが取りきれません。

    ADOの場合でしたら、VBのリファレンスの本にいろいろDBの操作するコマンド、メソッドですが載っていましたが、VB2008となると、探すのも一苦労です。VB.netのプログラミング活用編(結構分厚い本)ですが、見ても、解説がほとんどで、レコード操作の言語が分からないのが実情です。

    とりあえず、自力で探してみます。

    レコードカウントを収得するメソッドなど教えてください。

    それと、非接続型で、DetaSetを宣言すると、OleDataReader()など使えないのですよね。

    接続型、非接続型によって、使うメソッドも異なってくるのですね。

    とりあえずは、接続型で頑張ってみるつもりです。

    きめ細かいご説明でありがとうございました。

    2009年1月3日 14:30
  •  タッチ2 さんからの引用

    データベースに接続は確認できましたが、これからも、値を収得したり、レコードを更新したり、削除したり、追加したりする作業が多々ありまして、なかなか、気の重い感じが取りきれません。


    基本的には発行するSQL文が変わるだけですので、それほど難しく考えられる必要はないと思います。

     

     タッチ2 さんからの引用

    VB.netのプログラミング活用編(結構分厚い本)ですが、見ても、解説がほとんどで、レコード操作の言語が分からないのが実情です。

    プログラミングMicrosoft ADO.NET2.0という本があります。お値段も高く、結構厚い本ですが、お薦めです。

     タッチ2 さんからの引用

    レコードカウントを収得するメソッドなど教えてください。

    以下を参考にして下さい。

     

    Visual C# で OleDbDataReader クラスまたは SqlDataReader クラスを使用するときに、フェッチされるレコード数を示す RecordCount プロパティが存在しない
    http://support.microsoft.com/kb/308352/ja

     

     タッチ2 さんからの引用

    それと、非接続型で、DetaSetを宣言すると、OleDataReader()など使えないのですよね。


    DataSetとOleDataReaderは直接関係ありません。DataSetは読んできたデータを入れておく入れ物であり(正確にはDataSet内にあるDataTableに入ります)、そこにデータを入れるには一般的にOleDataAdapterが使用されますが、OleDataReaderで一件ずつ読みながら入れることもできます。

     

     タッチ2 さんからの引用

    接続型、非接続型によって、使うメソッドも異なってくるのですね。

    OleDataReaderを使用すると接続型になります。ADO.NETでは非接続型を用いることが一般的です。つまり、DataAdapterやTableAdapterを使用して一気にDataTableに複数のレコードを取得した後、データベースとの接続を切ります。これにより楽観的同時実行制御が容易に実現できるからです。

    2009年1月4日 2:30
    モデレータ
  •  こんにちは。私もVB2005でのアクセスmdbの読込みには関心持っていました。

     しかし、確かに色々読んでも分かり難いと思いました。それに以前から、DAOやADOあるいはADODCなど、変遷が激しく、つきあっていられないという気分から、DataBaseに関しては避けていました。しかしこの際、色々参考させて頂き、ReTryしてみました。

     もう解決された様でもありますが、当方もどうにか一つのやり方が分かりましたので、一つの例として挙げさせてもらいます。

     

    Imports System.Data.OleDb

     

      Dim conn As New System.Data.OleDb.OleDbConnection()
      conn.ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;Data source=.\abcd.mdb"
      conn.Open()
    '- テーブル名を取得 -
      Dim myTable As DataTable
      myTable = conn.GetOleDbSchemaTable _
           (System.Data.OleDb.OleDbSchemaGuid.Tables, _
            New Object() {Nothing, Nothing, Nothing, "TABLE"})
      Dim moj As String = ""
      Dim myRow As DataRow
      For Each myRow In myTable.Rows
        moj &= " " & myRow(2)
      Next
      Label1.Text &= vbCrLf & moj

      moj = ""
    '- 方針変え、SQLコマンド利用か? -
      Dim cmd As New OleDb.OleDbCommand()
      Dim rs As OleDb.OleDbDataReader
      cmd = conn.CreateCommand()
      cmd.CommandText = "select * from テーブル名"  ' * 全フィールド
      rs = cmd.ExecuteReader()
    '- フィールド名を取得 -
      Dim ii As Integer
      For ii = 0 To rs.FieldCount - 1
        moj &= rs.GetName(ii) & " "
      Next

      moj &= vbCrlf
    '- フィールドデータを取得 -
      Do While rs.Read()
         For ii = 0 To rs.FieldCount - 1
           moj &= rs.Item(ii) & " "
         Next
         moj &= vbCrLf
      Loop
      Label1.Text = moj
      conn.Close()

     

     DataBaseでは、テーブル名やフィールド名は利用者が把握していて当然、という考え方があるのかもしれません。それで、テーブル名の取得など解説されたページが容易に見つかりません。しかし、従来からのAccess利用者としては、ソフト機能としてテーブル名はガイドしてもらいたい所です。

     上記サンプルのうち、テーブル名取得部分のみネット上から参考にした記述で、ステートメントの意味はあまり分かっていません。しかし、その他については、全部VB2005Helpで見つけたもので、ほぼ理解できています。

     上記例では、データ量が少ないと仮定して、全データを取得してLabel1.Textに表示しています。ご参考までに、どうぞ。内容的に既に書かれた書き込みと重複した部分もありますが、通しで書かないと分かり難いと考えたからです。他意はありません。

    2009年1月4日 4:08
  •  葉流奈津 さんからの引用

     DataBaseでは、テーブル名やフィールド名は利用者が把握していて当然、という考え方があるのかもしれません。それで、テーブル名の取得など解説されたページが容易に見つかりません。しかし、従来からのAccess利用者としては、ソフト機能としてテーブル名はガイドしてもらいたい所です。


    テーブル名等の定義が不定であるという様な状況が

    データベース管理用のソフトウェアを作成するという様な場合くらいしか思いつきません。
    単に開発中にデータベースの定義を確認したいという事であれば
    そういう場合は(mdbであれば)Accessを使用すればよいと思います。
    # VB.NET等はデータベース(管理)用のソフトウェアではないので。
    所詮ツールなので適材適所だと思います。
    もしデータベース管理用のソフトウェアがない場合でも

    Visual Studioのサーバーエクスプローラのデータ接続を利用するという方法もあります。

     葉流奈津 さんからの引用

     上記サンプルのうち、テーブル名取得部分のみネット上から参考にした記述で、ステートメントの意味はあまり分かっていません。しかし、その他については、全部VB2005Helpで見つけたもので、ほぼ理解できています。

    「テーブル名の取得など解説されたページが容易に見つかりません。」と書かれてましたが
    参考にされたネット上の記述というのはMSDNでしょうか?

    MSDN
        OleDbConnection クラス
            GetOleDbSchemaTable メソッド

    2009年1月4日 19:05
  • ああ、これはどうも。

     

    > テーブル名等の定義が不定であるという様な状況がデータベース管理用の
    > ソフトウェアを作成するという様な場合くらいしか思いつきません。
    > 単に開発中にデータベースの定義を確認したいという事であれば
    > そういう場合は(mdbであれば)Accessを使用すればよいと思います。

     

    アプリケーションからmdbを参照したいので、上記のように言っています。
    Accessを使わないのはには意味があります。
    つまり、mdbの内容をアプリに表示したいからです。


    > # VB.NET等はデータベース(管理)用のソフトウェアではないので。
    > 所詮ツールなので適材適所だと思います。

     

    用途を限定する必要は無いように思いますが。
    DataBase全般についてでなく、mdbファイルを参照する場合の話です。

     

    > 「テーブル名の取得など解説されたページが容易に見つかりません。」と
    > 書かれてましたが参考にされたネット上の記述というのはMSDNでしょうか?

     

    GetOleDbSchemaTableメソッドの記述が、VB2005Helpにあるのは承知してます。
    しかしその後の「テーブル名を取得する」方法が見当たらなかった。

       Dim myRow As DataRow
       For Each myRow In myTable.Rows
         moj &= " " & myRow(2)
       Next

    この部分の、myRow(2) にテーブル名が出てくるという事を、ネット上で見たのです。

    MSの関連サイトではありません。(URLは忘れた。)
    VB2005Helpにも、記述は無くはないでしょうが、見つけられなかったのです。

     

    【補足】

    後で、探したら見つかりました。

    http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbconnection.getoledbschematable(VS.80).aspx

    中に、「データベース内のテーブル一覧を返す例を次に示します。」記述があった。

    ここに探し物があったと、気づくのが難しかったようです。

    2009年1月5日 2:35
  • 沢山のアドバイスをありがとうございました。

    なんだか、やる気が沸いてきます。

    接続型、非接続型、いまだに苦労してますが、そのうちに慣れてくるやもしれません。

    ありがとうございます。

    早速

    >プログラミングMicrosoft ADO.NET2.0という本があります。お値段も高く、結構厚い本ですが、お薦めです。

    の本のを探してみます。

     

    それと、もう一点のみ、教えてください。

    以前のVBでしたら、リストボックスで、リストボックス内で、フォーカスが選択している部分をListIndexなどの、Index値で、選択場所を指定できて、その選択部分の文字列を収得できていたと思いますが、VB2008でも、同じようなことができるのでしょうか?

    いろいろなプログラミングのサンプルをみてみましたが、

    Me.ListBox1.DisplayMember 

    Me. ListBox1.ValueMember 

     Me.ListBox1.DataSource 

    上記のようなメソッドなんか初めてみます。

    どこで、上記のような勉強や、知識の習得をすればよいのでしょうか?

    結局、本を参考にするしかないですよね。

     

    全く自身がありませんが、この際、思い切って無駄の多少の投資をするかも知れませんが、良い参考書があれば教えてください。

    バイブルといおうか・・・・。

     

    本当に、一から教えて頂くことになってしまいまして申し訳ありません。

    お願い申し上げます。

    2009年1月5日 6:43
  •  タッチ2 さんからの引用

    以前のVBでしたら、リストボックスで、リストボックス内で、フォーカスが選択している部分をListIndexなどの、Index値で、選択場所を指定できて、その選択部分の文字列を収得できていたと思いますが、VB2008でも、同じようなことができるのでしょうか?

     

    以下のようにすれば可能です。

     

    ListBox1.Items(ListBox1.SelectedIndex).ToString()

     

     タッチ2 さんからの引用

    Me.ListBox1.DisplayMember

    Me. ListBox1.ValueMember

     Me.ListBox1.DataSource

     

    上記はデータがバインドしている場合です。ListBoxに限らず、これらのコントロールで値を表示するには2通りあります。1つはコントロールに一つずつ値を追加していく方法で、もう一つはデータソースを指定して後の表示はコントロールに任せてしまう方法です。DisplayMemberなどを使用する方法は後者になります。

     

     タッチ2 さんからの引用

    全く自身がありませんが、この際、思い切って無駄の多少の投資をするかも知れませんが、良い参考書があれば教えてください。

    バイブルといおうか・・・・。


    バイブルはMSDNライブラリです。ただ、系統だてて説明されていませんし、平易な言葉で書かれていませんので、慣れというかある程度実力のある人向きかもしれません。
    しかし、今回の場合のようにDisplayMemberなどのキーワードが見つかったのですから、まずはそのキーワードをMSDNライブラリで確認されることは必須の作業です。その上でわかりやすく書かれているWebページをネットで検索されるのが良いと思います。少なくともサンプルコードがどのようなことを行っているのかを完全に理解するように解読していかなければ力が付いていきません。理解できないところがあれば掲示板などで質問して下さい。
    最近はこの分野の参考書をあまり読まないので、良い参考書はちょっと思いつきません。ごめんなさい。

    2009年1月5日 8:58
    モデレータ
  •  

     

    ↓  trapemiyaさんの伝言です。

    バイブルはMSDNライブラリです。ただ、系統だてて説明されていませんし、平易な言葉で書かれていませんので、慣れというかある程度実力のある人向きかもしれません。
    しかし、今回の場合のようにDisplayMemberなどのキーワードが見つかったのですから、まずはそのキーワードをMSDNライブラリで確認されることは必須の作業です。その上でわかりやすく書かれているWebページをネットで検索されるのが良いと思います。少なくともサンプルコードがどのようなことを行っているのかを完全に理解するように解読していかなければ力が付いていきません。理解できないところがあれば掲示板などで質問して下さい。
    最近はこの分野の参考書をあまり読まないので、良い参考書はちょっと思いつきません。ごめんなさい。

     

    ありがとうございます。

    なかなか、きびしいですね。

    少しずつですが、前に進んでいこうと思います。

    まだまだ、未熟者ですが、よろしくお願い申し上げます。

    2009年1月5日 12:33