C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: ComboBoxにDBの内容を表示させたい


(過去ログ 46 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■24326 / inTopicNo.1)  ComboBoxにDBの内容を表示させたい
  
□投稿者/ Pan (1回)-(2008/09/01(Mon) 16:45:39)

分類:[VB.NET/VB2005] 

VB2008,access2007

初めましてこんにちは。
以前はVBAを勉強してましたが、最近になってVBを使い始めたものです。
まだ分からないことだらけですが、ご指導お願いします。


いま、Form1にComboBoxを複数置いてあります。
それぞれのComboBoxに、それぞれ違うテーブルにあるレコードをリストさせたいのですが
(VBとaccessは接続できています。)
ComboBox1→名称1
ComboBox2→名称2
ComboBox3→名称3
ComboBox4→名称4
ComboBox5→名称5
1つ目のComboBoxに、1つのテーブルを読み込むことはできました。
以下のコードです。

Dim connectionstring As String = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=○○.accdb;Persist Security Info=False;")
Dim SQL As String = "SELECT 名称1 FROM テーブル "
Dim conn As New OleDb.OleDbConnection(connectionstring)
Dim query As New OleDb.OleDbCommand(SQL, conn)

conn.Open()
Dim reader As OleDb.OleDbDataReader = query.ExecuteReader()
While (reader.Read())
Me.ComboBox1.Items.Add(reader.Item("名称1"))
End While
reader.Close()
conn.Close()
End Sub

しかし、上記をいろいろといじってみたのですが、2つ目以降のComboBoxにテーブルを読み込むことができませんでした。
どのようにすれば、2つ目以降のComboBoxにテーブルを読み込むことができるのでしょうか?
分かりにくい説明で申し訳ないです。アドバイスよろしくお願いします。


引用返信 編集キー/
■24327 / inTopicNo.2)  Re[1]: ComboBoxにDBの内容を表示させたい
□投稿者/ επιστημη (1290回)-(2008/09/01(Mon) 16:53:55)
επιστημη さんの Web サイト
> 2つ目以降のComboBoxにテーブルを読み込むことができませんでした。

同じことを5つのテーブルに対して繰り返せばいいように思うのですが、
それができないってことですか? どんなコード書いたんですか?

> 上記をいろいろといじってみたのですが

その詳細が知りたいんですけど。

引用返信 編集キー/
■24329 / inTopicNo.3)  Re[2]: ComboBoxにDBの内容を表示させたい
□投稿者/ HiJun (100回)-(2008/09/01(Mon) 17:32:33)
一つ目のテーブルが読めたのでしたら、
それぞれのテーブルをComboBoxにセットする処理を
作ってやればいいのではないですか?
引用返信 編集キー/
■24331 / inTopicNo.4)  Re[3]: ComboBoxにDBの内容を表示させたい
□投稿者/ ロック (77回)-(2008/09/01(Mon) 18:28:38)
2008/09/04(Thu) 10:19:25 編集(投稿者)
一度のExecuteReader()でやりたいなら
複数の結果セットを返すSQL文を作成して
NextResultメソッドで次の結果セットに移動で、出来るような
気がします。
C#ですけど・・・

// 「;」で区切って複数のSELECT文を指定
CommandText = "SELECT 名称1 FROM テーブル1;SELECT 名称1 FROM テーブル2;SELECT 名称1 FROM テーブル3;SELECT 名称1 FROM テーブル4;SELECT 名称1 FROM テーブル5";

int i=1;
do
{
    // 1つめの結果セット
    while(reader.Read()){
        ((ComboBox)(Controls["comboBox"+i.ToString()])).Items.Add(reader[0].ToString());
   }
   i++;
} while(reader.NextResult());    // 次の結果セットに移動


ComboBoxのnameプロパティがComboBox1〜ComboBox5で
テーブルから読み込んだ値をComboBoxに表示するという解釈でやっています。
ちなみに、取得した先頭のフィールドの値を表示

#修正
一部の変数名が自分の環境の変数名になっていたので(^^;
上記処理に合うように修正しました。

引用返信 編集キー/
■24340 / inTopicNo.5)  Re[4]: ComboBoxにDBの内容を表示させたい
□投稿者/ オガシン (71回)-(2008/09/02(Tue) 00:35:40)
ComboBoxに値がセットできないのが問題じゃなくて
SQLの結果が意図した結果になっていないとか?

>conn.Open()
>Dim reader As OleDb.OleDbDataReader = query.ExecuteReader()
>While (reader.Read())
>Me.ComboBox1.Items.Add(reader.Item("名称1"))
>End While
>reader.Close()
>conn.Close()
>End Sub
この処理がComboBox2の処理でComboBox1の値と同じ処理なら

>"SELECT 名称1 FROM テーブル "
ここで"名称1"にComboBox1の値がうまいこと入ってなくて検索できていないのでは?

>While (reader.Read())
この部分でループがグルグルまわってるかステップ実行してみはいかがでしょうか


