Entity Framework Core で SQLパラメーターを利用してSQLを実行するコードを紹介します。
概要
こちらの記事では、Entity Framework Core でSQL文を実行するコードを紹介しました。
実行するSQL文中の値が変化する場合には、SQL文の文字列を成型する方法ではなく、SQLパラメーターを利用したほうが、SQLインジェクション対策ができ安全です。
この記事では、Entity Framework Core で SqlParameterオブジェクトを利用して、SQLパラメーターを利用するコードを紹介します。
事前準備
データベースとテーブルを作成し、レコードを挿入します。以下の記事を参照してください。
プログラム例
UI
下図のフォームを作成します。
コード
下記コードを記述します。
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");
}
}
}
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; }
}
}
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