5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2023-03-21

環境

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フォームアプリケーションです。

動作確認用テーブル

Employeesテーブル.png

コード

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

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?