DOBON.NET DOBON.NETプログラミング掲示板過去ログ

コンボボックスで範囲選択

環境/言語:[WinXP]
分類:[.NET]

はじめまして。
今までエクセルマクロを使ってテスト問題を作っていましたが、今回VBでの作成に挑戦しているところです。
VisualStudio2005を使用しております。

エクセルでは、コンボボックスを2つ使い、○番目の問題〜◎番目の問題までの中から、どれか25個の問題を選択するマクロを組んでいました。

これを、VBでどのように組めばいいのか、さっぱりわからず、今回こちらに質問をいたしました。

解決したい問題はたくさんありますのが、まずは、

コンボボックス1の値 〜 コンボボックス2の値 までのデータを抽出するにはどうすればよいかを教えていただけないでしょうか?

データベースには、約150個の問題があります。この150個の問題の中から、たとえば、23番目〜100番目のデータを抽出しなさい、という命令を2つのコンボボックスを使ってやりたいのです。

どうぞよろしくお願いいたします。
何が分かれば十分なのか分かりません。
ぱっと考えついただけでも、下記の疑問を持ちます。

・ComboBox に何か表示できているのですか?
・ComboBox から「選択中の何か」を得ることができているのですか?
・「選択中の何か」から数値にできているのですか?
・数値を得られれば、データベースから特定の問題を取り出すことはできるのですか?
・そもそも、データベースって何をどのように使っているのですか?

# 画面しかできてなくて、すべてのコードを教えてくれと言うのは論外です。
■No26130に返信(Azuleanさんの記事)
> 何が分かれば十分なのか分かりません。
> ぱっと考えついただけでも、下記の疑問を持ちます。
>
> ・ComboBox に何か表示できているのですか?
> ・ComboBox から「選択中の何か」を得ることができているのですか?
> ・「選択中の何か」から数値にできているのですか?
> ・数値を得られれば、データベースから特定の問題を取り出すことはできるのですか?
> ・そもそも、データベースって何をどのように使っているのですか?
>
> # 画面しかできてなくて、すべてのコードを教えてくれと言うのは論外です。

Azuleanさん、回答ありがとうございます。
とりあえず、できているのは、MDBファイルの読み込み、コンボボックスの表示までです。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\年代.mdb")

Dim SQLCm As OleDbCommand = Cn.CreateCommand

Dim Adapter As New OleDbDataAdapter(SQLCm)


Dim Table As New DataTable

SQLCm.CommandText = "SELECT * FROM 年代事項data"
Adapter.Fill(Table)
Adapter.Fill(Table.Copy)

'▼値の表示
ComboBox1.DataSource = Table
ComboBox1.DisplayMember = "年代"
ComboBox2.DataSource = Table.Copy
ComboBox2.DisplayMember = "年代"
Me.ComboBox1.SelectedIndex = -1
Me.ComboBox2.SelectedIndex = -1

End Sub


年代.mdbには、以下のようにデータを入力してあります。
ID  年代   事項
1  1世紀  漢から金印が贈られる
2  3世紀  邪馬台国
3  5世紀  倭の五王
4  604  憲法十七条
    ・
    ・
    ・
157 2003 イラク戦争

コンボボックスには、年代の列が表示されるようになっています。
コンボボックス1で選択した列からコンボボックス2で選択した列までのレコードを別のテーブルに抽出したいと思い、質問させていただいた次第です。
■No26143に返信(けーくんさんの記事)
> コンボボックス1で選択した列からコンボボックス2で選択した列までの
> レコードを別のテーブルに抽出したいと思い、質問させていただいた次第
> です。

取得するだけであれば ComboBox で選択された値を用いて,こんな SQL を
発行すると良いのではないでしょうか。

Select * From `年代事項data`
Where
    `ID` >= ? And
    `ID` <= ?

別のテーブルに追加ということでしたら Insert Select の構文を利用できそ
うです。

Insert Into `別のテーブル`
Select * From `年代事項data`
Where
    `ID` >= ? And
    `ID` <= ?

SQL の発行に関しましてはパラメータクエリを利用してこんな感じです。 
Select であれば Command.ExecuteReader()
Insert, Update, Delete であれば Command.ExecuteNonQuery()

