はじめまして。
データベースプログラムに挑戦しているのですが、どうもやり方がわかりません。
どなたかコメントいただけないでしょうか?
まず、二つのテーブルを作ります。
①役職テーブル
┌──┬────┐
│ ID │役職名 │
├──┼────┤
│ 1 │社長 │
│ 2 │部長 │
│ 3 │課長 │
│ 4 │平 │
└──┴────┘
②従業員テーブル
┌──┬────┬────┐
│ ID │名前 │役職ID │
├──┼────┼────┤
│ 1 │あいざわ│ 2 │
│ 2 │いぬい │ 4 │
│ 3 │うえまつ│ 3 │
│ 4 │えんどう│ 1 │
└──┴────┴────┘
上の①-IDと、②-役職IDをリレーションで結んでいます。
上記の二つのテーブルから、以下のデータをDataGridViewに表示しようと思っています。
③DataGridViewに表示するイメージ
┌─────┬───┐
│名前 │役職名│
├─────┼───┤
│あいざわ │部長 │
│いぬい │平 │
│うえまつ │課長 │
│えんどう │社長 │
└─────┴───┘
ここまでは、できたのです。
DataGridViewをユーザーが編集して、それがデータベースに反映されるようにしたいと思っています。
たとえば、「うえまつ」を「課長」→「部長」に変更したいです。
これを実現するためには、③のデータで「役職名」列は、CombBoxにしなくてはなりません。
→ そうしないと、入力ミスがあると思うので。
そして、データベースを更新する際には、役職名 → 役職ID に変換してから、
データベースに更新する必要があります。
こういう場合って、皆さんならどうしますか?
とりあえず、表示まではできたので、以下にコードを貼り付けます。
フォームには、DataGridView1を配置しています。
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim Cn As New OleDbConnection(My.Settings.社員DBConnectionString)
Dim SQLCm As OleDbCommand = Cn.CreateCommand
Dim Adapter As New OleDbDataAdapter(SQLCm)
Dim table As New DataTable
Try
SQLCm.CommandText = "SELECT 従業員テーブル.名前, 役職テーブル.役職名 FROM (従業員テーブル LEFT OUTER JOIN 役職テーブル ON 従業員テーブル.役職ID = 役職テーブル.ID)"
Adapter.Fill(Table)
Catch ex As Exception
MsgBox(ex.Message)
Finally
Table.Dispose()
Adapter.Dispose()
SQLCm.Dispose()
Cn.Dispose()
End Try
Me.DataGridView1.DataSource = table
End Sub
どなたかご教授してください。
> こういう場合って、皆さんならどうしますか?
私なら LEFT JOIN せず、別々の Table に受け取ります。
デザイン時には、DataGridView の「役職」列だけ、
ComboBox列(DataGridViewComboBoxColumn) にしておきます。たとえば
DataGridView1.DataSource = ds.Tables("従業員テーブル")
YakushokuColumn1.DataSource = ds.Tables("役職テーブル")
かな。実際には、BindingSource を使ってバインドする事が多いですが。
(面倒なので、列名のマッピングは、デザイン時に済ませておきます)
あるいは、DataGridView 上で直接編集させるのでは無く、表示専用としておき、
入力欄を別途設ける形にすることもあります。
これなら、更新するのは 従業員テーブル そのものなので、
> 役職名 → 役職ID に変換してから
という作業が不要になります。
>とりあえず、表示まではできたので、
その次にやることは
役職テーブルの登録変更削除のプログラム
だと思いますがこれは完成しているのでしょうか?
テーブル単独の更新が基本問題です。
JOINされた元のテーブルの更新は応用問題です。
魔界の仮面弁士さん、TAKAさん
助言ありがとうございます。
しかし。。。
まだ、わかりません。
DataGridView1.DataSource = ds.Tables("従業員テーブル")
YakushokuColumn1.DataSource = ds.Tables("役職テーブル")
この「ds」というのは、どうやって生成したオブジェクトでしょうか?
とっても、恥ずかしいことを聞いていると思うのですが、よろしくお願いします。
> どうやって生成したオブジェクトでしょうか?
ds 自体は、DataSet 型を想定しています。(あるいは 型付きの DataSet)