【C#】Accessに接続してデータを取得する方法（SQLインジェクション対策も）

 # 環境
Windows10 22H2 OSビルド 19045.2728
Visual Studio Community 2019
C# 7.3
.NET Framework 4.7.2
Microsoft Access for Microsoft 365 MSO (バージョン 2303 ビルド 16.0.16227.20038) 32 ビット 

# 本題
データ取得に必要なオブジェクトを初期化します。
```C#
private OleDbConnection connection = new OleDbConnection();    // データベース接続用オブジェクト
private OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); // テーブル操作実行用オブジェクト
private OleDbCommand command = new OleDbCommand();             // クエリ格納用オブジェクト
```

接続文字列を格納し、Accessに接続します。
Provider：必要に応じてインストールが必要になります
Data Source：データファイルへの絶対パスを指定します
```C#
// データベースをオープン
connection.ConnectionString = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\\Data\\Database1.accdb";
connection.Open();
```
クエリ、及び接続用オブジェクトをクエリ用オブジェクトに格納します。
SQLインジェクション対策として、入力を受け付ける文字列（txtDepartment.Text）は、直接結合はせずにパラメータとしてクエリ格納用オブジェクトに渡します。
その後、Fillメソッドを呼びだし、引数のDataTableに実行結果が格納されます。
```C#
string sql = "SELECT * FROM Employees WHERE Department = @Department";
command.CommandText = sql;
command.Connection = connection;

// SQLインジェクション対策
command.Parameters.Clear();
command.Parameters.AddWithValue("@Department", txtDepartment.Text);

dataAdapter.SelectCommand = command;

// 実行
dataAdapter.Fill(dataTable);
```

# 使用例
Employeesテーブルに対して、部署名で検索を行い合致するレコードを取得・表示するWindowsフォームアプリケーションです。
## 動作確認用テーブル
![Employeesテーブル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/a4f59740-92b6-675e-d9aa-2893461779e7.png)

## コード
```C#:SelectAllWhereDepartment.cs
using System;
using System.Data;
using System.Windows.Forms;
using System.Data.OleDb;

namespace Access
{
    public partial class SelectAllWhereDepartment : Form
    {
        private OleDbConnection connection = new OleDbConnection();    // データベース接続用オブジェクト
        private OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); // テーブル操作実行用オブジェクト
        private OleDbCommand command = new OleDbCommand();             // クエリ格納用オブジェクト

        private DataTable dataTable = new DataTable();

        public SelectAllWhereDepartment()
        {
            InitializeComponent();
            InitDB();
        }

        private void InitDB()
        {
            // データベースをオープン
            connection.ConnectionString = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\\Data\\Database1.accdb";
            connection.Open();
        }

        private void btnSearch_Click(object sender, EventArgs e)
        {
            // 直前の取得結果をクリア
            dataGridViewEmployees.Rows.Clear();
            dataTable.Clear();

            string sql = "SELECT * FROM Employees WHERE Department = @Department";
            command.CommandText = sql;
            command.Connection = connection;

            // SQLインジェクション対策
            command.Parameters.Clear();
            command.Parameters.AddWithValue("@Department", txtDepartment.Text);

            dataAdapter.SelectCommand = command;

            // 実行
            dataAdapter.Fill(dataTable);

            // 取得結果表示
            foreach (DataRow dr in dataTable.Rows)
            {
                dataGridViewEmployees.Rows.Add(dr.ItemArray[0], dr.ItemArray[1], dr.ItemArray[2], dr.ItemArray[3]);
            }
            
        }      

        private void SelectAllWhereDepartment_FormClosing(object sender, FormClosingEventArgs e)
        {
            // データベースをクローズ
            connection.Close();
        }
    }
}
```

## 実行結果
![取得結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/3827b0a5-2247-806b-c04c-2a81e29a74ea.png)