Entity Framework を使うのがシンプルで安全です。
以下は Entity Framework (Code First / Database First どちらでも可) を想定した完全な例です。
using System;
using System.Linq;
using System.Data.Entity; // EF6の場合
using YourAppNamespace.Models; // KamokuモデルとDbContextの名前空間
public class KamokuController : Controller
{
// DbContext のインスタンス
private readonly ApplicationDbContext _context;
public KamokuController()
{
_context = new ApplicationDbContext();
}
/// <summary>
/// 指定された KamokuId の画像データを取得します。
/// </summary>
/// <param name="id">KamokuId</param>
/// <returns>画像のバイト配列。存在しない場合は null。</returns>
private byte[] GetImageFromDatabase(int id)
{
try
{
if (id <= 0)
return null; // 無効なIDは処理しない
// データベースから画像を取得
var kamoku = _context.Kamokus
.Where(k => k.KamokuId == id)
.Select(k => k.KamokuImage)
.FirstOrDefault();
return kamoku; // null の可能性あり
}
catch (Exception ex)
{
// ログ出力(例: NLog, Serilog, etc.)
System.Diagnostics.Debug.WriteLine($"DB取得エラー: {ex.Message}");
return null;
}
}
// 画像を返すアクション例
public ActionResult ShowImage(int id)
{
var imageData = GetImageFromDatabase(id);
if (imageData == null)
return HttpNotFound();
return File(imageData, "image/jpeg"); // 画像形式に応じて変更
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
_context.Dispose();
}
base.Dispose(disposing);
}
}
補足
DbContext 定義例
public class ApplicationDbContext : DbContext
{
public DbSet<Kamoku> Kamokus { get; set; }
}
public class Kamoku
{
public int KamokuId { get; set; }
public string KamokuName { get; set; }
public byte[] KamokuImage { get; set; }
}
ポイント
Select(k => k.KamokuImage) で必要な列だけ取得するため、無駄なデータを読み込まない。FirstOrDefault() で該当データがない場合は null を返す。- 例外処理を入れて安全に動作。
- 画像返却時は
File(byte[], contentType) を使う。
Powered by Froala Editor