.NET 8.0 の ASP.NET Core アプリ(MVC)から、Dapper + SQLite NuGetパッケージを使い、SQLiteデータベースにDB処理するサンプルを作成しました。ORマッピングの主流は Dapper。
ソースコードは GitHub で公開しています。
データベース
SQLiteの管理ツールは DB Browser for SQLite を使用。
使用したバージョンは 2024/10/29時点で最新の v3.13.1。
https://sqlitebrowser.org/blog/version-3-13-1-released/
DB Browser for SQLite で SQLiteのデータベースファイルを作成。
テーブル定義。
1 2 3 4 5 6 7 |
CREATE TABLE "USR" ( "Id" INTEGER, "Name" TEXT, PRIMARY KEY("Id") ); |
※SQliteのデータベースファイルをパスワードで暗号化する機能は System.Data.SQLiteが 1.0.114 以降のバージョンでは使えないらしい。
c# – ファイルまたはアセンブリ ‘System.Data.SQLite.SEE.License、バージョン =1.0.117.0 – スタック オーバーフローを読み込めませんでした
SQLiteのパスワード有りデータベースファイルへ接続するテストツール
ソースコード構成
今回使った Visual Studio プロジェクト テンプレートは、Visual Studio 2022 + .NET 8 + ASP.NET Core MVC、HTTPS無し。
NuGet パッケージ インストール
System.Data.SQLiteパッケージをインストール
使用したバージョンは 2024/10/29時点で最新の v1.0.119。
1 2 3 |
> Install-Package System.Data.SQLite |
Dapperパッケージをインストール
使用したバージョンは 2024/10/29時点で最新の v2.1.35。
1 2 3 |
> Install-Package Dapper |
ソースコード変更内容を解説
/WebApplication1/WebApplication1/appsettings.json
SQLiteのデータベースファイルに接続するコネクションストリングを追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "ConnectionStrings": { "DefaultConnection": "Data Source=.\\test.db;" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" } |
/WebApplication1/WebApplication1/Controllers/UsersController.cs
Userデータ処理用のコントローラーを追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
using Microsoft.AspNetCore.Mvc; using WebApplication1.Data; using WebApplication1.Models; namespace WebApplication1.Controllers { public class UsersController : Controller { private readonly UserRepository _userRepository; public UsersController(UserRepository userRepository) { _userRepository = userRepository; } public IActionResult Index() { var usrs = _userRepository.GetAllUsers(); return View("~/Views/Home/Index.cshtml", usrs); } public IActionResult Details(int id) { Usr? usr = _userRepository.GetUserById(id); if (usr == null) { return NotFound(); } return View(usr); } } } |
/WebApplication1/WebApplication1/Data/UserRepository.cs
SQLiteデータベースの USRテーブルに対する SQL処理を追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
using System.Collections.Generic; using System.Data.SQLite; using Microsoft.Extensions.Configuration; using Dapper; using WebApplication1.Models; namespace WebApplication1.Data { public class UserRepository { private readonly string? _connectionString; public UserRepository(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConnection"); } public IEnumerable<Usr> GetAllUsers() { using (var connection = new SQLiteConnection(_connectionString)) { connection.Open(); return connection.Query<Usr>("SELECT * FROM Usr;"); } } public Usr? GetUserById(int id) { using (var connection = new SQLiteConnection(_connectionString)) { connection.Open(); return connection.QueryFirstOrDefault<Usr>("SELECT * FROM Usr WHERE Id = @Id", new { Id = id }); } } public void AddUser(Usr user) { using (var connection = new SQLiteConnection(_connectionString)) { connection.Open(); connection.Execute("INSERT INTO Usr (Name, Age) VALUES (@Name, @Age)", user); } } public void UpdateUser(Usr user) { using (var connection = new SQLiteConnection(_connectionString)) { connection.Open(); connection.Execute("UPDATE Usr SET Name = @Name, Age = @Age WHERE Id = @Id", user); } } public void DeleteUser(int id) { using (var connection = new SQLiteConnection(_connectionString)) { connection.Open(); connection.Execute("DELETE FROM Usr WHERE Id = @Id", new { Id = id }); } } } } |
/WebApplication1/WebApplication1/Models/Usr.cs
SQLiteデータベースの USRテーブルに対応するデータクラスを追加。
1 2 3 4 5 6 7 8 9 10 |
namespace WebApplication1.Models { public class Usr { public int Id { get; set; } public string? Name { get; set; } } } |
/WebApplication1/WebApplication1/Program.cs
新規作成したコントローラーをアプリ起動時に登録する処理を追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using WebApplication1.Data; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllersWithViews(); builder.Services.AddScoped<UserRepository>(); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run(); |
/WebApplication1/WebApplication1/test.db
DB Browser for SQLiteで作成した SQLiteのデータベースファイル。
/WebApplication1/WebApplication1/Views/Home/Index.cshtml
SQLiteに対する SQL処理を実行するためのボタンをトップ画面に追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@{ ViewData["Title"] = "Home Page"; } <div class="text-center"> <h1 class="display-4">Welcome</h1> <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p> </div> <form asp-controller="Users" asp-action="Index" method="get"> <button type="submit">Show Users</button> </form> |
/WebApplication1/WebApplication1/WebApplication1.csproj
NuGetパッケージと SQLiteのデータベースファイルが追加されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> <ItemGroup> <PackageReference Include="Dapper" Version="2.1.35" /> <PackageReference Include="System.Data.SQLite" Version="1.0.119" /> </ItemGroup> <ItemGroup> <None Update="EWise.db"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> </ItemGroup> </Project> |
コメント