引用返信 編集キー/
■24469 / inTopicNo.6)  Re[5]: ComboBoxにDBの内容を表示させたい
□投稿者/ Pan (2回)-(2008/09/03(Wed) 14:28:40)
返信遅くなってすいません。それから下手な説明ですいません。
みなさんの意見ありがとうございます。

これらのComboBoxは、FormのLoadに書いてあるものです。
同じように繰り返すと、当然なんですけど・・・「ローカル関数は既に宣言されています」
これを数字や、文字を変えてやってみてもうまくいかず。

今試しているのは、ComboBox1とComboBox2だけ使ってますが
ComboBox1の内容表示は意図したものになっています。
そして、いろいろ試してみたんですが、ComboBox2の内容は何も表示されない状態になっています。
おそらく、データが一つしか読み取れていないのではないかと思っています。

例えば、単純な考えですが、下記のようにすると

Dim connectionstring As String = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=○○.accdb;Persist Security Info=False;")
Dim SQL As String = "SELECT 名称1 FROM テーブル "
Dim conn As New OleDb.OleDbConnection(connectionstring)
Dim query As New OleDb.OleDbCommand(SQL, conn)

conn.Open()
Dim reader As OleDb.OleDbDataReader = query.ExecuteReader()
While (reader.Read())
Me.ComboBox1.Items.Add(reader.Item("名称1"))
End While
reader.Close()
conn.Close()

Dim connectionstring2 As String = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=○○.accdb;Persist Security Info=False;")
Dim SQL2 As String = "SELECT 名称2 FROM テーブル "
Dim conn2 As New OleDb.OleDbConnection(connectionstring2)
Dim query2 As New OleDb.OleDbCommand(SQL2, conn2)

conn2.Open()
Dim reader2 As OleDb.OleDbDataReader = query2.ExecuteReader()
While (reader2.Read())
Me.ComboBox2.Items.Add(reader2.Item("名称2"))
End While
reader2.Close()
conn2.Close()

End Sub

「ExecuteReader には接続が開かれていて使用可能なことが必要です。現在の接続の状態は '終了" です。」
とエラーが出ます。
引用返信 編集キー/
■24470 / inTopicNo.7)  Re[6]: ComboBoxにDBの内容を表示させたい
□投稿者/ HiJun (102回)-(2008/09/03(Wed) 14:50:44)
2008/09/03(Wed) 14:52:12 編集(投稿者)
2008/09/03(Wed) 14:52:05 編集(投稿者)

>Dim query As New OleDb.OleDbCommand(SQL, conn)
ってやっているけど、reader.Close()している後に、
queryをDisposeしてみて下さい。

あと気になるのが、名称1と名称2を指定しているテーブル名が一緒に
思えますが、本当にそのテーブル名”テーブル”に名称2があるので
しょうか?
引用返信 編集キー/
■24471 / inTopicNo.8)  Re[6]: ComboBoxにDBの内容を表示させたい
□投稿者/ HiJun (103回)-(2008/09/03(Wed) 14:52:20)
2008/09/03(Wed) 14:52:54 編集(投稿者)

すみません。2度送信したので削除です。
引用返信 編集キー/
■24480 / inTopicNo.9)  Re[7]: ComboBoxにDBの内容を表示させたい
□投稿者/ ロック (80回)-(2008/09/03(Wed) 15:52:20)
>「ExecuteReader には接続が開かれていて使用可能なことが必要です。現在の接続の状態は '終了" です。」
だけ見ると、接続してないだけでは?
と思うのですが、そうでもないですよね・・・

「には接続が開かれていて使用可能なことが必要です。」で検索して
出てきたのを見ると、接続していないかトランザクションの途中とか
書いてありましたが、関係ないですよね・・接続してるし、トランザクションなら
1回目でアウトだろうし

気になるのは、「Microsoft.ACE.OLEDB.12.0」って事で
その辺に何かあるのかな?
#「Microsoft.Jet.OLEDB.4.0」しか使った事がないので分かりません。。。


ちなみに、connだけは使い回しても駄目ですか?
Dim query2 As New OleDb.OleDbCommand(SQL2, conn2) ←ここを2を使わない
connもClose()しないで

あとDataAdapterに任せても同じなのかどうかとか

引用返信 編集キー/
■24506 / inTopicNo.10)  Re[7]: ComboBoxにDBの内容を表示させたい
□投稿者/ Pan (3回)-(2008/09/03(Wed) 17:22:29)
HiJunさん、返答ありがとうございます。
>Dim query As New OleDb.OleDbCommand(SQL, conn)
> ってやっているけど、reader.Close()している後に、
> queryをDisposeしてみて下さい。

query.dispose
と一行加えただけで、エラーは表示されなくなりました。
結果は、ComboBox2には何も表示されませんでした。

> あと気になるのが、名称1と名称2を指定しているテーブル名が一緒に
> 思えますが、本当にそのテーブル名”テーブル”に名称2があるので
> しょうか?

これは申し訳ないです。あまり関係ないと思ってしまってたんですが
実は、テーブル1とテーブル2があって名称が各ひとつずつあります。
SELECT 名称 FROM テーブル1
SELECT 名称 FROM テーブル2
といった感じです。すいませんでした。これに何か原因があるような気がしてきました。


