VB.NETでAccessDBテーブルの主キー情報を取得する

VB.NETでAccessDBテーブルの主キー情報を取得する

VB.NET で Access のデータベースを操作したいというのを忘れないようにメモってます。今回は、SQL を書く時に欲しい主キー情報を読み込みの際に一緒に取得しておこう、という内容です。


関連記事

  1. DataGridViewへAccessのデータベースファイルを読み込む
  2. AccessDBテーブルの主キー情報を取得する ←NOW!
  3. DataGridViewに読み込んだDB情報を再取得する
  4. DataGridViewをセル編集したときの行数を格納する
  5. Accessのデータベースファイルへ書き込むための接続・切断
  6. Accessデータベースのレコードを削除する
  7. Accessデータベースを更新する

ガッツリ続き物になってしまいました…。過去の分と合わせて順番に読んでいただけると分かりやすいかと思います。

なるべく簡素に書いているので、例外処理は甘いと思われます。ご参考にする際は、ご自分の環境に合わせてご修正ください。

解説のためツギハギしちゃったので、最後の記事(7回め)に全コードまとめてあります。

書いたときの環境

  • Visual Studio 2010
  • .NET Framework 4.0

です。

フォームデザイン

この前はただテーブルの内容を DataGridView に入れただけなので、今後やりたいことも踏まえていろいろ追加しておきます。

Form2.vb [デザイン]

150218-1

ボタンを3つ追加します。(追加しといてなんですが、今回の記事では使いません。すみません。)

コード

DBtable.vb

前回のコードにハイライト部分を加えます。読み込むときに主キーの情報を取得しておいて、DataGridView の列の色を変えてみます。

'### DBtable.vb ###
Imports System.Data.OleDb

Class DBtable
	'フィールド
	Private tableName As Object
	Private fileName As String
	Private dgv As DataGridView = Form2.DataGridView1

	'コンストラクタ
	Sub New(tableName_ As Object, fileName_ As String)
		tableName = tableName_
		fileName = fileName_
	End Sub

	'----------------------------------------------------
	'  テーブルに関すること
	'----------------------------------------------------
	Private dbCnc As OleDbConnection
	Private dbAdp As OleDbDataAdapter
	Private tableData As DataTable
	Private primaryKeyArray() As DataColumn

	Public Sub setDataSource()
		'テーブルデータ読込
		tableData = getTableData("SELECT * FROM " & tableName & ";")

		'データグリッドビューへバインド
		Dim bindingSource1 As New BindingSource()
		bindingSource1.DataSource = tableData
		dgv.DataSource = bindingSource1

		'フィールド情報
		primaryKeyArray = tableData.PrimaryKey '主キー情報を取得
		Call setColorPrimaryKey() '主キーのカラムに色つけ
	End Sub

	Private Function getTableData(ByVal strSQL As String) As DataTable
		'テーブルを接続
		dbCnc = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; " & "Data Source=" & fileName)
		dbAdp = New OleDbDataAdapter(strSQL, dbCnc)
		dbAdp.MissingSchemaAction = MissingSchemaAction.AddWithKey '既定の情報と共に主キーメタデータも読み込む
		Dim table As New DataTable
		dbAdp.Fill(table)
		Return table
	End Function

	Public Sub Dispose()
		'コネクション切断(略)
	End Sub

	Private Sub setColorPrimaryKey()
		'データグリッドビューの主キー列色を変える
		For Each clm In primaryKeyArray
			dgv.Columns(clm.Ordinal).HeaderCell.Style.BackColor = Color.LemonChiffon  '主キーのヘッダー色(.EnableHeadersVisualStyles=False にすること)
		Next
	End Sub
End Class

主キー情報は、42行目の記述であらかじめ読み込んでいないと出てきません。

35行目で呼び出している DataGridView の主キーヘッダーに色をつけるプロシージャ、最初反映されず…。

150218-3

ぐぬぬと思って調べてたら、プロパティの EnableHeadersVisualStyles を False にしないとダメだったみたいです。

