トップ回答者
データベースのプログラミングについて。

質問
-
年の瀬のお忙しい中、申し訳ありません。
一生懸命、本などを数冊購入してみましたが、問題が解決できませんでしたので、教えていただければ幸いだと思いまして、思い切って、送信を差し上げてしましました。
ADO.netのデータベースプログラミングですが、DataGridコントロールなどを使わないで、データベースを操作してみたいのですが、どうも記述方法がわかりません。
接続型で、コードを書いてみようと思います。
c:\DATABASE\Data.mdb データベース名
table1 テーブル名
field1 field2 field3 ・・・・・・。field1、2、3、をListboxに表示させたいのですが、とりあえず、データベースより、fieldの値を習得する記述の方法を教えてください。
本を読んでも、コントロールを使う方法しか書いていません。
以前は、DAOなどで、コードを書いていたのですが、ADO.netになって、すっかり様相が変わってしまい、さっぱりわかりません。
お忙しい中とは存じますが、どうか、よろしくお願い申し上げます。
申し訳ありません
回答
-
タッチ2 さんからの引用
以前のVBでしたら、リストボックスで、リストボックス内で、フォーカスが選択している部分をListIndexなどの、Index値で、選択場所を指定できて、その選択部分の文字列を収得できていたと思いますが、VB2008でも、同じようなことができるのでしょうか?以下のようにすれば可能です。
ListBox1.Items(ListBox1.SelectedIndex).ToString()
タッチ2 さんからの引用
Me.ListBox1.DisplayMemberMe. ListBox1.ValueMember
Me.ListBox1.DataSource
上記はデータがバインドしている場合です。ListBoxに限らず、これらのコントロールで値を表示するには2通りあります。1つはコントロールに一つずつ値を追加していく方法で、もう一つはデータソースを指定して後の表示はコントロールに任せてしまう方法です。DisplayMemberなどを使用する方法は後者になります。
タッチ2 さんからの引用
全く自身がありませんが、この際、思い切って無駄の多少の投資をするかも知れませんが、良い参考書があれば教えてください。バイブルといおうか・・・・。
バイブルはMSDNライブラリです。ただ、系統だてて説明されていませんし、平易な言葉で書かれていませんので、慣れというかある程度実力のある人向きかもしれません。
しかし、今回の場合のようにDisplayMemberなどのキーワードが見つかったのですから、まずはそのキーワードをMSDNライブラリで確認されることは必須の作業です。その上でわかりやすく書かれているWebページをネットで検索されるのが良いと思います。少なくともサンプルコードがどのようなことを行っているのかを完全に理解するように解読していかなければ力が付いていきません。理解できないところがあれば掲示板などで質問して下さい。
最近はこの分野の参考書をあまり読まないので、良い参考書はちょっと思いつきません。ごめんなさい。
すべての返信
-
-
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などは使用しないので、とりあえずは接続型でコードを書いてみようと思います。
本当に初心者で申し訳ありません。
お差し支えなければ、本当に、一から教えていただきたいと希望いたします。
お忙しい中、お返事どうもありがとうございました。
-
下記のドキュメントも参照してみてください。
MSDNADO.NET
ADO.NET の概要
ADO.NET のコード例
.NET Framework Data Provider for OLE DBADO.NET でのデータの取得および変更
DataAdapter と DataReader (ADO.NET)
DataAdapter からの DataSet の読み込み (ADO.NET) -
とりあえずコードを書いて説明を付加してみました。
Code SnippetImports System.Data.OleDb
Imports System.IOPublic 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
-
解説つきのきめ細かい説明でありがとうございました。
早速、頑張ってみたところ、データベースに接続することができました。
なんだか、接続型、非接続型とまだまだ、理解しなければいけない点が沢山ありますが、徐々になれていこうと思います。
データベースに接続は確認できましたが、これからも、値を収得したり、レコードを更新したり、削除したり、追加したりする作業が多々ありまして、なかなか、気の重い感じが取りきれません。
ADOの場合でしたら、VBのリファレンスの本にいろいろDBの操作するコマンド、メソッドですが載っていましたが、VB2008となると、探すのも一苦労です。VB.netのプログラミング活用編(結構分厚い本)ですが、見ても、解説がほとんどで、レコード操作の言語が分からないのが実情です。
とりあえず、自力で探してみます。
レコードカウントを収得するメソッドなど教えてください。
それと、非接続型で、DetaSetを宣言すると、OleDataReader()など使えないのですよね。
接続型、非接続型によって、使うメソッドも異なってくるのですね。
とりあえずは、接続型で頑張ってみるつもりです。
きめ細かいご説明でありがとうございました。
-
タッチ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に複数のレコードを取得した後、データベースとの接続を切ります。これにより楽観的同時実行制御が容易に実現できるからです。
-
こんにちは。私も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 & mojmoj = ""
'- 方針変え、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) & " "
Nextmoj &= 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に表示しています。ご参考までに、どうぞ。内容的に既に書かれた書き込みと重複した部分もありますが、通しで書かないと分かり難いと考えたからです。他意はありません。
-
葉流奈津 さんからの引用
DataBaseでは、テーブル名やフィールド名は利用者が把握していて当然、という考え方があるのかもしれません。それで、テーブル名の取得など解説されたページが容易に見つかりません。しかし、従来からのAccess利用者としては、ソフト機能としてテーブル名はガイドしてもらいたい所です。
テーブル名等の定義が不定であるという様な状況がデータベース管理用のソフトウェアを作成するという様な場合くらいしか思いつきません。
単に開発中にデータベースの定義を確認したいという事であれば
そういう場合は(mdbであれば)Accessを使用すればよいと思います。
# VB.NET等はデータベース(管理)用のソフトウェアではないので。
所詮ツールなので適材適所だと思います。
もしデータベース管理用のソフトウェアがない場合でもVisual Studioのサーバーエクスプローラのデータ接続を利用するという方法もあります。
葉流奈津 さんからの引用
上記サンプルのうち、テーブル名取得部分のみネット上から参考にした記述で、ステートメントの意味はあまり分かっていません。しかし、その他については、全部VB2005Helpで見つけたもので、ほぼ理解できています。「テーブル名の取得など解説されたページが容易に見つかりません。」と書かれてましたが
参考にされたネット上の記述というのはMSDNでしょうか?MSDN
OleDbConnection クラス
GetOleDbSchemaTable メソッド -
ああ、これはどうも。
> テーブル名等の定義が不定であるという様な状況がデータベース管理用の
> ソフトウェアを作成するという様な場合くらいしか思いつきません。
> 単に開発中にデータベースの定義を確認したいという事であれば
> そういう場合は(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にも、記述は無くはないでしょうが、見つけられなかったのです。【補足】
後で、探したら見つかりました。
中に、「データベース内のテーブル一覧を返す例を次に示します。」記述があった。
ここに探し物があったと、気づくのが難しかったようです。
-
沢山のアドバイスをありがとうございました。
なんだか、やる気が沸いてきます。
接続型、非接続型、いまだに苦労してますが、そのうちに慣れてくるやもしれません。
ありがとうございます。
早速
>プログラミングMicrosoft ADO.NET2.0という本があります。お値段も高く、結構厚い本ですが、お薦めです。
の本のを探してみます。
それと、もう一点のみ、教えてください。
以前のVBでしたら、リストボックスで、リストボックス内で、フォーカスが選択している部分をListIndexなどの、Index値で、選択場所を指定できて、その選択部分の文字列を収得できていたと思いますが、VB2008でも、同じようなことができるのでしょうか?
いろいろなプログラミングのサンプルをみてみましたが、
Me.ListBox1.DisplayMember
Me. ListBox1.ValueMember
Me.ListBox1.DataSource
上記のようなメソッドなんか初めてみます。
どこで、上記のような勉強や、知識の習得をすればよいのでしょうか?
結局、本を参考にするしかないですよね。
全く自身がありませんが、この際、思い切って無駄の多少の投資をするかも知れませんが、良い参考書があれば教えてください。
バイブルといおうか・・・・。
本当に、一から教えて頂くことになってしまいまして申し訳ありません。
お願い申し上げます。
-
タッチ2 さんからの引用
以前のVBでしたら、リストボックスで、リストボックス内で、フォーカスが選択している部分をListIndexなどの、Index値で、選択場所を指定できて、その選択部分の文字列を収得できていたと思いますが、VB2008でも、同じようなことができるのでしょうか?以下のようにすれば可能です。
ListBox1.Items(ListBox1.SelectedIndex).ToString()
タッチ2 さんからの引用
Me.ListBox1.DisplayMemberMe. ListBox1.ValueMember
Me.ListBox1.DataSource
上記はデータがバインドしている場合です。ListBoxに限らず、これらのコントロールで値を表示するには2通りあります。1つはコントロールに一つずつ値を追加していく方法で、もう一つはデータソースを指定して後の表示はコントロールに任せてしまう方法です。DisplayMemberなどを使用する方法は後者になります。
タッチ2 さんからの引用
全く自身がありませんが、この際、思い切って無駄の多少の投資をするかも知れませんが、良い参考書があれば教えてください。バイブルといおうか・・・・。
バイブルはMSDNライブラリです。ただ、系統だてて説明されていませんし、平易な言葉で書かれていませんので、慣れというかある程度実力のある人向きかもしれません。
しかし、今回の場合のようにDisplayMemberなどのキーワードが見つかったのですから、まずはそのキーワードをMSDNライブラリで確認されることは必須の作業です。その上でわかりやすく書かれているWebページをネットで検索されるのが良いと思います。少なくともサンプルコードがどのようなことを行っているのかを完全に理解するように解読していかなければ力が付いていきません。理解できないところがあれば掲示板などで質問して下さい。
最近はこの分野の参考書をあまり読まないので、良い参考書はちょっと思いつきません。ごめんなさい。 -
↓ trapemiyaさんの伝言です。
バイブルはMSDNライブラリです。ただ、系統だてて説明されていませんし、平易な言葉で書かれていませんので、慣れというかある程度実力のある人向きかもしれません。
しかし、今回の場合のようにDisplayMemberなどのキーワードが見つかったのですから、まずはそのキーワードをMSDNライブラリで確認されることは必須の作業です。その上でわかりやすく書かれているWebページをネットで検索されるのが良いと思います。少なくともサンプルコードがどのようなことを行っているのかを完全に理解するように解読していかなければ力が付いていきません。理解できないところがあれば掲示板などで質問して下さい。
最近はこの分野の参考書をあまり読まないので、良い参考書はちょっと思いつきません。ごめんなさい。ありがとうございます。
なかなか、きびしいですね。
少しずつですが、前に進んでいこうと思います。
まだまだ、未熟者ですが、よろしくお願い申し上げます。