詳しくはこちらを参照ください。
.NET Framework クラス ライブラリ
    OleDbCommand クラス
http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbcommand(VS.80).aspx

Dim connection As System.Data.OleDb.OleDbConnection = Nothing
Dim command As System.Data.OleDb.OleDbCommand = Nothing
Try
    connection = New System.Data.OleDb.OleDbConnection(...)
    command = connection.CreateCommand()
    command.CommandText = _
            "Insert Into `別のテーブル` Select * From `年代事項data` Where `ID` >= ? And `ID` <= ?"
    command.Parameters.Add("@minID", OleDb.OleDbType.Integer).Value = 200
    command.Parameters.Add("@maxID", OleDb.OleDbType.Integer).Value = 300

    connection.Open()
    command.ExecuteNonQuery()
    connection.Close()
Finally
    If command IsNot Nothing Then
        command.Dispose()
    End If

    If connection IsNot Nothing Then
        connection.Close()
        connection.Dispose()
    End If
End Try
■No26146に返信(もりおさんの記事)
> ■No26143に返信(けーくんさんの記事)
>>コンボボックス1で選択した列からコンボボックス2で選択した列までの
>>レコードを別のテーブルに抽出したいと思い、質問させていただいた次第
>>です。
>
> 取得するだけであれば ComboBox で選択された値を用いて,こんな SQL を
> 発行すると良いのではないでしょうか。
>
> Select * From `年代事項data`
> Where
> `ID` >= ? And
> `ID` <= ?
>
> 別のテーブルに追加ということでしたら Insert Select の構文を利用できそ
> うです。
>
> Insert Into `別のテーブル`
> Select * From `年代事項data`
> Where
> `ID` >= ? And
> `ID` <= ?
>
> SQL の発行に関しましてはパラメータクエリを利用してこんな感じです。
> Select であれば Command.ExecuteReader()
> Insert, Update, Delete であれば Command.ExecuteNonQuery()
>
> 詳しくはこちらを参照ください。
> .NET Framework クラス ライブラリ
> OleDbCommand クラス
> http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbcommand(VS.80).aspx
>
> Dim connection As System.Data.OleDb.OleDbConnection = Nothing
> Dim command As System.Data.OleDb.OleDbCommand = Nothing
> Try
> connection = New System.Data.OleDb.OleDbConnection(...)
> command = connection.CreateCommand()
> command.CommandText = _
> "Insert Into `別のテーブル` Select * From `年代事項data` Where `ID` >= ? And `ID` <= ?"
> command.Parameters.Add("@minID", OleDb.OleDbType.Integer).Value = 200
> command.Parameters.Add("@maxID", OleDb.OleDbType.Integer).Value = 300
>
> connection.Open()
> command.ExecuteNonQuery()
> connection.Close()
> Finally
> If command IsNot Nothing Then
> command.Dispose()
> End If
>
> If connection IsNot Nothing Then
> connection.Close()
> connection.Dispose()
> End If
> End Try
>

もりおさん、回答ありがとうございます!
もりおさんのおかげで、問題が解決できました!!
どうもありがとうございました。


Dim si As Integer = ComboBox1.SelectedIndex
Dim si2 As Integer = ComboBox2.SelectedIndex

Debug.WriteLine(si)
Debug.WriteLine(si2)

If si = -1 Then
Exit Sub
End If
If si2 = -1 Then
Exit Sub
End If

Dim connection As System.Data.OleDb.OleDbConnection = Nothing
Dim command As System.Data.OleDb.OleDbCommand = Nothing
Try
connection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\山田 啓太\My Documents\年代.mdb")
command = connection.CreateCommand()
command.CommandText = _
"Insert Into `年代テスト` Select * From `年代事項data` Where `ID` >= ? And `ID` <= ?"
command.Parameters.Add("@minID", OleDb.OleDbType.Integer).Value = (si)
command.Parameters.Add("@maxID", OleDb.OleDbType.Integer).Value = (si2)


connection.Open()
command.ExecuteNonQuery()
connection.Close()
Finally
If command IsNot Nothing Then
command.Dispose()
End If

If connection IsNot Nothing Then
connection.Close()
connection.Dispose()
End If
End Try
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板