動作テスト

F5キーでデバッグ開始して、前回同様 table1 と table2 の中身をそれぞれ見てみると、

150218-4
150218-5

主キー情報を自動で取得して、ヘッダーの色が変わっています。

DataGridView の選択を解除しておく

さて、これでもOKなんですが、左上のセルがデフォルトで選択されてしまっているのが好きじゃないので、Form2 を表示するときにセルの選択解除もしておきます。

'### Form2.vb ###
Public Class Form2
	Private Const FILE_NAME As String = "C:\test.accdb"
	Private db As DBtable
	Private dgv As DataGridView

	'----------------------------------------------------
	'    メソッド
	'----------------------------------------------------
	Private Sub setTable()
		'DataGridViewにテーブル内容をセット
		db = New DBtable(Me.Text, FILE_NAME)	'インスタンス生成
		db.setDataSource() 'データセット
		dgv.CurrentCell = Nothing 'DataGridView1の選択解除
	End Sub

	'----------------------------------------------------
	'  Formイベント
	'----------------------------------------------------
	Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles Me.Load
		'フォームロード時(略)
	End Sub

	Private Sub Form2_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
		'フォームが閉じたとき(略)
	End Sub
End Class

前回書いた Form2 のコードにこれを追記して、

150218-6

選択が解除された状態で表示されます。

今回は以上です。次は再読込かなーと思っています。

公開日:2015/02/18

書籍を執筆しています。

2件のコメント

  1. みや より:

    visualstudio2019にてMicrosoft SQL Serverでデータベースアプリを作っていますが
    任意のテーブルにいてプライマリーキーが設定されているカラム名を取得する方法を探していて
    このページに行きつきました。
    私の環境下では、このページに記載されているコードはエラーとなりました。
    プライマリーキーが設定されているカラム名の取得についてよい方法があれば
    お手数ですがご教示いただければ助かります。

    • *you より:

      みやさん、コメントありがとうございます。

      この連載記事は対象DBがAccessなのでSQLServer用に記述を直す必要があります。また、第1回の記事からの続きですので、このページに記載されている情報だけでは動きません。

      第1回&第2回の記事のとおりフォームとコードが出来ている前提で、VisualStudio2019&SQLServer2019で試してみました。以下のようにDBtable.vbを修正するとカラム名が取得できましたので、お試しください。

      '### DBtable.vb ###
      Imports System.Data.OleDb
      
      Class DBtable
      
        '略
      
        Public Sub setDataSource()
          'テーブルデータ読込
          tableData = getTableData("SELECT * FROM " & tableName & ";")
      
          'データグリッドビューへバインド(略)
      
          'フィールド情報
          primaryKeyArray = tableData.PrimaryKey '主キー情報を取得
          For Each clm In primaryKeyArray
            Debug.WriteLine(clm.ColumnName) '主キーのカラム名をコンソールへ出力
          Next
        End Sub
      
        Private Function getTableData(ByVal strSQL As String) As DataTable
          'テーブルを接続
          dbCnc = New OleDbConnection(
            "Provider = MSOLEDBSQL;" &
            "Data Source = サーバ名;" &
            "Initial Catalog = データベース名;" &
            "User ID = ユーザ名;" &
            "Password = パス;")
          dbAdp = New OleDbDataAdapter(strSQL, dbCnc)
          dbAdp.MissingSchemaAction = MissingSchemaAction.AddWithKey '既定の情報と共に主キーメタデータも読み込む
          Dim table As New DataTable
          dbAdp.Fill(table)
          Return table
        End Function
      
        '略
      
      End Class
      

      なお、この変更に伴いForm2.vb冒頭の、Accessのファイル名を設定するPrivate Const FILE_NAME As String = "C:\test.accdb"の記述が不要になり、それにまつわる変数fileName周りも不要になるのですが書き出すとキリがないのでそのあたりは省略させていだきます。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)

YouTubeでQ&Aコンテンツを企画しています

運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。