Pada tutorial kali ini akan dibahas bagaimana cara mengintegrasikan ASP.NET Core Minimal API dengan ADO.NET.
Untuk database yang akan digunakan pada tutorial ini adalah SQL Server Express / Azure Edge dan Azure Data Studio sebagai management tools-nya.
Menyiapkan Database & Table
Pertama buat database dengan nama CatalogDb, kemudian buat table Categories.
CREATE TABLE [dbo].[Categories](
[CategoryID] [int] IDENTITY(1,1) NOT NULL,
[CategoryName] [varchar](255) NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Categories] ADD CONSTRAINT [PK_Categories] PRIMARY KEY CLUSTERED
(
[CategoryID] ASC
)
Kemudian tambahkan seeding data contoh agar dapat digunakan untuk mencoba menampilkan data Categories.

Membuat Project Minimal API
Langkah selanjutnya adalah membuat project Minimal API, anda dapat menggunakan VS Code atau VS 2022 Community. Pada tutorial ini akan digunakan Visual Studio Code dengan tambahan extension C# Dev Kit. Untuk mempelajari cara penggunaannya anda dapat mengikuti tutorial berikut.
Buat project web api dengan nama CatalogServices. kemudian tambahkan folder Models dan folder DAL pada project.

Pada folder Models tambahkan class Category.cs yang propertynya sama dengan field yang ada pada table Categories. Class ini akan digunakan untuk menampung data yang diambil dari table Categories.
namespace CatalogServices.Models
{
public class Category
{
public int CategoryID { get; set; }
public string? CategoryName { get; set; }
}
}
Untuk koneksi ke database menggunakan ADO.NET dibutuhkan library System.Data.SqlClient yang dapat diunduh dari NuGET package manager. Pada VS Code anda dapat menggunakan NeGET Gallery plugin untuk menambahkan library yang dibutuhkan.

Kemudian pada folder DAL, tambahkan folder dengan nama Interfaces, dan tambahkan interface ICategory. Interface tersebut akan berisi method-method yang akan digunakan untuk kebutuhan CRUD.
public interface ICategory
{
IEnumerable<Category> GetAll();
Category GetById(int id);
void Insert(T obj);
void Update(T obj);
void Delete(int id);
IEnumerable<Category> GetByName(string name);
}
Pada appsettings.json tambahkan connection string untuk dapat terkoneksi dengan database SQL Server.
"ConnectionStrings": {
"DefaultConnection": "Data Source=.\\SQLEXPRESS;Initial Catalog=CatalogDb;Integrated Security=True"
}
Pada folder DAL tambahkan class dengan nama CategoryDAL yang akan mengimplementasikan interface ICategory. Implementasikan method yang sudah dibuat.
Tambahkan method berikut untuk mengambil connection string yang sudah dibuat pada file konfigurasi
private readonly IConfiguration _config;
public CatagoryDAL(IConfiguration config)
{
_config = config;
}
private string GetConnectionString()
{
return _config.GetConnectionString("DefaultConnection");
}
Method GET untuk menampilkan semua data
Berikut kode implementasi untuk menampilkan semua data Category.
public IEnumerable<Category> GetAll()
{
List<Category> categories = new List<Category>();
using (SqlConnection conn = new SqlConnection(GetConnectionString()))
{
var strSql = @"SELECT * FROM Categories order by CategoryName";
SqlCommand cmd = new SqlCommand(strSql, conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
while (dr.Read())
{
Category category = new Category();
category.CategoryID = Convert.ToInt32(dr["CategoryID"]);
category.CategoryName = dr["CategoryName"].ToString();
categories.Add(category);
}
}
dr.Close();
cmd.Dispose();
conn.Close();
return categories;
}
}
Kemudian pada file Program.cs tambahkan kode berikut untuk menambahkan method GET untuk menampilkan semua data Category.
//meregister service yang akan digunakan dengan DI
builder.Services.AddScoped<ICategory, CatagoryDAL>();
app.MapGet("/api/categories", (ICategory categoryDal) =>
{
var categories = categoryDal.GetAll();
return Results.Ok(categories);
});
Jalankan aplikasi dan test hasilnya, anda dapat menggunakan tools untuk test REST API seperti POSTMAN, atau anda dapat menggunakan swagger UI (library bawaan template asp.net web api).