ロックさん、返答ありがとうございます。
>ちなみに、connだけは使い回しても駄目ですか?
>Dim query2 As New OleDb.OleDbCommand(SQL2, conn2) ←ここを2を使わない
>connもClose()しないで

これもやらせてもらいました。
これもエラーが表示されなくなりました。結果は同様でした。


皆さんのおかげで少しづつ前に進んでいるような気がします。ありがとうございます。
もう少し考えてみます。


引用返信 編集キー/
■24507 / inTopicNo.11)  Re[8]: ComboBoxにDBの内容を表示させたい
□投稿者/ επιστημη (1307回)-(2008/09/03(Wed) 17:26:52)
επιστημη さんの Web サイト
> と一行加えただけで、エラーは表示されなくなりました。
> 結果は、ComboBox2には何も表示されませんでした。

テーブル2にはちゃんとした値が格納されていること確認してるんですよね?
一発目にテーブル2,続いてテーブル1を引いたらどうなります?

# 今の不具合がデータによるのか順序によるのか、です。

引用返信 編集キー/
■24512 / inTopicNo.12)  Re[9]: ComboBoxにDBの内容を表示させたい
□投稿者/ ロック (81回)-(2008/09/03(Wed) 18:00:07)
No24507 (επιστημη さん) に返信
> # 今の不具合がデータによるのか順序によるのか、です。

もし、これで同じ現象なら後は排他制御くらいしか思いつきません orz
接続文字に"Mode=Share Deny None;"を加えるとどうなるだろう?くらい

引用返信 編集キー/
■24527 / inTopicNo.13)  Re[9]: ComboBoxにDBの内容を表示させたい
□投稿者/ Pan (5回)-(2008/09/03(Wed) 19:27:42)
επιστημη さん、ロックさん、返答ありがとうございます。

> テーブル2にはちゃんとした値が格納されていること確認してるんですよね?
> 一発目にテーブル2,続いてテーブル1を引いたらどうなります?

はい、確認しています。
一発目にテーブル2,続いてテーブル1を引いた場合、
ComboBox1のテーブル2が表示されて、ComboBox2のテーブル1は表示されませんでした。

また、テーブル1に名称1と名称2を作ってみましたが(同一テーブルにしたという意味です)
結果は同じでした。
ComboBox1の名称1は表示されるものの、ComboBox2の名称2は表示(リスト)されませんでした。
引用返信 編集キー/
■24549 / inTopicNo.14)  Re[10]: ComboBoxにDBの内容を表示させたい
□投稿者/ オガシン (74回)-(2008/09/04(Thu) 00:21:46)
2008/09/04(Thu) 00:29:56 編集(投稿者)
こんなんじゃだめなんですかね?
そもそもSQLを直に実行した場合意図した値はとれてますか?
提示されているソースをちょいちょいと切り張りしただけなので
変な部分があるかもしれません。

Public Sub メソッド名()	
	Dim connectionstring As String = String.Format(_
                                "Provider=Microsoft.ACE.OLEDB.12.0;
                                 Data Source=○○.accdb;
                                 Persist Security Info=False;")

	Dim SQL1 As String = "SELECT 名称1 FROM テーブルA "
	Dim SQL2 As String = "SELECT 名称2 FROM テーブルB "
	Dim conn As New OleDb.OleDbConnection(connectionstring)
	Dim queryA As New OleDb.OleDbCommand(SQL1, conn)
	Dim queryB As New OleDb.OleDbCommand(SQL2, conn)

	conn.Open()

	Dim readerA As OleDb.OleDbDataReader = queryA.ExecuteReader()
	While (readerA.Read())
		Me.ComboBox1.Items.Add(readerA.Item("名称1"))
	End While

	Dim readerB As OleDb.OleDbDataReader = queryB.ExecuteReader()
	While (readerB.Read())
		Me.ComboBox2.Items.Add(readerA.Item("名称2"))
	End While

	reader.Close()
	conn.Close()
End Sub

引用返信 編集キー/
■24683 / inTopicNo.15)  Re[11]: ComboBoxにDBの内容を表示させたい
□投稿者/ Pan (6回)-(2008/09/08(Mon) 11:07:45)
オガシンさん返信ありがとうございます。

> こんなんじゃだめなんですかね?

やってみましたが、結果は以前と同じでした。

> そもそもSQLを直に実行した場合意図した値はとれてますか?

とれていると思いますが、何度やってもひとつのものしか表示できなかったです。

結果報告になりますが、
かなり考えたんですが一つのイベントで2つ以上の値を取り出すことはできなかったので
FormのLoadイベントで表示させることはあきらめて(妥協案ですが)
それぞれのComboBoxのClickイベントで1つずつ毎回呼び出すことにしました。
いまのところうまく動いているので問題はなさそうです。

みなさんの意見、アドバイスがあっていろいろな考え方ができました。
本当にありがとうございました^^
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -