DataGridView上からデータベースを変更するには。


あひる  2008-01-27 20:54:52  No: 138751  IP: 192.*.*.*

はじめまして。

データベースプログラムに挑戦しているのですが、どうもやり方がわかりません。

どなたかコメントいただけないでしょうか?

まず、二つのテーブルを作ります。

①役職テーブル
 ┌──┬────┐
 │ 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


どなたかご教授してください。

編集 削除
魔界の仮面弁士  2008-01-28 10:00:40  No: 138752  IP: 192.*.*.*

> こういう場合って、皆さんならどうしますか?

私なら LEFT JOIN せず、別々の Table に受け取ります。

デザイン時には、DataGridView の「役職」列だけ、
ComboBox列(DataGridViewComboBoxColumn) にしておきます。たとえば

  DataGridView1.DataSource = ds.Tables("従業員テーブル")
  YakushokuColumn1.DataSource = ds.Tables("役職テーブル")

かな。実際には、BindingSource を使ってバインドする事が多いですが。
(面倒なので、列名のマッピングは、デザイン時に済ませておきます)


あるいは、DataGridView 上で直接編集させるのでは無く、表示専用としておき、
入力欄を別途設ける形にすることもあります。


これなら、更新するのは 従業員テーブル そのものなので、
> 役職名 → 役職ID に変換してから
という作業が不要になります。

編集 削除
TAKA  2008-01-28 11:17:07  No: 138753  IP: 192.*.*.*

>とりあえず、表示まではできたので、

その次にやることは
  役職テーブルの登録変更削除のプログラム
だと思いますがこれは完成しているのでしょうか?

テーブル単独の更新が基本問題です。
JOINされた元のテーブルの更新は応用問題です。

編集 削除
あひる  2008-01-29 02:32:47  No: 138754  IP: 192.*.*.*

魔界の仮面弁士さん、TAKAさん

助言ありがとうございます。
しかし。。。
まだ、わかりません。

  DataGridView1.DataSource = ds.Tables("従業員テーブル")
  YakushokuColumn1.DataSource = ds.Tables("役職テーブル")

この「ds」というのは、どうやって生成したオブジェクトでしょうか?

とっても、恥ずかしいことを聞いていると思うのですが、よろしくお願いします。

編集 削除
魔界の仮面弁士  2008-01-29 09:05:31  No: 138755  IP: 192.*.*.*

> どうやって生成したオブジェクトでしょうか?

ds 自体は、DataSet 型を想定しています。(あるいは 型付きの DataSet)

編集 削除