Menambahkan Method GetById
Berikut kode untuk implementasi method GetById pada CategoryDAL.cs
public Category GetById(int id)
{
Category category = new Category();
using (SqlConnection conn = new SqlConnection(GetConnectionString()))
{
var strSql = @"SELECT * FROM Categories
WHERE CategoryID = @CategoryID";
SqlCommand cmd = new SqlCommand(strSql, conn);
cmd.Parameters.AddWithValue("@CategoryID", id);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
dr.Read();
category.CategoryID = Convert.ToInt32(dr["CategoryID"]);
category.CategoryName = dr["CategoryName"].ToString();
}
dr.Close();
cmd.Dispose();
conn.Close();
return category;
}
}
Kemudian untuk membuat method Minimal API nya tambahkan kode berikut pada Program.cs
app.MapGet("/api/categories/{id}", (ICategory categoryDal, int id) =>
{
var category = categoryDal.GetById(id);
if (category == null)
{
return Results.NotFound();
}
return Results.Ok(category);
});
Untuk test method GetById pada swagger

Menambahkan Method POST untuk Insert Data
Berikut implemntasi untuk method insert pada CategoryDAL.cs
public void Insert(Category obj)
{
using (SqlConnection conn = new SqlConnection(GetConnectionString()))
{
var strSql = @"INSERT INTO Categories (CategoryName) VALUES (@CategoryName)";
SqlCommand cmd = new SqlCommand(strSql, conn);
cmd.Parameters.AddWithValue("@CategoryName", obj.CategoryName);
try
{
conn.Open();
var result = cmd.ExecuteNonQuery();
if (result != 1)
{
throw new ArgumentException("Data gagal disimpan");
}
}
catch (SqlException sqlEx)
{
throw new ArgumentException($"Error: {sqlEx.Message} - {sqlEx.Number}");
}
catch (Exception ex)
{
throw new ArgumentException($"Error: {ex.Message}");
}
finally
{
cmd.Dispose();
conn.Close();
}
}
}
Kemudian untuk membuat method POST tambahkan kode berikut pada Program.cs
app.MapPost("/api/categories", (ICategory categoryDal, Category category) =>
{
try
{
categoryDal.Insert(category);
return Results.OK();
}
catch (Exception ex)
{
return Results.BadRequest(ex.Message);
}
});
Test method insert pada swagger UI:

Jika berhasil, akan mengembalikan return status 200 OK.
Menambahkan Method PUT untuk Update Data
Berikut implementasi method edit pada CategoryDAL.cs
public void Update(Category obj)
{
using (SqlConnection conn = new SqlConnection(GetConnectionString()))
{
var strSql = @"UPDATE Categories SET CategoryName = @CategoryName
WHERE CategoryID = @CategoryID";
SqlCommand cmd = new SqlCommand(strSql, conn);
cmd.Parameters.AddWithValue("@CategoryName", obj.CategoryName);
cmd.Parameters.AddWithValue("@CategoryID", obj.CategoryID);
try
{
conn.Open();
var result = cmd.ExecuteNonQuery();
if (result != 1)
{
throw new ArgumentException("Data gagal diupdate");
}
}
catch (SqlException sqlEx)
{
throw new ArgumentException($"Error: {sqlEx.Message} - {sqlEx.Number}");
}
catch (Exception ex)
{
throw new ArgumentException($"Error: {ex.Message}");
}
finally
{
cmd.Dispose();
conn.Close();
}
}
}
Tambahkan method PUT pada Program.cs
app.MapPut("/api/categories", (ICategory categoryDal, Category category) =>
{
try
{
categoryDal.Update(category);
return Results.Ok();
}
catch (Exception ex)
{
return Results.BadRequest(ex.Message);
}
});
Test pada swagger UI:

Menambahkan Method DELETE untuk Delete Data
Berikut implementasi untuk method delete pada CategoryDAL.cs
public void Delete(int id)
{
using (SqlConnection conn = new SqlConnection(GetConnectionString()))
{
var strSql = @"DELETE FROM Categories
WHERE CategoryID = @CategoryID";
SqlCommand cmd = new SqlCommand(strSql, conn);
cmd.Parameters.AddWithValue("@CategoryID", id);
try
{
conn.Open();
var result = cmd.ExecuteNonQuery();
if (result != 1)
{
throw new ArgumentException("Data gagal dihapus");
}
}
catch (SqlException sqlEx)
{
throw new ArgumentException($"Error: {sqlEx.Message} - {sqlEx.Number}");
}
catch (Exception ex)
{
throw new ArgumentException($"Error: {ex.Message}");
}
finally
{
cmd.Dispose();
conn.Close();
}
}
}
Tambahkan method DELETE pada Program.cs
app.MapDelete("/api/categories/{id}", (ICategory categoryDal, int id) =>
{
try
{
categoryDal.Delete(id);
return Results.Ok();
}
catch (Exception ex)
{
return Results.BadRequest(ex.Message);
}
});
Test pada swagger UI:

Leave a comment