VB.NETでAccessDBテーブルの主キー情報を取得する
VB.NET で Access のデータベースを操作したいというのを忘れないようにメモってます。今回は、SQL を書く時に欲しい主キー情報を読み込みの際に一緒に取得しておこう、という内容です。
関連記事
- DataGridViewへAccessのデータベースファイルを読み込む
- AccessDBテーブルの主キー情報を取得する ←NOW!
- DataGridViewに読み込んだDB情報を再取得する
- DataGridViewをセル編集したときの行数を格納する
- Accessのデータベースファイルへ書き込むための接続・切断
- Accessデータベースのレコードを削除する
- Accessデータベースを更新する
ガッツリ続き物になってしまいました…。過去の分と合わせて順番に読んでいただけると分かりやすいかと思います。
なるべく簡素に書いているので、例外処理は甘いと思われます。ご参考にする際は、ご自分の環境に合わせてご修正ください。
解説のためツギハギしちゃったので、最後の記事(7回め)に全コードまとめてあります。書いたときの環境
- Visual Studio 2010
- .NET Framework 4.0
です。
フォームデザイン
この前はただテーブルの内容を DataGridView に入れただけなので、今後やりたいことも踏まえていろいろ追加しておきます。
Form2.vb [デザイン]
ボタンを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 の主キーヘッダーに色をつけるプロシージャ、最初反映されず…。
ぐぬぬと思って調べてたら、プロパティの EnableHeadersVisualStyles を False にしないとダメだったみたいです。
こちらを参考にさせていただきました。
動作テスト
F5キーでデバッグ開始して、前回同様 table1 と table2 の中身をそれぞれ見てみると、
主キー情報を自動で取得して、ヘッダーの色が変わっています。
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 のコードにこれを追記して、
選択が解除された状態で表示されます。
今回は以上です。次は再読込かなーと思っています。
2件のコメント
visualstudio2019にてMicrosoft SQL Serverでデータベースアプリを作っていますが
任意のテーブルにいてプライマリーキーが設定されているカラム名を取得する方法を探していて
このページに行きつきました。
私の環境下では、このページに記載されているコードはエラーとなりました。
プライマリーキーが設定されているカラム名の取得についてよい方法があれば
お手数ですがご教示いただければ助かります。
みやさん、コメントありがとうございます。
この連載記事は対象DBがAccessなのでSQLServer用に記述を直す必要があります。また、第1回の記事からの続きですので、このページに記載されている情報だけでは動きません。
第1回&第2回の記事のとおりフォームとコードが出来ている前提で、VisualStudio2019&SQLServer2019で試してみました。以下のように
DBtable.vb
を修正するとカラム名が取得できましたので、お試しください。なお、この変更に伴いForm2.vb冒頭の、Accessのファイル名を設定する
Private Const FILE_NAME As String = "C:\test.accdb"
の記述が不要になり、それにまつわる変数fileName
周りも不要になるのですが書き出すとキリがないのでそのあたりは省略させていだきます。コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。