環境
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 ビット
本題
データ取得に必要なオブジェクトを初期化します。
private OleDbConnection connection = new OleDbConnection(); // データベース接続用オブジェクト
private OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); // テーブル操作実行用オブジェクト
private OleDbCommand command = new OleDbCommand(); // クエリ格納用オブジェクト
接続文字列を格納し、Accessに接続します。
Provider:必要に応じてインストールが必要になります
Data Source:データファイルへの絶対パスを指定します
// データベースをオープン
connection.ConnectionString = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\\Data\\Database1.accdb";
connection.Open();
クエリ、及び接続用オブジェクトをクエリ用オブジェクトに格納します。
SQLインジェクション対策として、入力を受け付ける文字列(txtDepartment.Text)は、直接結合はせずにパラメータとしてクエリ格納用オブジェクトに渡します。
その後、Fillメソッドを呼びだし、引数のDataTableに実行結果が格納されます。
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フォームアプリケーションです。
動作確認用テーブル
コード
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();
}
}
}