Subbab 8 / 9

Koneksi Database Berbasis OOP dengan C# dan PostgreSQL

1. Persiapan

1.1 Buat Database dan Tabel

Jalankan di pgAdmin (Query Tool) atau psql:

sql
1
CREATE DATABASE praktikum_db;

Pilih database praktikum_db, lalu jalankan:

sql
1
2
3
4
5
6
CREATE TABLE mahasiswa (
    id SERIAL PRIMARY KEY,
    nim VARCHAR(10) NOT NULL UNIQUE,
    nama VARCHAR(100) NOT NULL,
    jurusan VARCHAR(50) NOT NULL
);

Keterangan:

  • SERIAL membuat kolom id terisi otomatis.
  • UNIQUE pada nim mencegah NIM yang sama masuk dua kali.


1.2 Buat Project di Visual Studio

  1. Buka Visual Studio, pilih Create a new project.
  2. Pilih template Console App (C#), lalu klik Next.
  3. Isi nama project PraktikumDb, lalu klik Next.
  4. Pilih framework .NET yang terpasang (misalnya .NET 8), lalu klik Create.

1.3 Install Npgsql dengan NuGet

  1. Di Solution Explorer, klik kanan project PraktikumDb, pilih Manage NuGet Packages....
  2. Buka tab Browse, lalu ketik Npgsql pada kolom pencarian.
  3. Pilih paket Npgsql, lalu klik Install.
  4. Klik OK pada jendela Preview Changes dan I Accept pada License Acceptance.

Cara alternatif lewat Tools > NuGet Package Manager > Package Manager Console:

bash
1
Install-Package Npgsql

Keterangan:

  • Npgsql adalah driver agar C# dapat berkomunikasi dengan PostgreSQL.
  • Pastikan Npgsql muncul di Dependencies > Packages pada Solution Explorer. Jika sudah muncul, instalasi berhasil.

2. Class DatabaseConnection

Komponen Npgsql yang dipakai:

Class

Fungsi

NpgsqlConnection

Membuka koneksi ke database

NpgsqlCommand

Menjalankan perintah SQL

NpgsqlDataReader

Membaca hasil SELECT baris per baris

Tambahkan class baru: klik kanan project, pilih Add > Class..., beri nama DatabaseConnection.cs.

csharp
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
using Npgsql;

public class DatabaseConnection
{
    private readonly string _connectionString;

    public DatabaseConnection(string host, int port, string database, string username, string password)
    {
        _connectionString = $"Host={host};Port={port};Database={database};Username={username};Password={password}";
    }

    public NpgsqlConnection CreateConnection()
    {
        return new NpgsqlConnection(_connectionString);
    }

    public bool TestConnection()
    {
        try
        {
            using var conn = CreateConnection();
            conn.Open();
            return true;
        }
        catch (NpgsqlException ex)
        {
            Console.WriteLine($"Gagal terhubung: {ex.Message}");
            return false;
        }
    }
}

Keterangan:

  • _connectionString bersifat private (encapsulation), sehingga data koneksi tidak bisa diakses langsung dari luar class.
  • Port bawaan PostgreSQL adalah 5432. Sesuaikan jika instalasi Anda berbeda.
  • CreateConnection() membuat objek koneksi baru setiap dipanggil.
  • TestConnection() mencoba membuka koneksi, lalu mengembalikan true jika berhasil dan false jika gagal.
  • using var menutup koneksi otomatis setelah selesai dipakai.

Uji koneksi di Program.cs:

csharp
1
2
3
4
5
6
var db = new DatabaseConnection("localhost", 5432, "praktikum_db", "postgres", "password_anda");

if (db.TestConnection())
{
    Console.WriteLine("Koneksi berhasil!");
}

Keterangan:

  • Ganti password_anda dengan password PostgreSQL masing-masing.
  • Jalankan dengan Ctrl + F5. Jika tampil "Koneksi berhasil!", lanjut ke langkah berikutnya.

3. Uji Query Dasar

Buat class baru MahasiswaQuery.cs untuk menampung query. Class ini menerima DatabaseConnection lewat constructor.

csharp
1
2
3
4
5
6
7
8
9
10
11
using Npgsql;

public class MahasiswaQuery
{
    private readonly DatabaseConnection _db;

    public MahasiswaQuery(DatabaseConnection db)
    {
        _db = db;
    }
}

Keterangan:

  • Koneksi dibuat di luar lalu dikirim ke class ini, sehingga satu DatabaseConnection bisa dipakai oleh banyak class.
  • Method pada langkah 3.1 sampai 3.5 ditambahkan di dalam class MahasiswaQuery.

Pola setiap query:

Buka koneksi, buat command, isi parameter, jalankan.

3.1 INSERT

csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void Insert(string nim, string nama, string jurusan)
{
    using var conn = _db.CreateConnection();
    conn.Open();

    string sql = "INSERT INTO mahasiswa (nim, nama, jurusan) VALUES (@nim, @nama, @jurusan)";
    using var cmd = new NpgsqlCommand(sql, conn);
    cmd.Parameters.AddWithValue("nim", nim);
    cmd.Parameters.AddWithValue("nama", nama);
    cmd.Parameters.AddWithValue("jurusan", jurusan);

    int rows = cmd.ExecuteNonQuery();
    Console.WriteLine($"{rows} data ditambahkan.");
}

Keterangan:

  • @nim, @nama, @jurusan adalah parameter. Nilainya diisi lewat Parameters.AddWithValue().
  • Parameter wajib dipakai agar aman dari SQL Injection. Jangan menggabungkan input langsung ke string SQL.
  • ExecuteNonQuery() dipakai untuk INSERT, UPDATE, dan DELETE. Nilai kembaliannya adalah jumlah baris yang terpengaruh.

3.2 SELECT

csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void SelectAll()
{
    using var conn = _db.CreateConnection();
    conn.Open();

    string sql = "SELECT id, nim, nama, jurusan FROM mahasiswa ORDER BY id";
    using var cmd = new NpgsqlCommand(sql, conn);
    using var reader = cmd.ExecuteReader();

    while (reader.Read())
    {
        Console.WriteLine($"{reader.GetInt32(0)} | {reader.GetString(1)} | {reader.GetString(2)} | {reader.GetString(3)}");
    }
}

Keterangan:

  • ExecuteReader() dipakai untuk SELECT.
  • reader.Read() maju ke baris berikutnya dan bernilai false jika data habis.
  • Angka pada GetString(1) adalah urutan kolom pada query SELECT (dimulai dari 0).

3.3 UPDATE

csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
public void Update(string nim, string namaBaru)
{
    using var conn = _db.CreateConnection();
    conn.Open();

    string sql = "UPDATE mahasiswa SET nama = @nama WHERE nim = @nim";
    using var cmd = new NpgsqlCommand(sql, conn);
    cmd.Parameters.AddWithValue("nama", namaBaru);
    cmd.Parameters.AddWithValue("nim", nim);

    int rows = cmd.ExecuteNonQuery();
    Console.WriteLine($"{rows} data diubah.");
}

Keterangan:

  • Klausa WHERE menentukan data mana yang diubah. Tanpa WHERE, semua baris ikut berubah.
  • Jika NIM tidak ditemukan, hasilnya 0 data diubah.

3.4 DELETE

csharp
1
2
3
4
5
6
7
8
9
10
11
12
public void Delete(string nim)
{
    using var conn = _db.CreateConnection();
    conn.Open();

    string sql = "DELETE FROM mahasiswa WHERE nim = @nim";
    using var cmd = new NpgsqlCommand(sql, conn);
    cmd.Parameters.AddWithValue("nim", nim);

    int rows = cmd.ExecuteNonQuery();
    Console.WriteLine($"{rows} data dihapus.");
}

Keterangan:

  • Sama seperti UPDATE, selalu sertakan WHERE agar tidak menghapus seluruh data.

3.5 COUNT (Satu Nilai)

csharp
1
2
3
4
5
6
7
8
public long Count()
{
    using var conn = _db.CreateConnection();
    conn.Open();

    using var cmd = new NpgsqlCommand("SELECT COUNT(*) FROM mahasiswa", conn);
    return (long)cmd.ExecuteScalar()!;
}

Keterangan:

  • ExecuteScalar() dipakai jika hasil query hanya satu nilai, misalnya COUNT.
  • COUNT(*) di PostgreSQL bertipe bigint, sehingga dikonversi ke long.

4. Menjalankan Program

Edit Program.cs:

csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var db = new DatabaseConnection("localhost", 5432, "praktikum_db", "postgres", "password_anda");

if (!db.TestConnection())
{
    return;
}

Console.WriteLine("Koneksi berhasil!");

var query = new MahasiswaQuery(db);

query.Insert("2024001", "Budi", "Informatika");
query.Insert("2024002", "Sari", "Sistem Informasi");
query.SelectAll();

query.Update("2024001", "Budi Santoso");
query.SelectAll();

query.Delete("2024002");
query.SelectAll();

Console.WriteLine($"Jumlah data: {query.Count()}");

Keterangan:

  • Program berhenti jika koneksi gagal, dan hanya lanjut jika koneksi berhasil.
  • Jalankan dengan Ctrl + F5, lalu cocokkan hasilnya dengan tabel mahasiswa di pgAdmin.

Contoh output:

bash
1
2
3
4
5
6
7
8
9
10
11
Koneksi berhasil!
1 data ditambahkan.
1 data ditambahkan.
1 | 2024001 | Budi | Informatika
2 | 2024002 | Sari | Sistem Informasi
1 data diubah.
1 | 2024001 | Budi Santoso | Informatika
2 | 2024002 | Sari | Sistem Informasi
1 data dihapus.
1 | 2024001 | Budi Santoso | Informatika
Jumlah data: 1

Jika program dijalankan dua kali, Insert gagal karena NIM 2024001 sudah ada. Kosongkan tabel dulu dengan DELETE FROM mahasiswa; di pgAdmin.

Error Umum

Pesan error

Penyebab

Solusi

password authentication failed

Password salah

Periksa password user postgres

Failed to connect / connection refused

Service PostgreSQL mati atau port salah

Jalankan service PostgreSQL, cek port

relation "mahasiswa" does not exist

Tabel belum dibuat di database tersebut

Jalankan CREATE TABLE di praktikum_db

duplicate key value violates unique constraint

NIM sudah ada

Ganti NIM atau hapus data lama

database "..." does not exist

Nama database salah

Samakan dengan nama di pgAdmin