CRUD (Create, Read, Update, Delete)
ตัวอย่างการเขียนโปรแกรม CRUD จัดการข้อมูลพนักงานด้วย ASP.NET Core และ Entity Framework (EF) Core, .NET 8 Framework, C# (C-Sharp)
CRUD (Create, Read, Update, Delete)
CRUD คืออะไร และมาตราฐาน CRUD สำหรับการเขียนโปรแกรม คืออะไร
CRUD ย่อมาจาก Create, Read, Update, Delete เป็นมาตราฐานที่ใช้ในการเขียนโปรแกรมสำหรับจัดการข้อมูล การเขียนโปรแกรมแบบ CRUD นั้น ยังมักใช้กับระบบฐานข้อมูลต่างๆ อีกด้วย เช่น SQL Server, MySQL, PostgreSQL, MongoDB เป็นต้น มาตราฐาน CRUD นี้ประกอบไปด้วย 4 ฟังก์ชั่นหลัก ดังนี้
- Create (สร้าง) คือ การเพิ่มข้อมูลใหม่เข้าสู่ระบบ
- Read (อ่าน) คือ การดึงข้อมูลจากระบบ
- Update (อัปเดต) คือ การแก้ไขข้อมูลที่มีอยู่
- Delete (ลบ) คือ การลบข้อมูลออกจากระบบ
ตัวอย่างการเขียนโปรแกรม CRUD จัดการข้อมูลพนักงานด้วย ASP.NET Core และ Entity Framework (EF) Core, .NET 8 Framework, C# (C-Sharp)
1. ออกแบบฐานข้อมูล สร้างตาราง "Employees" ที่มีคอลัมน์ต่อไปนี้
Id (int, Primary Key) ,FirstName (nvarchar) ,LastName (nvarchar) ,Email (nvarchar) ,PhoneNumber (nvarchar) ,Department (nvarchar)
CREATE TABLE Employees (
EmployeeId INT PRIMARY KEY,
FirstName NVARCHAR(255),
LastName NVARCHAR(255),
Email NVARCHAR(255),
PhoneNumber NVARCHAR(255),
Department NVARCHAR(255)
);
public class Employee
{
public int EmployeeId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
public string Department { get; set; }
}
using Microsoft.EntityFrameworkCore;
public class AppDbContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}
}
{
"ConnectionStrings": {
"DefaultConnection": "Server=YourServer\\mssqllocaldb;Database=YourDatabaseName;Trusted_Connection=True;MultipleActiveResultSets=true"
},
}
using Microsoft.EntityFrameworkCore;
// Add services to the container.
builder.Services.AddDbContext<AppDbContext>(
options => options.UseSqlServer("name=ConnectionStrings:DefaultConnection"));
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Linq;
using System.Threading.Tasks;
public class EmployeesController : Controller
{
private readonly AppDbContext _context;
public EmployeesController(AppDbContext context)
{
_context = context;
}
public async Task<IActionResult> Index()
{
var employees = await _context.Employees.ToListAsync();
return View(employees);
}
public IActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("EmployeeId,FirstName,LastName,Email,PhoneNumber,Department")] Employee employee)
{
if (ModelState.IsValid)
{
_context.Add(employee);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(employee);
}
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var employee = await _context.Employees.FindAsync(id);
if (employee == null)
{
return NotFound();
}
return View(employee);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("EmployeeId,FirstName,LastName,Email,PhoneNumber,Department")] Employee employee)
{
if (id != employee.EmployeeId)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(employee);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
.if (!EmployeeExists(employee.EmployeeId))
{
.return NotFound();
}
.else
{
.throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(employee);
}
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var employee = await _context.Employees
.FirstOrDefaultAsync(m => m.EmployeeId == id);
if (employee == null)
{
return NotFound();
}
return View(employee);
}
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var employee = await _context.Employees
.FirstOrDefaultAsync(m => m.EmployeeId == id);
if (employee == null)
{
return NotFound();
}
return View(employee);
}
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var employee = await _context.Employees.FindAsync(id);
_context.Employees.Remove(employee);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
private bool EmployeeExists(int id)
{
return _context.Employees.Any(e => e.EmployeeId == id);
}
}
จากตัวอย่างโปรแกรมทั้งหมดนี้จะทำให้ได้ระบบ CRUD พนักงานพร้อมกับการจัดการฐาน โดยจะสามารถ สร้าง Views สำหรับแสดงรายการพนักงาน (Index, Create, Edit, Details, Delete) ภายใน Views/Employees โดยใช้ Razor View Engine
สำหรับการจัดการใช้ฟังก์ชันต่าง ๆ ของโปรแกรมเพื่อคืนค่าการตอบกลับที่เหมาะสมตามสถานการณ์ต่างๆ จาก ตัวอย่างฟังก์ชันที่ใช้ ได้แก่
- BadRequest() = "400 Bad Request"
- NotFound() = "404 Not Found"
- NoContent() = "204 No Content"
โดยการใช้ฟังก์ชันเหล่านี้จะช่วยให้โปรแกรมสามารถสื่อสารสถานะของการดำเนินการได้เป็นอย่างดี ไม่ว่าจะเป็นการบันทึกข้อมูล, ค้นหาข้อมูล, หรือลบข้อมูล