Entity Framework Core で SQLパラメーターを利用してSQLを実行する - C#

Entity Framework Core で SQLパラメーターを利用してSQLを実行するコードを紹介します。

概要

こちらの記事では、Entity Framework Core でSQL文を実行するコードを紹介しました。 実行するSQL文中の値が変化する場合には、SQL文の文字列を成型する方法ではなく、SQLパラメーターを利用したほうが、SQLインジェクション対策ができ安全です。
この記事では、Entity Framework Core で SqlParameterオブジェクトを利用して、SQLパラメーターを利用するコードを紹介します。

事前準備

データベースとテーブルを作成し、レコードを挿入します。以下の記事を参照してください。

プログラム例

UI

下図のフォームを作成します。

コード

下記コードを記述します。
MyDbContext.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;

namespace EntityFrameworkCoreExecuteSql
{
  public class MyDbContext : DbContext
  {
    public DbSet<MyTable1Rec> MyTable1 { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
      options.UseSqlServer("Data Source=192.168.64.48;Initial Catalog=iPentecSandBox3;User ID=sa;Password=adelieC#8851SQL;Encrypt=False");

    }
  }
}
MyTable1Rec.cs
using System;

namespace EntityFrameworkCoreExecuteSql
{
  public class MyTable1Rec
  {
    public int id { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }
    public string Code { get; set; }
    public int Price { get; set; }
  }
}
FormMain.cs (フォームのコード)
using System.Data;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;

namespace EntityFrameworkCoreExecuteSql
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
      MyDbContext mdc = new MyDbContext();
      IQueryable<MyTable1Rec> result = mdc.MyTable1.FromSql($"select * from MyTable1");

      foreach (MyTable1Rec r in result) {
        textBox1.Text += string.Format("{0:d} : {1}, {2}, {3:d}\r\n",r.id, r.Name, r.Code, r.Price);
      }
    }

    private void button2_Click(object sender, EventArgs e)
    {
      //SqlParameter param = new SqlParameter("param", "100");
      SqlParameter param = new SqlParameter("param", SqlDbType.Int);
      param.Value = 100;

      MyDbContext mdc = new MyDbContext();
      IQueryable<MyTable1Rec> result = mdc.MyTable1.FromSql($"select * from MyTable1 where price > {param}");

      foreach (MyTable1Rec r in result) {
        textBox1.Text += string.Format("{0:d} : {1}, {2}, {3:d}\r\n", r.id, r.Name, r.Code, r.Price);
      }

    }
  }
}

解説

DbContextやEntity Framework Core の動作についてはこちらの記事を参照してください。

button1

SQLパラメーターを利用しない場合のSQL実行コードです。
Entity Framework Core でのSQL文の実行についてはこちらの記事も参照してください。
  MyDbContext mdc = new MyDbContext();
  IQueryable<MyTable1Rec> result = mdc.MyTable1.FromSql($"select * from MyTable1");

  foreach (MyTable1Rec r in result) {
    textBox1.Text += string.Format("{0:d} : {1}, {2}, {3:d}\r\n",r.id, r.Name, r.Code, r.Price);
  }

button2

SqlParameterオブジェクトを作成します。コンストラクタにパラメーター名、フィールドの型名、パラメーター値を指定します。
SqlParameterオブジェクトの変数名とパラメーター名は一致させる必要があります。
  SqlParameter param = new SqlParameter("param", SqlDbType.Int);
  param.Value = 100;

なお、SqlParameterは型名を指定しない方法でも作成できます。
  SqlParameter param = new SqlParameter("param", "100");

データベースコンテキストを作成します。
  MyDbContext mdc = new MyDbContext();

SQL文を実行します。パラメーター部分は{(パラメーター変数名)}の書式で記述します。
  IQueryable<MyTable1Rec> result = mdc.MyTable1.FromSql($"select * from MyTable1 where price > {param}");

結果のレコードをテキストボックスに表示します。
  foreach (MyTable1Rec r in result) {
    textBox1.Text += string.Format("{0:d} : {1}, {2}, {3:d}\r\n", r.id, r.Name, r.Code, r.Price);
  }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。パラメーターの無いSQL文が実行され、すべてのレコードの値がテキストボックスに表示されます。


[button2]をクリックします。条件式とパラメーターが設定されているSQL文が実行されます。price の値が 100より大きいレコードがテキストボックスに表示されます。


SQLパラメータを利用したSQL文を実行できました。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2022-12-01
作成日: 2022-11-30
iPentec all rights reserverd.